2015-01-09 08:20:14 -08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include <config.h>
|
|
|
|
#endif
|
|
|
|
|
2016-04-20 13:07:53 -07:00
|
|
|
#include <Ecore.h>
|
2015-01-09 08:20:14 -08:00
|
|
|
#include "eldbus_model_connection_private.h"
|
|
|
|
#include "eldbus_model_private.h"
|
|
|
|
|
|
|
|
#define MY_CLASS ELDBUS_MODEL_CONNECTION_CLASS
|
|
|
|
#define MY_CLASS_NAME "Eldbus_Model_Connection"
|
|
|
|
|
|
|
|
static void _eldbus_model_connection_names_list_cb(void *, const Eldbus_Message *, Eldbus_Pending *);
|
|
|
|
|
2016-08-10 07:23:04 -07:00
|
|
|
static Efl_Object*
|
|
|
|
_eldbus_model_connection_efl_object_constructor(Eo *obj, Eldbus_Model_Connection_Data *pd)
|
2015-01-09 08:20:14 -08:00
|
|
|
{
|
2016-08-15 06:44:41 -07:00
|
|
|
obj = efl_constructor(efl_super(obj, MY_CLASS));
|
2015-01-09 08:20:14 -08:00
|
|
|
|
|
|
|
pd->obj = obj;
|
|
|
|
|
|
|
|
return obj;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2018-05-02 13:44:01 -07:00
|
|
|
_eldbus_model_connection_efl_object_invalidate(Eo *obj, Eldbus_Model_Connection_Data *pd)
|
2015-01-09 08:20:14 -08:00
|
|
|
{
|
2017-10-25 18:05:41 -07:00
|
|
|
Eldbus_Children_Slice_Promise *slice;
|
2015-01-09 08:20:14 -08:00
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
if (pd->pending) eldbus_pending_cancel(pd->pending);
|
2015-01-09 08:20:14 -08:00
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
EINA_LIST_FREE(pd->requests, slice)
|
2016-04-20 13:07:53 -07:00
|
|
|
{
|
2017-10-25 18:05:41 -07:00
|
|
|
eina_promise_reject(slice->p, EFL_MODEL_ERROR_UNKNOWN);
|
|
|
|
free(slice);
|
2016-04-20 13:07:53 -07:00
|
|
|
}
|
2015-01-09 08:20:14 -08:00
|
|
|
|
2018-05-02 13:44:01 -07:00
|
|
|
pd->childrens = eina_list_free(pd->childrens);
|
|
|
|
|
|
|
|
efl_invalidate(efl_super(obj, ELDBUS_MODEL_CONNECTION_CLASS));
|
2015-01-09 08:20:14 -08:00
|
|
|
}
|
|
|
|
|
2016-04-20 13:07:53 -07:00
|
|
|
static void
|
2017-10-25 18:05:41 -07:00
|
|
|
_eldbus_model_children_list(const Eo *obj, Eldbus_Model_Connection_Data *pd)
|
2015-01-09 08:20:14 -08:00
|
|
|
{
|
2017-10-25 18:05:41 -07:00
|
|
|
Eldbus_Model_Data *sd;
|
2015-01-09 08:20:14 -08:00
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
if (pd->pending || pd->is_listed) return ;
|
2016-04-20 13:07:53 -07:00
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
sd = efl_data_scope_get(obj, ELDBUS_MODEL_CLASS);
|
2016-06-16 17:50:37 -07:00
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
pd->pending = eldbus_names_list(sd->connection,
|
|
|
|
&_eldbus_model_connection_names_list_cb,
|
|
|
|
pd);
|
2015-01-09 08:20:14 -08:00
|
|
|
}
|
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
static Eina_Future *
|
|
|
|
_eldbus_model_connection_efl_model_children_slice_get(Eo *obj,
|
|
|
|
Eldbus_Model_Connection_Data *pd,
|
|
|
|
unsigned int start,
|
|
|
|
unsigned int count)
|
2015-01-09 08:20:14 -08:00
|
|
|
{
|
2017-10-25 18:05:41 -07:00
|
|
|
Eldbus_Children_Slice_Promise* slice;
|
|
|
|
Eina_Promise *p;
|
2015-01-09 08:20:14 -08:00
|
|
|
|
2016-04-20 13:07:53 -07:00
|
|
|
if (pd->is_listed)
|
|
|
|
{
|
2017-10-25 18:05:41 -07:00
|
|
|
Eina_Value v;
|
2015-01-09 08:20:14 -08:00
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
v = efl_model_list_value_get(pd->childrens, start, count);
|
2018-11-22 17:14:51 -08:00
|
|
|
return efl_loop_future_resolved(obj, v);
|
2016-04-20 13:07:53 -07:00
|
|
|
}
|
2015-01-09 08:20:14 -08:00
|
|
|
|
2019-01-04 17:42:26 -08:00
|
|
|
p = efl_loop_promise_new(obj);
|
2015-01-09 08:20:14 -08:00
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
slice = calloc(1, sizeof (Eldbus_Children_Slice_Promise));
|
|
|
|
slice->p = p;
|
|
|
|
slice->start = start;
|
|
|
|
slice->count = count;
|
2015-01-09 08:20:14 -08:00
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
pd->requests = eina_list_prepend(pd->requests, slice);
|
2015-01-09 08:20:14 -08:00
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
_eldbus_model_children_list(obj, pd);
|
2018-11-21 17:33:10 -08:00
|
|
|
return efl_future_then(obj, eina_future_new(p));;
|
2015-01-09 08:20:14 -08:00
|
|
|
}
|
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
static unsigned int
|
|
|
|
_eldbus_model_connection_efl_model_children_count_get(const Eo *obj,
|
|
|
|
Eldbus_Model_Connection_Data *pd)
|
2015-01-09 08:20:14 -08:00
|
|
|
{
|
2017-10-25 18:05:41 -07:00
|
|
|
_eldbus_model_children_list(obj, pd);
|
|
|
|
return eina_list_count(pd->childrens);
|
2015-01-09 08:20:14 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_eldbus_model_connection_names_list_cb(void *data,
|
|
|
|
const Eldbus_Message *msg,
|
2017-10-25 18:05:41 -07:00
|
|
|
Eldbus_Pending *pending EINA_UNUSED)
|
2015-01-09 08:20:14 -08:00
|
|
|
{
|
2017-10-25 18:05:41 -07:00
|
|
|
Eldbus_Model_Connection_Data *pd = (Eldbus_Model_Connection_Data*) data;
|
|
|
|
Eldbus_Model_Data *sd;
|
|
|
|
Eldbus_Children_Slice_Promise *slice;
|
2015-01-09 08:20:14 -08:00
|
|
|
const char *error_name, *error_text;
|
|
|
|
Eldbus_Message_Iter *array = NULL;
|
|
|
|
const char *bus;
|
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
pd->pending = NULL;
|
2015-01-09 08:20:14 -08:00
|
|
|
|
|
|
|
if (eldbus_message_error_get(msg, &error_name, &error_text))
|
|
|
|
{
|
|
|
|
ERR("%s: %s", error_name, error_text);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!eldbus_message_arguments_get(msg, "as", &array))
|
|
|
|
{
|
|
|
|
ERR("%s", "Error getting arguments.");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
sd = efl_data_scope_get(pd->obj, ELDBUS_MODEL_CLASS);
|
|
|
|
|
2015-01-09 08:20:14 -08:00
|
|
|
while (eldbus_message_iter_get_and_next(array, 's', &bus))
|
|
|
|
{
|
2017-10-25 18:05:41 -07:00
|
|
|
Eo *child;
|
|
|
|
|
2015-01-09 08:20:14 -08:00
|
|
|
DBG("(%p): bus = %s", pd->obj, bus);
|
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
child = efl_add(ELDBUS_MODEL_OBJECT_CLASS, pd->obj,
|
|
|
|
eldbus_model_connection_set(efl_added, sd->connection),
|
|
|
|
eldbus_model_object_bus_set(efl_added, bus),
|
|
|
|
eldbus_model_object_path_set(efl_added, "/"));
|
2015-01-09 08:20:14 -08:00
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
pd->childrens = eina_list_append(pd->childrens, child);
|
2015-01-09 08:20:14 -08:00
|
|
|
}
|
|
|
|
|
2016-04-20 13:07:53 -07:00
|
|
|
pd->is_listed = EINA_TRUE;
|
|
|
|
|
2018-04-12 14:41:54 -07:00
|
|
|
efl_event_callback_call(pd->obj, EFL_MODEL_EVENT_CHILDREN_COUNT_CHANGED, NULL);
|
2016-04-20 13:07:53 -07:00
|
|
|
|
2017-10-25 18:05:41 -07:00
|
|
|
EINA_LIST_FREE(pd->requests, slice)
|
2016-04-20 13:07:53 -07:00
|
|
|
{
|
2017-10-25 18:05:41 -07:00
|
|
|
Eina_Value v;
|
|
|
|
|
|
|
|
v = efl_model_list_value_get(pd->childrens,
|
|
|
|
slice->start, slice->count);
|
|
|
|
eina_promise_resolve(slice->p, v);
|
|
|
|
|
|
|
|
free(slice);
|
2016-04-20 13:07:53 -07:00
|
|
|
}
|
2015-01-09 08:20:14 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
#include "eldbus_model_connection.eo.c"
|