[telepathy-mission-control/master] McdAccount, McdConnection: transfer remote nickname changes from C to A via a signal

Simon McVittie simon.mcvittie at collabora.co.uk
Mon Jun 1 10:12:05 PDT 2009


Ideally, the Connection would know nothing about the Account. This is a
step in that direction.
---
 .../tmpl/mcd-connection.sgml                       |    8 +++
 src/mcd-account.c                                  |   10 +++-
 src/mcd-connection.c                               |   50 +++++++++++--------
 3 files changed, 45 insertions(+), 23 deletions(-)

diff --git a/doc/reference/libmissioncontrol-server/tmpl/mcd-connection.sgml b/doc/reference/libmissioncontrol-server/tmpl/mcd-connection.sgml
index b96b1ce..647b698 100644
--- a/doc/reference/libmissioncontrol-server/tmpl/mcd-connection.sgml
+++ b/doc/reference/libmissioncontrol-server/tmpl/mcd-connection.sgml
@@ -39,6 +39,14 @@ McdConnection
 
 @mcdconnection: the object which received the signal.
 
+<!-- ##### SIGNAL McdConnection::self-nickname-changed ##### -->
+<para>
+
+</para>
+
+ at mcdconnection: the object which received the signal.
+ at arg1: 
+
 <!-- ##### SIGNAL McdConnection::self-presence-changed ##### -->
 <para>
 
diff --git a/src/mcd-account.c b/src/mcd-account.c
index 2089d6d..3ff8549 100644
--- a/src/mcd-account.c
+++ b/src/mcd-account.c
@@ -2345,8 +2345,10 @@ _mcd_account_get_avatar (McdAccount *account, GArray **avatar,
     g_free (filename);
 }
 
-void
-_mcd_account_set_alias (McdAccount *account, const gchar *alias)
+static void
+mcd_account_connection_self_nickname_changed_cb (McdAccount *account,
+                                                 const gchar *alias,
+                                                 McdConnection *connection)
 {
     GValue value = { 0 };
 
@@ -2678,6 +2680,10 @@ _mcd_account_set_connection (McdAccount *account, McdConnection *connection)
                 G_CALLBACK (mcd_account_connection_ready_cb), account);
         }
 
+        g_signal_connect_swapped (connection, "self-nickname-changed",
+                G_CALLBACK (mcd_account_connection_self_nickname_changed_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.c b/src/mcd-connection.c
index c2ac83b..e4cf466 100644
--- a/src/mcd-connection.c
+++ b/src/mcd-connection.c
@@ -54,6 +54,8 @@
 #include <telepathy-glib/gtypes.h>
 #include <telepathy-glib/connection.h>
 #include <telepathy-glib/proxy-subclass.h>
+#include <telepathy-glib/util.h>
+
 #include <libmcclient/mc-errors.h>
 
 #include "mcd-account-priv.h"
@@ -150,6 +152,7 @@ enum
 {
     READY,
     SELF_PRESENCE_CHANGED,
+    SELF_NICKNAME_CHANGED,
     CONNECTION_STATUS_CHANGED,
     N_SIGNALS
 };
@@ -832,34 +835,33 @@ on_aliases_changed (TpConnection *proxy, const GPtrArray *aliases,
 		    gpointer user_data, GObject *weak_object)
 {
     McdConnectionPrivate *priv = user_data;
-    GType type;
-    gchar *alias;
-    guint contact;
+    guint self_handle;
     guint i;
 
     DEBUG ("called");
-    type = dbus_g_type_get_struct ("GValueArray", G_TYPE_UINT, G_TYPE_STRING,
-				   G_TYPE_INVALID);
+
+    self_handle = tp_connection_get_self_handle (proxy);
+
     for (i = 0; i < aliases->len; i++)
     {
-	GValue data = { 0 };
+        GValueArray *structure = g_ptr_array_index (aliases, i);
 
-	g_value_init (&data, type);
-	g_value_set_static_boxed (&data, g_ptr_array_index(aliases, i));
-	dbus_g_type_struct_get (&data, 0, &contact, 1, &alias, G_MAXUINT);
-        DEBUG ("Got alias for contact %u: %s", contact, alias);
-	if (contact == tp_connection_get_self_handle (proxy))
-	{
-            DEBUG ("This is our alias");
-	    if (!priv->alias || strcmp (priv->alias, alias) != 0)
-	    {
+        if (g_value_get_uint (structure->values) == self_handle)
+        {
+            const gchar *alias = g_value_get_string (structure->values + 1);
+
+            DEBUG ("Our alias on %s changed to %s",
+                   tp_proxy_get_object_path (proxy), alias);
+
+            if (priv->alias == NULL || tp_strdiff (priv->alias, alias))
+            {
                 g_free (priv->alias);
-                priv->alias = alias;
-                _mcd_account_set_alias (priv->account, alias);
-	    }
-	    break;
-	}
-	g_free (alias);
+                priv->alias = g_strdup (alias);
+                g_signal_emit (weak_object, signals[SELF_NICKNAME_CHANGED],
+                               0, alias);
+            }
+            break;
+        }
     }
 }
 
@@ -1830,6 +1832,12 @@ mcd_connection_class_init (McdConnectionClass * klass)
         NULL, NULL, _mcd_marshal_VOID__UINT_STRING_STRING,
         G_TYPE_NONE, 3, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING);
 
+    signals[SELF_NICKNAME_CHANGED] = g_signal_new ("self-nickname-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);
+
     signals[CONNECTION_STATUS_CHANGED] = g_signal_new (
         "connection-status-changed", G_OBJECT_CLASS_TYPE (klass),
         G_SIGNAL_RUN_LAST | G_SIGNAL_DETAILED, 0,
-- 
1.5.6.5




More information about the telepathy-commits mailing list