[telepathy-mission-control/master] McdAccount: push nickname into McdConnection via a method call rather than a signal

Simon McVittie simon.mcvittie at collabora.co.uk
Mon Jun 1 09:52:35 PDT 2009


The "larger" object should be calling methods on the "smaller", and the
"smaller" should be receiving signals from the "larger" (McdAccount is
"larger" than McdConnection and should depend on it, and the converse
is false).
---
 src/mcd-account.c         |   52 +++++++++++++++++++++++++++++++++++---------
 src/mcd-connection-priv.h |    3 ++
 src/mcd-connection.c      |   36 +++++++-----------------------
 3 files changed, 53 insertions(+), 38 deletions(-)

diff --git a/src/mcd-account.c b/src/mcd-account.c
index 23bb7ab..2089d6d 100644
--- a/src/mcd-account.c
+++ b/src/mcd-account.c
@@ -161,7 +161,6 @@ enum
     CONNECTION_STATUS_CHANGED,
     VALIDITY_CHANGED,
     AVATAR_CHANGED,
-    ALIAS_CHANGED,
     LAST_SIGNAL
 };
 
@@ -816,10 +815,11 @@ set_nickname (TpSvcDBusProperties *self, const gchar *name,
     DEBUG ("called for %s", priv->unique_name);
     ret = mcd_account_set_string_val (account, name, value, error);
 
-    if (ret == SET_RESULT_CHANGED)
+    if (ret == SET_RESULT_CHANGED && priv->connection != NULL)
     {
-        g_signal_emit (account, _mcd_account_signals[ALIAS_CHANGED], 0,
-                       g_value_get_string (value));
+        /* this is a no-op if the connection doesn't support it */
+        _mcd_connection_set_nickname (priv->connection,
+                                      g_value_get_string (value));
     }
 
     return (ret != SET_RESULT_ERROR);
@@ -1897,13 +1897,6 @@ mcd_account_class_init (McdAccountClass * klass)
 		      G_TYPE_NONE, 2,
 		      dbus_g_type_get_collection ("GArray", G_TYPE_UCHAR),
 		      G_TYPE_STRING);
-    _mcd_account_signals[ALIAS_CHANGED] =
-	g_signal_new ("alias-changed",
-		      G_OBJECT_CLASS_TYPE (klass),
-		      G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED,
-		      0,
-		      NULL, NULL, g_cclosure_marshal_VOID__STRING,
-		      G_TYPE_NONE, 1, G_TYPE_STRING);
     _mcd_account_compat_class_init (klass);
     _mcd_account_connection_class_init (klass);
 
@@ -2622,6 +2615,27 @@ _mcd_account_load (McdAccount *account, McdAccountLoadCb callback,
     MCD_ACCOUNT_GET_CLASS (account)->load (account, callback, user_data);
 }
 
+static void
+mcd_account_connection_ready_cb (McdAccount *account,
+                                 McdConnection *connection)
+{
+    McdAccountPrivate *priv = account->priv;
+    gchar *nickname;
+
+    g_return_if_fail (MCD_IS_ACCOUNT (account));
+    g_return_if_fail (connection == priv->connection);
+
+    nickname = mcd_account_get_alias (account);
+
+    if (nickname != NULL)
+    {
+        /* this is a no-op if the connection doesn't support it */
+        _mcd_connection_set_nickname (connection, nickname);
+    }
+
+    g_free (nickname);
+}
+
 void
 _mcd_account_set_connection (McdAccount *account, McdConnection *connection)
 {
@@ -2641,13 +2655,29 @@ _mcd_account_set_connection (McdAccount *account, McdConnection *connection)
         g_signal_handlers_disconnect_by_func (priv->connection,
                                               on_conn_status_changed,
                                               account);
+        g_signal_handlers_disconnect_by_func (priv->connection,
+                                              mcd_account_connection_ready_cb,
+                                              account);
         g_object_unref (priv->connection);
     }
+
     priv->connection = connection;
