forked from enlightenment/efl
edbus: Append path of child objects in Introspectable
Patch by: José Roberto de Souza <zehortigoza@profusion.mobi> SVN revision: 79175
This commit is contained in:
parent
208ad94428
commit
fb26be4f1b
|
@ -61,6 +61,7 @@ struct _EDBus_Connection
|
||||||
Ecore_Idler *idler;
|
Ecore_Idler *idler;
|
||||||
Eina_Bool running_signal;
|
Eina_Bool running_signal;
|
||||||
EDBus_Connection_Context_Event event_handlers[EDBUS_CONNECTION_EVENT_LAST];
|
EDBus_Connection_Context_Event event_handlers[EDBUS_CONNECTION_EVENT_LAST];
|
||||||
|
Eina_Inlist *root_objs;//service_object
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _EDBus_Object
|
struct _EDBus_Object
|
||||||
|
@ -132,15 +133,19 @@ struct _EDBus_Message
|
||||||
EDBus_Message_Iter *iterator;
|
EDBus_Message_Iter *iterator;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _EDBus_Service_Object
|
typedef struct _EDBus_Service_Object EDBus_Service_Object;
|
||||||
|
struct _EDBus_Service_Object
|
||||||
{
|
{
|
||||||
|
EINA_INLIST;
|
||||||
EDBus_Connection *conn;
|
EDBus_Connection *conn;
|
||||||
const char *path;
|
const char *path;
|
||||||
Eina_Hash *interfaces;
|
Eina_Hash *interfaces;
|
||||||
Eina_Strbuf *introspection_data;
|
Eina_Strbuf *introspection_data;
|
||||||
Eina_Bool introspection_dirty;
|
Eina_Bool introspection_dirty;
|
||||||
Eina_Inlist *data;
|
Eina_Inlist *data;
|
||||||
} EDBus_Service_Object;
|
EDBus_Service_Object *parent;
|
||||||
|
Eina_Inlist *children;
|
||||||
|
};
|
||||||
|
|
||||||
struct _EDBus_Service_Interface
|
struct _EDBus_Service_Interface
|
||||||
{
|
{
|
||||||
|
|
|
@ -52,6 +52,7 @@ static DBusHandlerResult _object_handler(DBusConnection *conn, DBusMessage *mess
|
||||||
static void _object_free(EDBus_Service_Object *obj);
|
static void _object_free(EDBus_Service_Object *obj);
|
||||||
static void _interface_free(EDBus_Service_Interface *interface);
|
static void _interface_free(EDBus_Service_Interface *interface);
|
||||||
static void _on_connection_free(void *data, const void *dead_pointer);
|
static void _on_connection_free(void *data, const void *dead_pointer);
|
||||||
|
static EDBus_Service_Object *_edbus_service_object_parent_find(EDBus_Service_Object *obj);
|
||||||
|
|
||||||
static DBusObjectPathVTable vtable = {
|
static DBusObjectPathVTable vtable = {
|
||||||
_object_unregister,
|
_object_unregister,
|
||||||
|
@ -354,6 +355,7 @@ cb_introspect(const EDBus_Service_Interface *_iface, const EDBus_Message *messag
|
||||||
{
|
{
|
||||||
Eina_Iterator *iterator;
|
Eina_Iterator *iterator;
|
||||||
EDBus_Service_Interface *iface;
|
EDBus_Service_Interface *iface;
|
||||||
|
EDBus_Service_Object *child;
|
||||||
|
|
||||||
if (obj->introspection_data)
|
if (obj->introspection_data)
|
||||||
eina_strbuf_reset(obj->introspection_data);
|
eina_strbuf_reset(obj->introspection_data);
|
||||||
|
@ -369,8 +371,18 @@ cb_introspect(const EDBus_Service_Interface *_iface, const EDBus_Message *messag
|
||||||
EINA_ITERATOR_FOREACH(iterator, iface)
|
EINA_ITERATOR_FOREACH(iterator, iface)
|
||||||
_introspect_append_interface(obj->introspection_data, iface);
|
_introspect_append_interface(obj->introspection_data, iface);
|
||||||
eina_iterator_free(iterator);
|
eina_iterator_free(iterator);
|
||||||
eina_strbuf_append(obj->introspection_data, "</node>");
|
|
||||||
|
|
||||||
|
EINA_INLIST_FOREACH(obj->children, child)
|
||||||
|
{
|
||||||
|
const char *subpath;
|
||||||
|
if (strlen(obj->path) == 1)
|
||||||
|
subpath = child->path+strlen(obj->path);
|
||||||
|
else
|
||||||
|
subpath = child->path+strlen(obj->path)+1;
|
||||||
|
eina_strbuf_append_printf(obj->introspection_data, "<node name=\"%s\" />", subpath);
|
||||||
|
}
|
||||||
|
|
||||||
|
eina_strbuf_append(obj->introspection_data, "</node>");
|
||||||
obj->introspection_dirty = EINA_FALSE;
|
obj->introspection_dirty = EINA_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -477,7 +489,8 @@ edbus_service_shutdown(void)
|
||||||
static EDBus_Service_Object *
|
static EDBus_Service_Object *
|
||||||
_edbus_service_object_add(EDBus_Connection *conn, const char *path)
|
_edbus_service_object_add(EDBus_Connection *conn, const char *path)
|
||||||
{
|
{
|
||||||
EDBus_Service_Object *obj;
|
EDBus_Service_Object *obj, *aux;
|
||||||
|
Eina_Inlist *safe;
|
||||||
|
|
||||||
obj = calloc(1, sizeof(EDBus_Service_Object));
|
obj = calloc(1, sizeof(EDBus_Service_Object));
|
||||||
EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
|
EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
|
||||||
|
@ -497,6 +510,27 @@ _edbus_service_object_add(EDBus_Connection *conn, const char *path)
|
||||||
eina_hash_add(obj->interfaces, introspectable->name, introspectable);
|
eina_hash_add(obj->interfaces, introspectable->name, introspectable);
|
||||||
eina_hash_add(obj->interfaces, properties_iface->name, properties_iface);
|
eina_hash_add(obj->interfaces, properties_iface->name, properties_iface);
|
||||||
|
|
||||||
|
obj->parent = _edbus_service_object_parent_find(obj);
|
||||||
|
if (obj->parent)
|
||||||
|
{
|
||||||
|
obj->parent->children = eina_inlist_append(obj->parent->children,
|
||||||
|
EINA_INLIST_GET(obj));
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
EINA_INLIST_FOREACH_SAFE(conn->root_objs, safe, aux)
|
||||||
|
{
|
||||||
|
if (!strncmp(obj->path, aux->path, strlen(obj->path)))
|
||||||
|
{
|
||||||
|
conn->root_objs = eina_inlist_remove(conn->root_objs,
|
||||||
|
EINA_INLIST_GET(aux));
|
||||||
|
obj->children = eina_inlist_append(obj->children,
|
||||||
|
EINA_INLIST_GET(aux));
|
||||||
|
aux->parent = obj;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
conn->root_objs = eina_inlist_append(conn->root_objs, EINA_INLIST_GET(obj));
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -681,6 +715,31 @@ _object_free(EDBus_Service_Object *obj)
|
||||||
EINA_ITERATOR_FOREACH(iterator, iface)
|
EINA_ITERATOR_FOREACH(iterator, iface)
|
||||||
_interface_free(iface);
|
_interface_free(iface);
|
||||||
|
|
||||||
|
while (obj->children)
|
||||||
|
{
|
||||||
|
EDBus_Service_Object *child;
|
||||||
|
child = EINA_INLIST_CONTAINER_GET(obj->children, EDBus_Service_Object);
|
||||||
|
obj->children = eina_inlist_remove(obj->children, obj->children);
|
||||||
|
if (obj->parent)
|
||||||
|
{
|
||||||
|
obj->parent->children = eina_inlist_append(obj->parent->children,
|
||||||
|
EINA_INLIST_GET(child));
|
||||||
|
child->parent = obj->parent;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
obj->conn->root_objs = eina_inlist_append(obj->conn->root_objs,
|
||||||
|
EINA_INLIST_GET(child));
|
||||||
|
child->parent = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (obj->parent)
|
||||||
|
obj->parent->children = eina_inlist_remove(obj->parent->children,
|
||||||
|
EINA_INLIST_GET(obj));
|
||||||
|
else
|
||||||
|
obj->conn->root_objs = eina_inlist_remove(obj->conn->root_objs,
|
||||||
|
EINA_INLIST_GET(obj));
|
||||||
|
|
||||||
edbus_data_del_all(&obj->data);
|
edbus_data_del_all(&obj->data);
|
||||||
|
|
||||||
eina_hash_free(obj->interfaces);
|
eina_hash_free(obj->interfaces);
|
||||||
|
@ -1032,3 +1091,31 @@ edbus_service_property_invalidate_set(EDBus_Service_Interface *iface, const char
|
||||||
iface->prop_invalidated = eina_array_new(1);
|
iface->prop_invalidated = eina_array_new(1);
|
||||||
return eina_array_push(iface->prop_invalidated, prop);
|
return eina_array_push(iface->prop_invalidated, prop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static EDBus_Service_Object *
|
||||||
|
_edbus_service_object_parent_find(EDBus_Service_Object *obj)
|
||||||
|
{
|
||||||
|
size_t len = strlen(obj->path);
|
||||||
|
char *path = strdup(obj->path);
|
||||||
|
char *slash;
|
||||||
|
|
||||||
|
for (slash = path[len] != '/' ? &path[len - 1] : &path[len - 2];
|
||||||
|
slash > path; slash--)
|
||||||
|
{
|
||||||
|
EDBus_Service_Object *parent = NULL;
|
||||||
|
|
||||||
|
if (*slash != '/')
|
||||||
|
continue;
|
||||||
|
|
||||||
|
*slash = '\0';
|
||||||
|
|
||||||
|
if (dbus_connection_get_object_path_data(obj->conn->dbus_conn, path,(void **)&parent) && parent != NULL)
|
||||||
|
{
|
||||||
|
free(path);
|
||||||
|
return parent;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
free(path);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue