efl/edbus: Fix edbus_name_owner_changed() when bus name is not on bus
authorJosé Roberto de Souza <zezsouza@gmail.com>
Tue, 22 Jan 2013 13:34:34 +0000 (13:34 +0000)
committerBruno Dilly <bdilly@profusion.mobi>
Tue, 22 Jan 2013 13:34:34 +0000 (13:34 +0000)
If we pass the last argument as TRUE, that means user want to know the actual
bus id of the bus name and if the bus name is not registered it never notify
the user.

This bug was insert when fixing another one, because of that there more code
here to fix the previous bug too.

Patch by: José Roberto de Souza <zezsouza@gmail.com>

SVN revision: 83082

src/lib/edbus/EDBus.h
src/lib/edbus/edbus_core.c
src/lib/edbus/edbus_pending.c
src/lib/edbus/edbus_private_types.h
src/tests/edbus/edbus_test_edbus_init.c

index 9145c9393765ab5f81791ae9f69b8a01ea3b6551..5dd3712e4b97fa1266503a84a9bb5c560f1d23c5 100644 (file)
@@ -125,6 +125,7 @@ extern "C" {
 #define EDBUS_FDO_INTERFACE_OBJECT_MANAGER "org.freedesktop.DBus.ObjectManager"
 #define EDBUS_FDO_INTERFACE_INTROSPECTABLE "org.freedesktop.DBus.Introspectable"
 #define EDBUS_FDO_INTEFACE_PEER "org.freedesktop.DBus.Peer"
+#define EDBUS_ERROR_PENDING_CANCELED "org.enlightenment.DBus.Canceled"
 
 typedef struct _EDBus_Version
 {
index 836e738a935bef778373ad91784d5586dc30778f..7d5c660ae65c4ee65ccee4c1abfc5b716853a3b1 100644 (file)
@@ -385,7 +385,10 @@ edbus_connection_name_gc(EDBus_Connection *conn, EDBus_Connection_Name *cn)
    if (cn->objects)
      eina_hash_free(cn->objects);
    eina_stringshare_del(cn->name);
-   eina_stringshare_del(cn->unique_id);
+   if (cn->name_owner_get)
+     edbus_pending_cancel(cn->name_owner_get);
+   if (cn->unique_id)
+     eina_stringshare_del(cn->unique_id);
    eina_list_free(cn->event_handlers.to_delete);
    free(cn);
 }
@@ -432,19 +435,19 @@ on_name_owner_changed(void *data, const EDBus_Message *msg)
 static void
 on_get_name_owner(void *data, const EDBus_Message *msg, EDBus_Pending *pending EINA_UNUSED)
 {
-   const char *unique_id = "";
+   const char *unique_id = "", *error_name;
    EDBus_Connection_Name *cn = data;
 
-   if (edbus_message_error_get(msg, NULL, NULL))
+   cn->name_owner_get = NULL;
+
+   if (edbus_message_error_get(msg, &error_name, NULL))
      {
-        DBG("GetNameOwner returned an error");
-        return;
+        if (!strcmp(error_name, EDBUS_ERROR_PENDING_CANCELED))
+          return;
+        DBG("GetNameOwner of bus = %s returned an error", cn->name);
      }
    else if (!edbus_message_arguments_get(msg, "s", &unique_id))
-     {
-        ERR("Error getting arguments from GetNameOwner");
-        return;
-     }
+     ERR("Error getting arguments from GetNameOwner");
 
    cn->unique_id = eina_stringshare_add(unique_id);
    edbus_dispatch_name_owner_change(cn, NULL);
@@ -490,7 +493,7 @@ edbus_connection_name_get(EDBus_Connection *conn, const char *name)
    if (name[0] == ':')
      cn->unique_id = eina_stringshare_add(name);
    else
-     edbus_name_owner_get(conn, cn->name, on_get_name_owner, cn);
+     cn->name_owner_get = edbus_name_owner_get(conn, cn->name, on_get_name_owner, cn);
 
    cn->name_owner_changed = _edbus_signal_handler_add(conn, EDBUS_FDO_BUS,
                                                       EDBUS_FDO_PATH,
index bd609b240dabbd5ad2ac54ea073ae75ae8b8f60a..75a981e5ce263d4a0b2a243f72087ba554917000 100644 (file)
@@ -218,7 +218,7 @@ edbus_pending_cancel(EDBus_Pending *pending)
    dbus_pending_call_cancel(pending->dbus_pending);
 
    error_message = edbus_message_error_new(pending->msg_sent,
-                                           "org.enlightenment.DBus.Canceled",
+                                           EDBUS_ERROR_PENDING_CANCELED,
                                            "Canceled by user.");
    edbus_pending_dispatch(pending, error_message);
 }
index 0ce81955a40e26adedf4fdaeebeb5d1d0a2372f8..54da7da1b57db6b9165e67b8fb14e18a0e4a4bad 100644 (file)
@@ -19,6 +19,7 @@ typedef struct _EDBus_Connection_Name
       Eina_List   *to_delete;
    } event_handlers;
    EDBus_Signal_Handler *name_owner_changed;
+   EDBus_Pending *name_owner_get;
 } EDBus_Connection_Name;
 
 typedef struct _EDBus_Object_Context_Event_Cb
index 4da1eccb8e93ced074032de9cabb47c7c040b502..4f6cacea5ec5a162aff5783194c4ff003a9efadd 100644 (file)
@@ -120,6 +120,38 @@ START_TEST(edbus_test_edbus_conn_object)
 
 }
 END_TEST
+
+void name_owner_changed_cb(void *data, const char *bus EINA_UNUSED, const char *old_id EINA_UNUSED, const char *new_id)
+{
+   const char **id = data;
+   *id = new_id;
+}
+
+START_TEST(edbus_test_edbus_name_owner_changed)
+{
+   EDBus_Connection *conn;
+   const char *id = NULL;
+
+   ecore_init();
+   edbus_init();
+
+   conn = edbus_connection_get(EDBUS_CONNECTION_TYPE_SYSTEM);
+   fail_if(conn == NULL);
+
+   edbus_name_owner_changed_callback_add(conn, "org.bus.that.not.exist",
+                                         name_owner_changed_cb, &id, EINA_TRUE);
+   ecore_timer_add(0.5, _quit_cb, NULL);
+
+   ecore_main_loop_begin();
+
+   fail_if(id == NULL);
+
+   edbus_connection_unref(conn);
+
+   edbus_shutdown();
+   ecore_shutdown();
+}
+END_TEST
 #endif
 
 void edbus_test_edbus_init(TCase *tc)
@@ -129,5 +161,6 @@ void edbus_test_edbus_init(TCase *tc)
 #if 0
    tcase_add_test(tc, edbus_test_edbus_conn);
    tcase_add_test(tc, edbus_test_edbus_conn_object);
+   tcase_add_test(tc, edbus_test_edbus_name_owner_changed);
 #endif
 }