From e3edfe85013cf8bf0e77955f4de08d8bf857c975 Mon Sep 17 00:00:00 2001 From: Imran Zaman Date: Thu, 19 Sep 2013 16:56:06 +0300 Subject: [PATCH] handle unregistered signal when remote dbus object is destroyed --- src/lib/gum-group.c | 61 +++++++++++++++++++++++++++++++++++------------------ src/lib/gum-user.c | 57 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 79 insertions(+), 39 deletions(-) diff --git a/src/lib/gum-group.c b/src/lib/gum-group.c index a2253c5..961bfe3 100644 --- a/src/lib/gum-group.c +++ b/src/lib/gum-group.c @@ -121,6 +121,19 @@ _setup_idle_callback ( } static void +_on_group_remote_object_destroyed ( + GDBusProxy *proxy, + gpointer user_data) +{ + g_return_if_fail (GUM_IS_GROUP (user_data)); + GumGroup *self = GUM_GROUP (user_data); + + DBG(""); + + GUM_OBJECT_UNREF (self->priv->dbus_group); +} + +static void _set_property ( GObject *object, guint property_id, @@ -165,6 +178,11 @@ _dispose (GObject *object) self->priv->cancellable = NULL; } + if (self->priv->dbus_group) { + g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->dbus_group), + _on_group_remote_object_destroyed, self); + } + GUM_OBJECT_UNREF (self->priv->dbus_group); GUM_OBJECT_UNREF (self->priv->dbus_service); @@ -242,6 +260,25 @@ gum_group_class_init ( properties); } + +static void +_create_dbus_group ( + GumGroup *group, + gchar *object_path, + GError *error) +{ + group->priv->dbus_group = gum_dbus_group_proxy_new_sync ( + g_dbus_proxy_get_connection (G_DBUS_PROXY ( + group->priv->dbus_service)), + G_DBUS_PROXY_FLAGS_NONE, g_dbus_proxy_get_name ( + G_DBUS_PROXY (group->priv->dbus_service)), object_path, + group->priv->cancellable, &error); + if (!error) { + g_signal_connect (G_OBJECT (group->priv->dbus_group), "unregistered", + G_CALLBACK (_on_group_remote_object_destroyed), group); + } +} + static void _on_new_group_cb ( GObject *object, @@ -262,13 +299,7 @@ _on_new_group_cb ( if (GUM_OPERATION_IS_NOT_CANCELLED (error)) { if (!error) { - group->priv->dbus_group = gum_dbus_group_proxy_new_sync ( - g_dbus_proxy_get_connection (G_DBUS_PROXY ( - group->priv->dbus_service)), - G_DBUS_PROXY_FLAGS_NONE, - g_dbus_proxy_get_name ( - G_DBUS_PROXY (group->priv->dbus_service)), - object_path, group->priv->cancellable, &error); + _create_dbus_group (group, object_path, error); } _setup_idle_callback (group, error); } @@ -296,13 +327,7 @@ _on_get_group_cb ( if (GUM_OPERATION_IS_NOT_CANCELLED (error)) { if (!error) { - group->priv->dbus_group = gum_dbus_group_proxy_new_sync ( - g_dbus_proxy_get_connection (G_DBUS_PROXY ( - group->priv->dbus_service)), - G_DBUS_PROXY_FLAGS_NONE, - g_dbus_proxy_get_name ( - G_DBUS_PROXY (group->priv->dbus_service)), - object_path, group->priv->cancellable, &error); + _create_dbus_group (group, object_path, error); } _setup_idle_callback (group, error); } @@ -330,13 +355,7 @@ _on_get_group_by_name_cb ( if (GUM_OPERATION_IS_NOT_CANCELLED (error)) { if (!error) { - group->priv->dbus_group = gum_dbus_group_proxy_new_sync ( - g_dbus_proxy_get_connection (G_DBUS_PROXY ( - group->priv->dbus_service)), - G_DBUS_PROXY_FLAGS_NONE, - g_dbus_proxy_get_name ( - G_DBUS_PROXY (group->priv->dbus_service)), - object_path, group->priv->cancellable, &error); + _create_dbus_group (group, object_path, error); } _setup_idle_callback (group, error); } diff --git a/src/lib/gum-user.c b/src/lib/gum-user.c index 0024953..d9d7c3b 100644 --- a/src/lib/gum-user.c +++ b/src/lib/gum-user.c @@ -129,6 +129,19 @@ _setup_idle_callback ( } static void +_on_user_remote_object_destroyed( + GDBusProxy *proxy, + gpointer user_data) +{ + g_return_if_fail (GUM_IS_USER (user_data)); + GumUser *self = GUM_USER (user_data); + + DBG(""); + + GUM_OBJECT_UNREF (self->priv->dbus_user); +} + +static void _set_property ( GObject *object, guint property_id, @@ -173,6 +186,11 @@ _dispose (GObject *object) self->priv->cancellable = NULL; } + if (self->priv->dbus_user) { + g_signal_handlers_disconnect_by_func (G_OBJECT (self->priv->dbus_user), + _on_user_remote_object_destroyed, self); + } + GUM_OBJECT_UNREF (self->priv->dbus_user); GUM_OBJECT_UNREF (self->priv->dbus_service); @@ -309,6 +327,24 @@ gum_user_class_init ( } static void +_create_dbus_user ( + GumUser *user, + gchar *object_path, + GError *error) +{ + user->priv->dbus_user = gum_dbus_user_proxy_new_sync ( + g_dbus_proxy_get_connection (G_DBUS_PROXY ( + user->priv->dbus_service)), + G_DBUS_PROXY_FLAGS_NONE, g_dbus_proxy_get_name ( + G_DBUS_PROXY (user->priv->dbus_service)), object_path, + user->priv->cancellable, &error); + if (!error) { + g_signal_connect (G_OBJECT (user->priv->dbus_user), "unregistered", + G_CALLBACK (_on_user_remote_object_destroyed), user); + } +} + +static void _on_new_user_cb ( GObject *object, GAsyncResult *res, @@ -328,12 +364,7 @@ _on_new_user_cb ( if (GUM_OPERATION_IS_NOT_CANCELLED (error)) { if (!error) { - user->priv->dbus_user = gum_dbus_user_proxy_new_sync ( - g_dbus_proxy_get_connection (G_DBUS_PROXY ( - user->priv->dbus_service)), - G_DBUS_PROXY_FLAGS_NONE, - g_dbus_proxy_get_name (G_DBUS_PROXY (user->priv->dbus_service)), - object_path, user->priv->cancellable, &error); + _create_dbus_user (user, object_path, error); } _setup_idle_callback (user, error); } @@ -361,12 +392,7 @@ _on_get_user_cb ( if (GUM_OPERATION_IS_NOT_CANCELLED (error)) { if (!error) { - user->priv->dbus_user = gum_dbus_user_proxy_new_sync ( - g_dbus_proxy_get_connection (G_DBUS_PROXY ( - user->priv->dbus_service)), - G_DBUS_PROXY_FLAGS_NONE, - g_dbus_proxy_get_name (G_DBUS_PROXY (user->priv->dbus_service)), - object_path, user->priv->cancellable, &error); + _create_dbus_user (user, object_path, error); } _setup_idle_callback (user, error); } @@ -394,12 +420,7 @@ _on_get_user_by_name_cb ( if (GUM_OPERATION_IS_NOT_CANCELLED (error)) { if (!error) { - user->priv->dbus_user = gum_dbus_user_proxy_new_sync ( - g_dbus_proxy_get_connection (G_DBUS_PROXY ( - user->priv->dbus_service)), - G_DBUS_PROXY_FLAGS_NONE, - g_dbus_proxy_get_name (G_DBUS_PROXY (user->priv->dbus_service)), - object_path, user->priv->cancellable, &error); + _create_dbus_user (user, object_path, error); } _setup_idle_callback (user, error); } -- 2.7.4