[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