daemon/dbus: When client dead, cancel active process if any.
authorAmarnath Valluri <amarnath.valluri@linux.intel.com>
Thu, 1 Aug 2013 13:24:00 +0000 (16:24 +0300)
committerAmarnath Valluri <amarnath.valluri@linux.intel.com>
Thu, 1 Aug 2013 20:04:33 +0000 (23:04 +0300)
src/daemon/dbus/gsignond-dbus-auth-session-adapter.c
src/daemon/dbus/gsignond-dbus-auth-session-adapter.h
src/daemon/dbus/gsignond-dbus-identity-adapter.c

index 1d424c5..53c24e5 100644 (file)
@@ -303,7 +303,7 @@ _emit_state_changed (gint state, const gchar *message, gpointer user_data)
     GSignondDbusAuthSessionAdapter *self = NULL;
     _AuthSessionDbusInfo *info = (_AuthSessionDbusInfo*) user_data;
 
-    if (!info) return ;
+    if (!info || !GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER(info->adapter)) return ;
 
     self = info->adapter;
     gsignond_dbus_auth_session_emit_state_changed (
@@ -316,20 +316,23 @@ _on_process_done (GSignondSessionData *reply, const GError *error, gpointer user
     GSignondDbusAuthSessionAdapter *self = NULL;
     _AuthSessionDbusInfo *info = (_AuthSessionDbusInfo*) user_data;
 
-    if (!info) return ;
+    if (!info || !GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER(info->adapter)) return ;
 
     self = info->adapter;
-    self->priv->is_process_active = FALSE;
 
-    if (error) {
-        DBG("ERROR : %s(%d)", error->message, error->code);
-        GError *dbus_err = gsignond_get_gerror_for_id (error->code, error->message, NULL);
-        g_dbus_method_invocation_take_error (info->invocation, dbus_err);
-    }
-    else {
-        GVariant *result = gsignond_dictionary_to_variant ((GSignondDictionary *)reply); 
-        gsignond_dbus_auth_session_complete_process (
-                self->priv->dbus_auth_session, info->invocation, result);
+    if (self->priv->is_process_active) {
+        self->priv->is_process_active = FALSE;
+
+        if (error) {
+            DBG("ERROR : %s(%d)", error->message, error->code);
+            GError *dbus_err = gsignond_get_gerror_for_id (error->code, error->message, NULL);
+            g_dbus_method_invocation_take_error (info->invocation, dbus_err);
+        }
+        else {
+            GVariant *result = gsignond_dictionary_to_variant ((GSignondDictionary *)reply); 
+            gsignond_dbus_auth_session_complete_process (
+                    self->priv->dbus_auth_session, info->invocation, result);
+        }
     }
     gsignond_disposable_set_auto_dispose (GSIGNOND_DISPOSABLE (self), TRUE);
 
@@ -407,6 +410,27 @@ gsignond_dbus_auth_session_adapter_get_object_path (GSignondDbusAuthSessionAdapt
     return g_dbus_interface_skeleton_get_object_path (G_DBUS_INTERFACE_SKELETON(self->priv->dbus_auth_session));
 }
 
+gboolean
+gsignond_dbus_auth_session_adapter_is_process_active (GSignondDbusAuthSessionAdapter *self)
+{
+    g_return_val_if_fail (self && GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER (self), FALSE);
+
+    return self->priv->is_process_active;
+}
+
+gboolean
+gsignond_dbus_auth_session_adapter_abort_process (GSignondDbusAuthSessionAdapter *self)
+{
+    g_return_val_if_fail (self && GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER (self), FALSE);
+
+    if (self->priv->is_process_active) {
+        gsignond_auth_session_abort_process (self->priv->session);
+        self->priv->is_process_active = FALSE;
+    }
+
+    return TRUE;
+}
+
 GSignondDbusAuthSessionAdapter *
 gsignond_dbus_auth_session_adapter_new_with_connection (GDBusConnection *connection, 
                                                         GSignondAuthSession *session,
index 9405a4b..43fd652 100644 (file)
@@ -77,6 +77,14 @@ const gchar *
 gsignond_dbus_auth_session_adapter_get_object_path (
         GSignondDbusAuthSessionAdapter *dbus_session) G_GNUC_CONST;
 
+gboolean
+gsignond_dbus_auth_session_adapter_is_process_active (
+        GSignondDbusAuthSessionAdapter *dbus_session) G_GNUC_CONST;
+
+gboolean
+gsignond_dbus_auth_session_adapter_abort_process (
+        GSignondDbusAuthSessionAdapter *dbus_session);
+
 G_END_DECLS
 
 #endif /* __GSIGNOND_DBUS_AUTH_SESSION_ADAPTER_H_ */
index 8b0f2fc..7de4ef6 100644 (file)
@@ -208,6 +208,8 @@ _destroy_session (gpointer data, gpointer user_data)
     if (data && GSIGNOND_IS_DBUS_AUTH_SESSION_ADAPTER (data)) {
         GObject *dbus_session = G_OBJECT (data);
         g_object_weak_unref (dbus_session, _on_session_disposed, user_data);
+        gsignond_dbus_auth_session_adapter_abort_process (
+            GSIGNOND_DBUS_AUTH_SESSION_ADAPTER (dbus_session));
         g_object_unref (dbus_session);
     }
 }