diff options
author | Marcel Holtmann <marcel@holtmann.org> | 2012-12-29 12:27:33 -0800 |
---|---|---|
committer | Marcel Holtmann <marcel@holtmann.org> | 2012-12-29 12:27:33 -0800 |
commit | dc6894500a8aadd0ab6c59dd43c585c469122e72 (patch) | |
tree | c662d777a922f56d7056bd3319e0ddd9cdc20be7 | |
parent | 8c6046af315c07301f979c3d1af5afd383358225 (diff) |
gdbus: Fix handling of client connect/disconnect signals
-rw-r--r-- | gdbus/client.c | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/gdbus/client.c b/gdbus/client.c index 8d2a75136..b46d5e41a 100644 --- a/gdbus/client.c +++ b/gdbus/client.c @@ -877,6 +877,9 @@ static void get_managed_objects(GDBusClient *client) DBusMessage *msg; DBusPendingCall *call; + if (!client->proxy_added && !client->proxy_removed) + return; + msg = dbus_message_new_method_call(client->service_name, "/", DBUS_INTERFACE_DBUS ".ObjectManager", "GetManagedObjects"); @@ -918,21 +921,19 @@ static void get_name_owner_reply(DBusPendingCall *call, void *user_data) DBUS_TYPE_INVALID) == FALSE) goto done; - g_free(client->unique_name); - client->unique_name = g_strdup(name); - - g_dbus_client_ref(client); + if (client->unique_name == NULL) { + client->unique_name = g_strdup(name); - if (client->connect_func) - client->connect_func(client->dbus_conn, client->connect_data); + if (client->connect_func) + client->connect_func(client->dbus_conn, + client->connect_data); + } done: dbus_message_unref(reply); dbus_pending_call_unref(client->pending_call); client->pending_call = NULL; - - g_dbus_client_unref(client); } static void get_name_owner(GDBusClient *client, const char *name) @@ -994,15 +995,15 @@ static DBusHandlerResult message_filter(DBusConnection *connection, if (g_str_equal(name, client->service_name) == FALSE) return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; - if (*new == '\0') { + if (*new == '\0' && client->unique_name != NULL && + g_str_equal(old, client->unique_name) == TRUE) { if (client->disconn_func) client->disconn_func(client->dbus_conn, client->disconn_data); g_free(client->unique_name); client->unique_name = NULL; - } else if (*old == '\0') { - g_free(client->unique_name); + } else if (*old == '\0' && client->unique_name == NULL) { client->unique_name = g_strdup(new); if (client->connect_func) |