Makes elements hash be indexed by object path and interface.
By: João Paulo Rechi Vita <jprvita@profusion.mobi>
git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/e_dbus@46556
7cbeb6ba-43b4-40fd-8cce-
4c39aea84d33
_on_element_add(void *data, int type, void *info)
{
E_Ofono_Element *element = info;
_on_element_add(void *data, int type, void *info)
{
E_Ofono_Element *element = info;
- printf(">>> %s\n", element->path);
+ printf(">>> %s %s\n", element->path, element->interface);
_on_element_del(void *data, int type, void *info)
{
E_Ofono_Element *element = info;
_on_element_del(void *data, int type, void *info)
{
E_Ofono_Element *element = info;
- printf("<<< %s\n", element->path);
+ printf("<<< %s %s\n", element->path, element->interface);
_on_element_updated(void *data, int type, void *info)
{
E_Ofono_Element *element = info;
_on_element_updated(void *data, int type, void *info)
{
E_Ofono_Element *element = info;
- printf("!!! %s\n", element->path);
+ printf("!!! %s %s\n", element->path, element->interface);
e_ofono_element_print(stderr, element);
return 1;
}
e_ofono_element_print(stderr, element);
return 1;
}
}
static E_Ofono_Element *
}
static E_Ofono_Element *
-_element_from_args(char *args, char **next_args)
+_element_from_args(char *interface, char *args, char **next_args)
{
E_Ofono_Element *element;
{
E_Ofono_Element *element;
- *next_args = _tok(args);
- element = e_ofono_element_get(args);
+ if (!interface)
+ {
+ interface = _tok(args);
+ *next_args = _tok(interface);
+ }
+ else
+ *next_args = _tok(args);
+
+ element = e_ofono_element_get(args, interface);
- fprintf(stderr, "ERROR: no element called \"%s\".\n", args);
+ fprintf(stderr, "ERROR: no element called \"%s %s\".\n", args, interface);
_on_cmd_print(char *cmd, char *args)
{
char *next_args;
_on_cmd_print(char *cmd, char *args)
{
char *next_args;
- E_Ofono_Element *element = _element_from_args(args, &next_args);
+ E_Ofono_Element *element = _element_from_args(NULL, args, &next_args);
if (element)
e_ofono_element_print(stdout, element);
return 1;
if (element)
e_ofono_element_print(stdout, element);
return 1;
_on_cmd_get_properties(char *cmd, char *args)
{
char *next_args;
_on_cmd_get_properties(char *cmd, char *args)
{
char *next_args;
- E_Ofono_Element *element = _element_from_args(args, &next_args);
+ E_Ofono_Element *element = _element_from_args(NULL, args, &next_args);
if (element)
e_ofono_element_properties_sync(element);
return 1;
if (element)
e_ofono_element_properties_sync(element);
return 1;
_on_cmd_property_set(char *cmd, char *args)
{
char *next_args, *name, *p;
_on_cmd_property_set(char *cmd, char *args)
{
char *next_args, *name, *p;
- E_Ofono_Element *element = _element_from_args(args, &next_args);
+ E_Ofono_Element *element = _element_from_args(NULL, args, &next_args);
void *value;
long vlong;
unsigned short vu16;
void *value;
long vlong;
unsigned short vu16;
EAPI bool e_ofono_elements_get_all(unsigned int *count, E_Ofono_Element ***p_elements) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT;
EAPI bool e_ofono_elements_get_all_type(const char *type, unsigned int *count, E_Ofono_Element ***p_elements) EINA_ARG_NONNULL(1, 2, 3) EINA_WARN_UNUSED_RESULT;
EAPI bool e_ofono_elements_get_all(unsigned int *count, E_Ofono_Element ***p_elements) EINA_ARG_NONNULL(1, 2) EINA_WARN_UNUSED_RESULT;
EAPI bool e_ofono_elements_get_all_type(const char *type, unsigned int *count, E_Ofono_Element ***p_elements) EINA_ARG_NONNULL(1, 2, 3) EINA_WARN_UNUSED_RESULT;
- EAPI E_Ofono_Element *e_ofono_element_get(const char *path);
+ EAPI E_Ofono_Element *e_ofono_element_get(const char *path, const char *interface);
EAPI void e_ofono_element_listener_add(E_Ofono_Element *element, void (*cb)(void *data, const E_Ofono_Element *element), const void *data, void (*free_data)(void *data)) EINA_ARG_NONNULL(1, 2);
EAPI void e_ofono_element_listener_del(E_Ofono_Element *element, void (*cb)(void *data, const E_Ofono_Element *element), const void *data) EINA_ARG_NONNULL(1, 2);
EAPI void e_ofono_element_listener_add(E_Ofono_Element *element, void (*cb)(void *data, const E_Ofono_Element *element), const void *data, void (*free_data)(void *data)) EINA_ARG_NONNULL(1, 2);
EAPI void e_ofono_element_listener_del(E_Ofono_Element *element, void (*cb)(void *data, const E_Ofono_Element *element), const void *data) EINA_ARG_NONNULL(1, 2);
#include <string.h>
#include <errno.h>
#include <string.h>
#include <errno.h>
+/*
+ * Maximum size for elements hash key.
+ *
+ * The elements hash key is contructed by concatenating the object path and the
+ * interface for the element (with a colon separating the two strings). D-Bus
+ * interfaces have a maximum size of 255 but object paths have unlimited size.
+ * We're assuming a maximum key size of 4k here, but this might need to be
+ * increased if oFono object paths grows bigger than that.
+ */
+#define MAX_KEY_SIZE 4096
static Eina_Hash *elements = NULL;
typedef struct _E_Ofono_Array E_Ofono_Array;
static Eina_Hash *elements = NULL;
typedef struct _E_Ofono_Array E_Ofono_Array;
*/
EINA_LIST_FREE(deleted, data)
{
*/
EINA_LIST_FREE(deleted, data)
{
- E_Ofono_Element *e = e_ofono_element_get(data);
+ E_Ofono_Element *e = e_ofono_element_get(data, prop_name);
if (e)
e_ofono_element_unregister(e);
DBG("Delete element %s\n", (const char *) data);
if (e)
e_ofono_element_unregister(e);
DBG("Delete element %s\n", (const char *) data);
- e = e_ofono_element_get(item_old);
+ e = e_ofono_element_get(item_old,
+ _e_ofono_element_get_interface(prop_name));
if (e)
e_ofono_element_unregister(e);
DBG("Delete element %s\n", (const char *) item_old);
if (e)
e_ofono_element_unregister(e);
DBG("Delete element %s\n", (const char *) item_old);
EINA_ARRAY_ITER_NEXT(array->array, i, item, iterator)
{
EINA_ARRAY_ITER_NEXT(array->array, i, item, iterator)
{
- E_Ofono_Element *e = e_ofono_element_get(item);
+ E_Ofono_Element *e = e_ofono_element_get(item, property);
if (!e)
continue;
*p = e;
if (!e)
continue;
*p = e;
* @return element pointer if found, NULL otherwise. No references are added.
*/
E_Ofono_Element *
* @return element pointer if found, NULL otherwise. No references are added.
*/
E_Ofono_Element *
-e_ofono_element_get(const char *path)
+e_ofono_element_get(const char *path, const char *interface)
{
E_Ofono_Element *element;
{
E_Ofono_Element *element;
+ char key[MAX_KEY_SIZE];
EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL);
- element = eina_hash_find(elements, path);
+ EINA_SAFETY_ON_NULL_RETURN_VAL(interface, NULL);
+
+ snprintf(key, MAX_KEY_SIZE, "%s:%s", path, interface);
+ element = eina_hash_find(elements, key);
const char *name = NULL;
void *value = NULL;
const char *name = NULL;
void *value = NULL;
- DBG("Property changed in element %s", element->path);
+ DBG("Property changed in element %s %s", element->path, element->interface);
if (!_dbus_callback_check_and_init(msg, &itr, NULL))
return;
if (!_dbus_callback_check_and_init(msg, &itr, NULL))
return;
- * Register the given path, possible creating and element and return it.
+ * Register the given pair (path, interface), possibly creating an
+ * element and return it.
- * This will check if path is already registered, in that case the
- * exiting element is returned. If it was not registered yet, a new
- * element is created, registered and returned.
+ * This will check if (path, interface) is already registered, in
+ * that case the exiting element is returned. If it was not registered
+ * yet, a new element is created, registered and returned.
*
* This call will not add extra references to the object.
*
*
* This call will not add extra references to the object.
*
e_ofono_element_register(const char *path, const char *interface)
{
E_Ofono_Element *element;
e_ofono_element_register(const char *path, const char *interface)
{
E_Ofono_Element *element;
+ char key[MAX_KEY_SIZE];
EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(interface, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(interface, NULL);
- element = eina_hash_find(elements, path);
+ snprintf(key, MAX_KEY_SIZE, "%s:%s", path, interface);
+ element = eina_hash_find(elements, key);
if (element)
return element;
if (element)
return element;
if (!element)
return NULL;
if (!element)
return NULL;
- if (!eina_hash_add(elements, element->path, element))
+ if (!eina_hash_add(elements, key, element))
{
ERR("could not add element %s to hash, delete it.", path);
e_ofono_element_free(element);
{
ERR("could not add element %s to hash, delete it.", path);
e_ofono_element_free(element);
void
e_ofono_element_unregister(E_Ofono_Element *element)
{
void
e_ofono_element_unregister(E_Ofono_Element *element)
{
+ char key[MAX_KEY_SIZE];
+
+ snprintf(key, MAX_KEY_SIZE, "%s:%s", element->path, element->interface);
- eina_hash_del_by_key(elements, element->path);
+ eina_hash_del_by_key(elements, key);
E_Ofono_Element *
e_ofono_manager_get(void)
{
E_Ofono_Element *
e_ofono_manager_get(void)
{
- return e_ofono_element_get(manager_path);
+ return e_ofono_element_get(manager_path, e_ofono_iface_manager);