[telepathy-mission-control/master] mcd-account: make mcd_account_delete async use write_conf_async

Jonny Lamb jonny.lamb at collabora.co.uk
Mon Sep 14 11:09:11 PDT 2009


Signed-off-by: Jonny Lamb <jonny.lamb at collabora.co.uk>
---
 src/mcd-account-manager.c |    2 +-
 src/mcd-account.c         |   97 ++++++++++++++++++++++++++++++++++-----------
 src/mcd-account.h         |    9 +++-
 3 files changed, 81 insertions(+), 27 deletions(-)

diff --git a/src/mcd-account-manager.c b/src/mcd-account-manager.c
index 99d828c..2bb85f6 100644
--- a/src/mcd-account-manager.c
+++ b/src/mcd-account-manager.c
@@ -447,7 +447,7 @@ complete_account_creation (McdAccount *account,
 
     if (!ok)
     {
-        mcd_account_delete (account, NULL);
+        mcd_account_delete (account, NULL, NULL);
         g_object_unref (account);
         account = NULL;
     }
diff --git a/src/mcd-account.c b/src/mcd-account.c
index 13dea8f..4cd9c94 100644
--- a/src/mcd-account.c
+++ b/src/mcd-account.c
@@ -594,13 +594,36 @@ get_account_data_path (McdAccountPrivate *priv)
 	return g_build_filename (base, priv->unique_name, NULL);
 }
 
-static gboolean
-_mcd_account_delete (McdAccount *account, GError **error)
+typedef struct
+{
+    McdAccount *account;
+    McdAccountDeleteCb callback;
+    gpointer user_data;
+} AccountDeleteData;
+
+static void
+_mcd_account_delete_write_conf_cb (McdAccountManager *account_manager,
+                                   const GError *error,
+                                   gpointer user_data)
+{
+    AccountDeleteData *data = (AccountDeleteData *) user_data;
+
+    if (data->callback != NULL)
+        data->callback (data->account, error, data->user_data);
+
+    g_slice_free (AccountDeleteData, data);
+}
+
+static void
+_mcd_account_delete (McdAccount *account,
+                     McdAccountDeleteCb callback,
+                     gpointer user_data)
 {
     McdAccountPrivate *priv = account->priv;
     gchar *data_dir_str;
     GDir *data_dir;
     GError *kf_error = NULL;
+    AccountDeleteData *delete_data;
 
     if (!g_key_file_remove_group (priv->keyfile, priv->unique_name,
                                   &kf_error))
@@ -614,8 +637,9 @@ _mcd_account_delete (McdAccount *account, GError **error)
         else
         {
             g_warning ("Could not remove group (%s)", kf_error->message);
-            g_propagate_error (error, kf_error);
-            return FALSE;
+            callback (account, kf_error, user_data);
+            g_error_free (kf_error);
+            return;
         }
     }
 
@@ -635,8 +659,15 @@ _mcd_account_delete (McdAccount *account, GError **error)
         g_rmdir (data_dir_str);
     }
     g_free (data_dir_str);
-    mcd_account_manager_write_conf_async (priv->account_manager, NULL, NULL);
-    return TRUE;
+
+    delete_data = g_slice_new0 (AccountDeleteData);
+    delete_data->account = account;
+    delete_data->callback = callback;
+    delete_data->user_data = user_data;
+
+    mcd_account_manager_write_conf_async (priv->account_manager,
+                                          _mcd_account_delete_write_conf_cb,
+                                          delete_data);
 }
 
 static void
@@ -1503,36 +1534,54 @@ mc_param_type (const TpConnectionManagerParam *param)
     return G_TYPE_INVALID;
 }
 
-gboolean
-mcd_account_delete (McdAccount *account, GError **error)
+void
+mcd_account_delete (McdAccount *account, McdAccountDeleteCb callback,
+                    gpointer user_data)
 {
-    return MCD_ACCOUNT_GET_CLASS (account)->delete (account, error);
+    return MCD_ACCOUNT_GET_CLASS (account)->delete (account, callback, user_data);
 }
 
+typedef struct
+{
+    McdAccount *self;
+    DBusGMethodInvocation *context;
+} RemoveMethodData;
+
 static void
-account_remove (TpSvcAccount *svc, DBusGMethodInvocation *context)
+account_remove_delete_cb (McdAccount *account, const GError *error,
+                          gpointer user_data)
 {
-    McdAccount *self = MCD_ACCOUNT (svc);
-    GError *error = NULL;
+    RemoveMethodData *data = (RemoveMethodData *) user_data;
 
-    DEBUG ("called");
-    if (!mcd_account_delete (self, &error))
+    if (error != NULL)
     {
-	if (!error)
-	    g_set_error (&error, TP_ERRORS, TP_ERROR_NOT_AVAILABLE,
-			 "Internal error");
-	dbus_g_method_return_error (context, error);
-	g_error_free (error);
-	return;
+        dbus_g_method_return_error (data->context, error);
+        return;
     }
 
-    if (!self->priv->removed)
+    if (!data->self->priv->removed)
     {
-        self->priv->removed = TRUE;
-        tp_svc_account_emit_removed (self);
+        data->self->priv->removed = TRUE;
+        tp_svc_account_emit_removed (data->self);
     }
 
-    tp_svc_account_return_from_remove (context);
+    tp_svc_account_return_from_remove (data->context);
+
+    g_slice_free (RemoveMethodData, data);
+}
+
+static void
+account_remove (TpSvcAccount *svc, DBusGMethodInvocation *context)
+{
+    McdAccount *self = MCD_ACCOUNT (svc);
+    RemoveMethodData *data;
+
+    data = g_slice_new0 (RemoveMethodData);
+    data->self = self;
+    data->context = context;
+
+    DEBUG ("called");
+    mcd_account_delete (self, account_remove_delete_cb, data);
 }
 
 /*
diff --git a/src/mcd-account.h b/src/mcd-account.h
index de8008a..05fd22b 100644
--- a/src/mcd-account.h
+++ b/src/mcd-account.h
@@ -51,6 +51,9 @@ struct _McdAccount
 typedef void (*McdAccountLoadCb) (McdAccount *account,
                                   const GError *error,
                                   gpointer user_data);
+typedef void (*McdAccountDeleteCb) (McdAccount *account,
+                                    const GError *error,
+                                    gpointer user_data);
 
 struct _McdAccountClass
 {
@@ -59,7 +62,8 @@ struct _McdAccountClass
                                GValue *value);
     void (*set_parameter) (McdAccount *account, const gchar *name,
                            const GValue *value);
-    gboolean (*delete) (McdAccount *account, GError **error);
+    void (*delete) (McdAccount *account, McdAccountDeleteCb callback,
+                    gpointer user_data);
     void (*load) (McdAccount *account, McdAccountLoadCb callback,
                   gpointer user_data);
     void (*_mc_reserved5) (void);
@@ -76,7 +80,8 @@ McdAccount *mcd_account_new (McdAccountManager *account_manager,
 
 McdAccountManager *mcd_account_get_account_manager (McdAccount *account);
 
-gboolean mcd_account_delete (McdAccount *account, GError **error);
+void mcd_account_delete (McdAccount *account, McdAccountDeleteCb callback,
+                         gpointer user_data);
 
 const gchar *mcd_account_get_unique_name (McdAccount *account);
 const gchar *mcd_account_get_object_path (McdAccount *account);
-- 
1.5.6.5




More information about the telepathy-commits mailing list