[Telepathy-commits] [telepathy-mission-control/master] Let the McdAccount reference the McdAccountManager

Alberto Mardegan alberto.mardegan at nokia.com
Mon Dec 8 06:33:18 PST 2008


This gives a better API, and the mcd_account_new() function doesn't need the
TpDBusDaemon and the GKeyFile anymore. For these, add getter methods to the
McdAccountManager.
---
 src/mcd-account-manager.c |   27 ++++++++++----
 src/mcd-account-manager.h |    5 ++-
 src/mcd-account.c         |   87 ++++++++++++++++++++++++--------------------
 src/mcd-account.h         |    5 ++-
 4 files changed, 74 insertions(+), 50 deletions(-)

diff --git a/src/mcd-account-manager.c b/src/mcd-account-manager.c
index 76a9e6e..9c73233 100644
--- a/src/mcd-account-manager.c
+++ b/src/mcd-account-manager.c
@@ -100,9 +100,7 @@ static guint write_conf_id = 0;
 static McdAccount *
 account_new (McdAccountManager *account_manager, const gchar *name)
 {
-    McdAccountManagerPrivate *priv = account_manager->priv;
-
-    return mcd_account_new (priv->dbus_daemon, priv->keyfile, name);
+    return mcd_account_new (account_manager, name);
 }
 
 static void
@@ -189,7 +187,6 @@ complete_account_creation (McdAccountManager *account_manager,
 			   const gchar **object_path,
 			   GError **error)
 {
-    McdAccountManagerPrivate *priv = account_manager->priv;
     McdAccount *account;
     gboolean ok;
 
@@ -209,7 +206,7 @@ complete_account_creation (McdAccountManager *account_manager,
 	g_object_unref (account);
 	account = NULL;
     }
-    mcd_account_manager_write_conf (priv->keyfile);
+    mcd_account_manager_write_conf (account_manager);
     return account;
 }
 
@@ -645,15 +642,29 @@ mcd_account_manager_new (TpDBusDaemon *dbus_daemon)
     return MCD_ACCOUNT_MANAGER (obj);
 }
 
+/**
+ * mcd_account_manager_get_dbus_daemon:
+ * @account_manager: the #McdAccountManager.
+ *
+ * Returns: the #TpDBusDaemon.
+ */
+TpDBusDaemon *
+mcd_account_manager_get_dbus_daemon (McdAccountManager *account_manager)
+{
+    g_return_val_if_fail (MCD_IS_ACCOUNT_MANAGER (account_manager), NULL);
+
+    return account_manager->priv->dbus_daemon;
+}
+
 void
-mcd_account_manager_write_conf (GKeyFile *keyfile)
+mcd_account_manager_write_conf (McdAccountManager *account_manager)
 {
     /* FIXME: this (reasonably) assumes that there is only one
      * McdAccountManager object running, since the write_conf_id is a static
      * variable */
     if (write_conf_id == 0) 
-	write_conf_id = g_timeout_add (WRITE_CONF_DELAY,
-				       write_conf, keyfile);
+        write_conf_id = g_timeout_add (WRITE_CONF_DELAY, write_conf,
+                                       account_manager->priv->keyfile);
 }
 
 GHashTable *
diff --git a/src/mcd-account-manager.h b/src/mcd-account-manager.h
index b6f4a5e..2b6b255 100644
--- a/src/mcd-account-manager.h
+++ b/src/mcd-account-manager.h
@@ -73,10 +73,13 @@ struct _McdAccountManagerClass
 GType mcd_account_manager_get_type (void);
 McdAccountManager *mcd_account_manager_new (TpDBusDaemon *dbus_daemon);
 
+TpDBusDaemon *mcd_account_manager_get_dbus_daemon
+    (McdAccountManager *account_manager);
+
 void _mcd_account_manager_setup (McdAccountManager *account_manager);
 
 GKeyFile *mcd_account_manager_get_config (McdAccountManager *account_manager);
-void mcd_account_manager_write_conf (GKeyFile *keyfile);
+void mcd_account_manager_write_conf (McdAccountManager *account_manager);
 
 McdAccount *mcd_account_manager_lookup_account (McdAccountManager *account_manager,
 						const gchar *name);
diff --git a/src/mcd-account.c b/src/mcd-account.c
index 0c675cb..c7ae4ca 100644
--- a/src/mcd-account.c
+++ b/src/mcd-account.c
@@ -42,7 +42,6 @@
 #include "mcd-account-conditions.h"
 #include "mcd-account-connection.h"
 #include "mcd-account-requests.h"
-#include "mcd-account-manager.h"
 #include "mcd-misc.h"
 #include "mcd-signals-marshal.h"
 #include "mcd-manager.h"
@@ -98,11 +97,9 @@ struct _McdAccountPrivate
     gchar *manager_name;
     gchar *protocol_name;
 
-    /* DBUS connection */
-    TpDBusDaemon *dbus_daemon;
-
     McdConnection *connection;
     McdManager *manager;
+    McdAccountManager *account_manager;
     GKeyFile *keyfile;		/* configuration file */
 
     /* connection status */
