[PATCH 04/16] e_dbus/ofono: Refactor element.
authorbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 27 Feb 2010 05:26:50 +0000 (05:26 +0000)
committerbarbieri <barbieri@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Sat, 27 Feb 2010 05:26:50 +0000 (05:26 +0000)
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

src/bin/e_dbus_ofono_test.c
src/lib/ofono/E_Ofono.h
src/lib/ofono/e_ofono_element.c
src/lib/ofono/e_ofono_manager.c

index fe0d3db..bcecc8b 100644 (file)
@@ -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;
index 7695e7f..4b28bd3 100644 (file)
@@ -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);
index e4b80e9..713b403 100644 (file)
@@ -2,6 +2,16 @@
 #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;
@@ -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);
 }
 
 /**
index 198f031..b3afba2 100644 (file)
@@ -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);
 }