[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