From da83a6138e9b47006880e0b1807d8e0fb1621091 Mon Sep 17 00:00:00 2001 From: barbieri Date: Sat, 27 Feb 2010 05:26:50 +0000 Subject: [PATCH] [PATCH 04/16] e_dbus/ofono: Refactor element. Makes elements hash be indexed by object path and interface. MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit By: João Paulo Rechi Vita git-svn-id: svn+ssh://svn.enlightenment.org/var/svn/e/trunk/e_dbus@46556 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- src/bin/e_dbus_ofono_test.c | 27 ++++++++++++++--------- src/lib/ofono/E_Ofono.h | 2 +- src/lib/ofono/e_ofono_element.c | 47 +++++++++++++++++++++++++++++------------ src/lib/ofono/e_ofono_manager.c | 2 +- 4 files changed, 53 insertions(+), 25 deletions(-) diff --git a/src/bin/e_dbus_ofono_test.c b/src/bin/e_dbus_ofono_test.c index fe0d3db..bcecc8b 100644 --- a/src/bin/e_dbus_ofono_test.c +++ b/src/bin/e_dbus_ofono_test.c @@ -37,7 +37,7 @@ static int _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); return 1; } @@ -45,7 +45,7 @@ static int _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); return 1; } @@ -53,7 +53,7 @@ static int _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; } @@ -119,7 +119,7 @@ _on_cmd_get_all(char *cmd, char *args) } 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; @@ -130,10 +130,17 @@ _element_from_args(char *args, char **next_args) return NULL; } - *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); if (!element) - fprintf(stderr, "ERROR: no element called \"%s\".\n", args); + fprintf(stderr, "ERROR: no element called \"%s %s\".\n", args, interface); return element; } @@ -142,7 +149,7 @@ static int _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; @@ -152,7 +159,7 @@ static int _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; @@ -162,7 +169,7 @@ static int _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; diff --git a/src/lib/ofono/E_Ofono.h b/src/lib/ofono/E_Ofono.h index 7695e7f..4b28bd3 100644 --- a/src/lib/ofono/E_Ofono.h +++ b/src/lib/ofono/E_Ofono.h @@ -80,7 +80,7 @@ extern "C" { 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); diff --git a/src/lib/ofono/e_ofono_element.c b/src/lib/ofono/e_ofono_element.c index e4b80e9..713b403 100644 --- a/src/lib/ofono/e_ofono_element.c +++ b/src/lib/ofono/e_ofono_element.c @@ -2,6 +2,16 @@ #include #include +/* + * 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; @@ -536,7 +546,7 @@ _e_ofono_element_array_match(E_Ofono_Array *old, E_Ofono_Array *new, const char */ 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); @@ -550,7 +560,8 @@ out_remove_remaining: if (!item_old) break; - 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); @@ -770,7 +781,7 @@ e_ofono_element_objects_array_get_stringshared(const E_Ofono_Element *element, c 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; @@ -2030,12 +2041,16 @@ e_ofono_elements_get_all_type(const char *type, unsigned int *count, E_Ofono_Ele * @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; + char key[MAX_KEY_SIZE]; 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); return element; } @@ -2049,7 +2064,7 @@ _e_ofono_element_property_changed_callback(void *data, DBusMessage *msg) 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; @@ -2095,11 +2110,12 @@ _e_ofono_element_property_changed_callback(void *data, DBusMessage *msg) } /** - * 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. * @@ -2111,11 +2127,13 @@ E_Ofono_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); - 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; @@ -2123,7 +2141,7 @@ e_ofono_element_register(const char *path, const char *interface) 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); @@ -2173,11 +2191,14 @@ _e_ofono_element_unregister_internal(E_Ofono_Element *element) void e_ofono_element_unregister(E_Ofono_Element *element) { + char key[MAX_KEY_SIZE]; + if (!element) return; + snprintf(key, MAX_KEY_SIZE, "%s:%s", element->path, element->interface); if (elements) - eina_hash_del_by_key(elements, element->path); + eina_hash_del_by_key(elements, key); } /** diff --git a/src/lib/ofono/e_ofono_manager.c b/src/lib/ofono/e_ofono_manager.c index 198f031..b3afba2 100644 --- a/src/lib/ofono/e_ofono_manager.c +++ b/src/lib/ofono/e_ofono_manager.c @@ -8,5 +8,5 @@ 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); } -- 2.7.4