@@ -147,7 +144,7 @@ enum
 {
     PROP_0,
     PROP_DBUS_DAEMON,
-    PROP_KEYFILE,
+    PROP_ACCOUNT_MANAGER,
     PROP_NAME,
 };
 
@@ -331,7 +328,7 @@ _mcd_account_delete (McdAccount *account, GError **error)
         g_rmdir (data_dir_str);
     }
     g_free (data_dir_str);
-    mcd_account_manager_write_conf (priv->keyfile);
+    mcd_account_manager_write_conf (priv->account_manager);
     return TRUE;
 }
 
@@ -521,7 +518,7 @@ mcd_account_set_string_val (McdAccount *account, const gchar *key,
 			       key, NULL);
 	string = NULL;
     }
-    mcd_account_manager_write_conf (priv->keyfile);
+    mcd_account_manager_write_conf (priv->account_manager);
     mcd_account_changed_property (account, key, value);
     return TRUE;
 }
@@ -611,7 +608,7 @@ set_enabled (TpSvcDBusProperties *self, const gchar *name, const GValue *value)
 				MC_ACCOUNTS_KEY_ENABLED,
 			       	enabled);
 	priv->enabled = enabled;
-	mcd_account_manager_write_conf (priv->keyfile);
+	mcd_account_manager_write_conf (priv->account_manager);
 	mcd_account_changed_property (account, name, value);
     }
 }
@@ -786,7 +783,7 @@ set_automatic_presence (TpSvcDBusProperties *self,
 
     if (changed)
     {
-	mcd_account_manager_write_conf (priv->keyfile);
+	mcd_account_manager_write_conf (priv->account_manager);
 	mcd_account_changed_property (account, name, value);
     }
 }
@@ -833,7 +830,7 @@ set_connect_automatically (TpSvcDBusProperties *self,
 				MC_ACCOUNTS_KEY_CONNECT_AUTOMATICALLY,
 			       	connect_automatically);
 	priv->connect_automatically = connect_automatically;
-	mcd_account_manager_write_conf (priv->keyfile);
+	mcd_account_manager_write_conf (priv->account_manager);
 	mcd_account_changed_property (account, name, value);
     }
 }
@@ -1224,7 +1221,7 @@ account_update_parameters (McSvcAccount *self, GHashTable *set,
     g_value_unset (&value);
 
     mcd_account_check_validity (account);
-    mcd_account_manager_write_conf (priv->keyfile);
+    mcd_account_manager_write_conf (priv->account_manager);
     mc_svc_account_return_from_update_parameters (context);
 }
 