+
     if (connection)
     {
         g_return_if_fail (MCD_IS_CONNECTION (connection));
         g_object_ref (connection);
+
+        if (_mcd_connection_is_ready (connection))
+        {
+            mcd_account_connection_ready_cb (account, connection);
+        }
+        else
+        {
+            g_signal_connect_swapped (connection, "ready",
+                G_CALLBACK (mcd_account_connection_ready_cb), account);
+        }
+
         g_signal_connect (connection, "self-presence-changed",
                           G_CALLBACK (on_conn_self_presence_changed), account);
         g_signal_connect (connection, "connection-status-changed",
diff --git a/src/mcd-connection-priv.h b/src/mcd-connection-priv.h
index b394947..694c055 100644
--- a/src/mcd-connection-priv.h
+++ b/src/mcd-connection-priv.h
@@ -48,6 +48,9 @@ G_GNUC_INTERNAL void _mcd_connection_start_dispatching (McdConnection *self);
 
 G_GNUC_INTERNAL gboolean _mcd_connection_is_ready (McdConnection *self);
 
+G_GNUC_INTERNAL void _mcd_connection_set_nickname (McdConnection *self,
+                                                   const gchar *nickname);
+
 G_END_DECLS
 
 #endif
diff --git a/src/mcd-connection.c b/src/mcd-connection.c
index e2cc25b..c2ac83b 100644
--- a/src/mcd-connection.c
+++ b/src/mcd-connection.c
@@ -873,20 +873,23 @@ aliasing_set_aliases_cb (TpConnection *proxy, const GError *error,
     }
 }
 
-static void
-_mcd_connection_set_alias (McdConnection *connection,
-			   const gchar *alias)
+void
+_mcd_connection_set_nickname (McdConnection *connection,
+                              const gchar *nickname)
 {
     McdConnectionPrivate *priv = connection->priv;
     GHashTable *aliases;
     TpHandle self_handle;
 
-    DEBUG ("setting alias '%s'", alias);
+    if (!priv->has_alias_if)
+        return;
+
+    DEBUG ("setting nickname '%s' using Aliasing", nickname);
 
     aliases = g_hash_table_new (NULL, NULL);
     self_handle = tp_connection_get_self_handle (priv->tp_conn);
-    g_hash_table_insert (aliases, GINT_TO_POINTER(self_handle),
-			 (gchar *)alias);
+    g_hash_table_insert (aliases, GUINT_TO_POINTER (self_handle),
+                         (gchar *) nickname);
     tp_cli_connection_interface_aliasing_call_set_aliases (priv->tp_conn, -1,
 							   aliases,
 							   aliasing_set_aliases_cb,
@@ -896,30 +899,15 @@ _mcd_connection_set_alias (McdConnection *connection,
 }
 
 static void
-on_account_alias_changed (McdAccount *account, const gchar *alias,
-			  McdConnection *connection)
-{
-    McdConnectionPrivate *priv = MCD_CONNECTION_PRIV (connection);
-
-    if (!priv->has_alias_if) return;
-    _mcd_connection_set_alias (connection, alias);
-}
-
-static void
 _mcd_connection_setup_alias (McdConnection *connection)
 {
     McdConnectionPrivate *priv = connection->priv;
-    gchar *alias;
 
     tp_cli_connection_interface_aliasing_connect_to_aliases_changed (priv->tp_conn,
 								     on_aliases_changed,
 								     priv, NULL,
 								     (GObject *)connection,
 								     NULL);
-    alias = mcd_account_get_alias (priv->account);
-    if (alias && (!priv->alias || strcmp (priv->alias, alias) != 0))
-	_mcd_connection_set_alias (connection, alias);
-    g_free (alias);
 }
 
 static gboolean
@@ -1588,9 +1576,6 @@ _mcd_connection_dispose (GObject * object)
 	g_signal_handlers_disconnect_by_func (priv->account,
 					      G_CALLBACK (on_account_avatar_changed),
 					      object);
-	g_signal_handlers_disconnect_by_func (priv->account,
-					      G_CALLBACK (on_account_alias_changed),
-					      object);
         g_signal_handlers_disconnect_by_func (priv->account,
                                               G_CALLBACK (on_account_removed),
                                               object);
@@ -1663,9 +1648,6 @@ _mcd_connection_set_property (GObject * obj, guint prop_id,
 	g_signal_connect (priv->account,
 			  "mcd-avatar-changed",
 			  G_CALLBACK (on_account_avatar_changed), obj);
-	g_signal_connect (priv->account,
-			  "alias-changed",
-			  G_CALLBACK (on_account_alias_changed), obj);
         g_signal_connect (priv->account, "removed",
                           G_CALLBACK (on_account_removed),
                           obj);
-- 
1.5.6.5




More information about the telepathy-commits mailing list