[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