@@ -1243,10 +1240,14 @@ register_dbus_service (McdAccount *account)
 {
     McdAccountPrivate *priv = account->priv;
     DBusGConnection *dbus_connection;
+    TpDBusDaemon *dbus_daemon;
 
-    if (!priv->dbus_daemon || !priv->object_path) return;
+    if (!priv->account_manager || !priv->object_path) return;
 
-    dbus_connection = TP_PROXY (priv->dbus_daemon)->dbus_connection;
+    dbus_daemon = mcd_account_manager_get_dbus_daemon (priv->account_manager);
+    g_return_if_fail (dbus_daemon != NULL);
+
+    dbus_connection = TP_PROXY (dbus_daemon)->dbus_connection;
 
     if (G_LIKELY (dbus_connection))
 	dbus_g_connection_register_g_object (dbus_connection,
@@ -1260,7 +1261,10 @@ mcd_account_setup (McdAccount *account)
     McdAccountPrivate *priv = account->priv;
     gboolean valid;
 
-    if (!priv->keyfile || !priv->unique_name) return FALSE;
+    if (!priv->account_manager || !priv->unique_name) return FALSE;
+
+    priv->keyfile = mcd_account_manager_get_config (priv->account_manager);
+    if (!priv->keyfile) return FALSE;
 
     priv->manager_name =
 	g_key_file_get_string (priv->keyfile, priv->unique_name,
@@ -1318,15 +1322,11 @@ set_property (GObject *obj, guint prop_id,
 
     switch (prop_id)
     {
-    case PROP_DBUS_DAEMON:
-	if (priv->dbus_daemon)
-	    g_object_unref (priv->dbus_daemon);
-	priv->dbus_daemon = TP_DBUS_DAEMON (g_value_dup_object (val));
-	register_dbus_service (MCD_ACCOUNT (obj));
-	break;
-    case PROP_KEYFILE:
-	g_assert (priv->keyfile == NULL);
-	priv->keyfile = g_value_get_pointer (val);
+    case PROP_ACCOUNT_MANAGER:
+        g_assert (priv->account_manager == NULL);
+        /* don't keep a reference to the account_manager: we can safely assume
+         * its lifetime is longer than the McdAccount's */
+        priv->account_manager = g_value_get_object (val);
 	if (mcd_account_setup (account))
 	    register_dbus_service (account);
 	break;
@@ -1357,7 +1357,8 @@ get_property (GObject *obj, guint prop_id,
     switch (prop_id)
     {
     case PROP_DBUS_DAEMON:
-	g_value_set_object (val, priv->dbus_daemon);
+        g_value_set_object
+            (val, mcd_account_manager_get_dbus_daemon (priv->account_manager));
 	break;
     case PROP_NAME:
 	g_value_set_string (val, priv->unique_name);
@@ -1430,11 +1431,6 @@ _mcd_account_dispose (GObject *object)
 	priv->connection = NULL;
     }
 
-    if (priv->dbus_daemon)
-    {
-	g_object_unref (priv->dbus_daemon);
-	priv->dbus_daemon = NULL;
-    }
     G_OBJECT_CLASS (mcd_account_parent_class)->dispose (object);
 }
 
@@ -1456,12 +1452,12 @@ mcd_account_class_init (McdAccountClass * klass)
     g_object_class_install_property
         (object_class, PROP_DBUS_DAEMON,
          g_param_spec_object ("dbus-daemon", "DBus daemon", "DBus daemon",
-                              TP_TYPE_DBUS_DAEMON,
-                              G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
+                              TP_TYPE_DBUS_DAEMON, G_PARAM_READABLE));
 
     g_object_class_install_property
-        (object_class, PROP_KEYFILE,
-         g_param_spec_pointer ("keyfile", "Conf file", "Conf file",
+        (object_class, PROP_ACCOUNT_MANAGER,
+         g_param_spec_object ("account-manager", "account-manager",
+                               "account-manager", MCD_TYPE_ACCOUNT_MANAGER,
                                G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
 
     g_object_class_install_property
@@ -1539,18 +1535,29 @@ mcd_account_init (McdAccount *account)
 }
 
 McdAccount *
-mcd_account_new (TpDBusDaemon *dbus_daemon, GKeyFile *keyfile,
-		 const gchar *name)
+mcd_account_new (McdAccountManager *account_manager, const gchar *name)
 {
     gpointer *obj;
     obj = g_object_new (MCD_TYPE_ACCOUNT,
-			"dbus-daemon", dbus_daemon,
-			"keyfile", keyfile,
+                        "account-manager", account_manager,
 			"name", name,
 			NULL);
     return MCD_ACCOUNT (obj);
 }
 
+/**
+ * mcd_account_get_account_manager:
+ * @account: the #McdAccount.
+ *
+ * Returns: the #McdAccountManager.
+ */
+McdAccountManager *
+mcd_account_get_account_manager (McdAccount *account)
+{
+    g_return_val_if_fail (MCD_IS_ACCOUNT (account), NULL);
+    return account->priv->account_manager;
+}
+
 /*
  * mcd_account_is_valid:
  * @account: the #McdAccount.
@@ -1854,7 +1861,7 @@ mcd_account_set_normalized_name (McdAccount *account, const gchar *name)
     else
 	g_key_file_remove_key (priv->keyfile, priv->unique_name,
 			       MC_ACCOUNTS_KEY_NORMALIZED_NAME, NULL);
-    mcd_account_manager_write_conf (priv->keyfile);
+    mcd_account_manager_write_conf (priv->account_manager);
 }
 
 gchar *
@@ -1878,7 +1885,7 @@ mcd_account_set_avatar_token (McdAccount *account, const gchar *token)
     else
 	g_key_file_remove_key (priv->keyfile, priv->unique_name,
 			       MC_ACCOUNTS_KEY_AVATAR_TOKEN, NULL);
-    mcd_account_manager_write_conf (priv->keyfile);
+    mcd_account_manager_write_conf (priv->account_manager);
 }
 
 gchar *
@@ -1936,7 +1943,7 @@ mcd_account_set_avatar (McdAccount *account, const GArray *avatar,
     g_signal_emit (account, _mcd_account_signals[AVATAR_CHANGED], 0,
 		   avatar, mime_type);
 
-    mcd_account_manager_write_conf (priv->keyfile);
+    mcd_account_manager_write_conf (priv->account_manager);
     return TRUE;
 }
 
diff --git a/src/mcd-account.h b/src/mcd-account.h
index ac80d9e..c84f75f 100644
--- a/src/mcd-account.h
+++ b/src/mcd-account.h
@@ -43,6 +43,7 @@ typedef struct _McdAccountPrivate McdAccountPrivate;
 typedef struct _McdAccountClass McdAccountClass;
 
 #include "mcd-connection.h"
+#include "mcd-account-manager.h"
 
 struct _McdAccount
 {
@@ -68,9 +69,11 @@ struct _McdAccountClass
 #define MC_ACCOUNT_DBUS_OBJECT_BASE "/org/freedesktop/Telepathy/Account/"
 
 GType mcd_account_get_type (void);
-McdAccount *mcd_account_new (TpDBusDaemon *dbus_daemon, GKeyFile *keyfile,
+McdAccount *mcd_account_new (McdAccountManager *account_manager,
 			     const gchar *name);
 
+McdAccountManager *mcd_account_get_account_manager (McdAccount *account);
+
 gboolean mcd_account_delete (McdAccount *account, GError **error);
 
 const gchar *mcd_account_get_unique_name (McdAccount *account);
-- 
1.5.6.5



More information about the Telepathy-commits mailing list