[telepathy-mission-control/master] McdAccount: put McdAccountConnectionContext in a private struct field rather than qdata

Simon McVittie simon.mcvittie at collabora.co.uk
Wed Apr 15 06:54:54 PDT 2009


---
 src/mcd-account-connection.c |   34 ++++++++++++++--------------------
 src/mcd-account-priv.h       |   13 +++++++++++++
 src/mcd-account.c            |   29 +++++++++++++++++++++++++++--
 3 files changed, 54 insertions(+), 22 deletions(-)

diff --git a/src/mcd-account-connection.c b/src/mcd-account-connection.c
index e731426..d0574e7 100644
--- a/src/mcd-account-connection.c
+++ b/src/mcd-account-connection.c
@@ -36,21 +36,20 @@
 #include "mcd-account-manager.h"
 #include "mcd-connection-priv.h"
 
-typedef struct {
+struct _McdAccountConnectionContext {
     GHashTable *params;
     gint i_filter;
-} McdAccountConnectionContext;
-
-static GQuark account_connection_context_quark;
+};
 
 static guint _mcd_account_signal_connection_process = 0;
 
-static void
-context_free (gpointer ptr)
+void
+_mcd_account_connection_context_free (McdAccountConnectionContext *c)
 {
-    McdAccountConnectionContext *ctx = ptr;
+    /* params are borrowed from the account, so don't free them.
+     * FIXME: fragile! */
 
-    g_free (ctx);
+    g_free (c);
 }
 
 void
@@ -59,9 +58,11 @@ _mcd_account_connection_begin (McdAccount *account)
     McdAccountConnectionContext *ctx;
 
     /* check whether a connection process is already ongoing */
-    if (g_object_get_qdata (G_OBJECT (account),
-                            account_connection_context_quark))
+    if (_mcd_account_get_connection_context (account) != NULL)
+    {
+        DEBUG ("already trying to connect");
         return;
+    }
 
     /* get account params */
     /* create dynamic params HT */
@@ -69,10 +70,7 @@ _mcd_account_connection_begin (McdAccount *account)
     ctx = g_malloc (sizeof (McdAccountConnectionContext));
     ctx->i_filter = 0;
     ctx->params = mcd_account_get_parameters (account);
-    g_object_set_qdata_full ((GObject *)account,
-			     account_connection_context_quark,
-			     ctx, context_free);
-
+    _mcd_account_set_connection_context (account, ctx);
     mcd_account_connection_proceed (account, TRUE);
 }
 
@@ -88,8 +86,7 @@ mcd_account_connection_proceed (McdAccount *account, gboolean success)
      * if everything is fine, call mcd_manager_create_connection() and
      * _mcd_connection_connect () with the dynamic parameters. Remove that call
      * from mcd_manager_create_connection() */
-    ctx = g_object_get_qdata ((GObject *)account,
-			      account_connection_context_quark);
+    ctx = _mcd_account_get_connection_context (account);
     g_return_if_fail (ctx != NULL);
 
     if (success)
@@ -120,8 +117,7 @@ mcd_account_connection_proceed (McdAccount *account, gboolean success)
                                  mcd_account_get_unique_name (account));
             _mcd_account_online_request_completed (account, error);
         }
-	g_object_set_qdata ((GObject *)account,
-			    account_connection_context_quark, NULL);
+        _mcd_account_set_connection_context (account, NULL);
     }
 }
 
@@ -135,7 +131,5 @@ _mcd_account_connection_class_init (McdAccountClass *klass)
 		      0,
 		      NULL, NULL, g_cclosure_marshal_VOID__BOOLEAN,
 		      G_TYPE_NONE, 1, G_TYPE_BOOLEAN);
-
-    account_connection_context_quark = g_quark_from_static_string ("accontext");
 }
 
diff --git a/src/mcd-account-priv.h b/src/mcd-account-priv.h
index 4b4e54b..781141d 100644
--- a/src/mcd-account-priv.h
+++ b/src/mcd-account-priv.h
@@ -140,5 +140,18 @@ G_GNUC_INTERNAL void _mcd_account_proceed_with_request (McdAccount *account,
 void account_channelrequests_iface_init
     (McSvcAccountInterfaceChannelRequestsClass *iface, gpointer iface_data);
 
+typedef struct _McdAccountConnectionContext McdAccountConnectionContext;
+
+G_GNUC_INTERNAL
+McdAccountConnectionContext *_mcd_account_get_connection_context
+    (McdAccount *self);
+
+G_GNUC_INTERNAL
+void _mcd_account_set_connection_context (McdAccount *self,
+                                          McdAccountConnectionContext *c);
+
+G_GNUC_INTERNAL void _mcd_account_connection_context_free
+    (McdAccountConnectionContext *c);
+
 #endif /* __MCD_ACCOUNT_PRIV_H__ */
 
diff --git a/src/mcd-account.c b/src/mcd-account.c
index 5c60bf6..696c73e 100644
--- a/src/mcd-account.c
+++ b/src/mcd-account.c
@@ -109,6 +109,7 @@ struct _McdAccountPrivate
     McdManager *manager;
     McdAccountManager *account_manager;
     McdTransport *transport;
+    McdAccountConnectionContext *connection_context;
     GKeyFile *keyfile;		/* configuration file */
 
     /* connection status */
@@ -1527,7 +1528,8 @@ _mcd_account_finalize (GObject *object)
 static void
 _mcd_account_dispose (GObject *object)
 {
-    McdAccountPrivate *priv = MCD_ACCOUNT_PRIV (object);
+    McdAccount *self = MCD_ACCOUNT (object);
+    McdAccountPrivate *priv = self->priv;
 
     DEBUG ("called for %s", priv->unique_name);
     if (priv->online_requests)
@@ -1555,7 +1557,8 @@ _mcd_account_dispose (GObject *object)
 	priv->manager = NULL;
     }
 
-    _mcd_account_set_connection (MCD_ACCOUNT (object), NULL);
+    _mcd_account_set_connection_context (self, NULL);
+    _mcd_account_set_connection (self, NULL);
 
     G_OBJECT_CLASS (mcd_account_parent_class)->dispose (object);
 }
@@ -2506,3 +2509,25 @@ _mcd_account_connection_get_transport (McdAccount *account)
 
     return account->priv->transport;
 }
+
+McdAccountConnectionContext *
+_mcd_account_get_connection_context (McdAccount *self)
+{
+    g_return_val_if_fail (MCD_IS_ACCOUNT (self), NULL);
+
+    return self->priv->connection_context;
+}
+
+void
+_mcd_account_set_connection_context (McdAccount *self,
+                                     McdAccountConnectionContext *c)
+{
+    g_return_if_fail (MCD_IS_ACCOUNT (self));
+
+    if (self->priv->connection_context == NULL)
+    {
+        _mcd_account_connection_context_free (self->priv->connection_context);
+    }
+
+    self->priv->connection_context = c;
+}
-- 
1.5.6.5



More information about the telepathy-commits mailing list