[Telepathy-commits] [telepathy-mission-control/master] Update account presence on PresencesChanged signal
Alberto Mardegan
alberto.mardegan at nokia.com
Fri Nov 7 05:56:53 PST 2008
Rely on the emission of the PresencesChanged signal to update the account
presence.
---
src/mcd-connection.c | 69 +++++++++++++++++++++-----------------------------
1 files changed, 29 insertions(+), 40 deletions(-)
diff --git a/src/mcd-connection.c b/src/mcd-connection.c
index 7999566..447544f 100644
--- a/src/mcd-connection.c
+++ b/src/mcd-connection.c
@@ -126,11 +126,6 @@ struct presence_info
guint can_have_message : 1;
};
-typedef struct {
- gchar *status;
- gchar *message;
-} McdPresenceData;
-
struct param_data
{
GSList *pr_params;
@@ -199,15 +194,6 @@ static GError * map_tp_error_to_mc_error (McdChannel *channel, const GError *tp_
static void _mcd_connection_setup (McdConnection * connection);
static void _mcd_connection_release_tp_connection (McdConnection *connection);
-static TpConnectionPresenceType presence_str_to_enum (const gchar *presence_str)
-{
- const struct _presence_mapping *mapping;
- for (mapping = presence_mapping; mapping->presence_str; mapping++)
- if (strcmp (presence_str, mapping->presence_str) == 0)
- return mapping->mc_presence;
- return TP_CONNECTION_PRESENCE_TYPE_UNSET;
-}
-
/* Free dynamic members and presence_info itself */
static void
_mcd_connection_free_presence_info (McdConnection * conn)
@@ -231,33 +217,16 @@ _mcd_connection_free_presence_info (McdConnection * conn)
}
static void
-mcd_presence_data_free (gpointer userdata)
-{
- McdPresenceData *pd = userdata;
-
- g_free (pd->status);
- g_free (pd->message);
- g_free (pd);
-}
-
-static void
presence_set_status_cb (TpConnection *proxy, const GError *error,
gpointer user_data, GObject *weak_object)
{
- McdConnectionPrivate *priv = MCD_CONNECTION_PRIV (weak_object);
- McdPresenceData *pd = user_data;
+ McdConnectionPrivate *priv = user_data;
if (error)
{
- g_warning ("%s: Setting presence of %s to %s failed: %s",
+ g_warning ("%s: Setting presence of %s failed: %s",
G_STRFUNC, mcd_account_get_unique_name (priv->account),
- pd->status, error->message);
- }
- else
- {
- mcd_account_set_current_presence (priv->account,
- presence_str_to_enum (pd->status),
- pd->status, pd->message);
+ error->message);
}
}
@@ -266,7 +235,6 @@ _mcd_connection_set_presence (McdConnection * connection,
const gchar *status, const gchar *message)
{
McdConnectionPrivate *priv = connection->priv;
- McdPresenceData *pd;
if (!priv->tp_conn)
{
@@ -279,12 +247,9 @@ _mcd_connection_set_presence (McdConnection * connection,
if (!priv->has_presence_if) return;
- pd = g_malloc (sizeof (McdPresenceData));
- pd->status = g_strdup (status);
- pd->message = g_strdup (message);
tp_cli_connection_interface_simple_presence_call_set_presence
- (priv->tp_conn, -1, status, message, presence_set_status_cb, pd,
- mcd_presence_data_free, (GObject *)connection);
+ (priv->tp_conn, -1, status, message, presence_set_status_cb,
+ priv, NULL, (GObject *)connection);
}
@@ -334,6 +299,27 @@ presence_get_statuses_cb (TpProxy *proxy, const GValue *v_statuses,
}
static void
+on_presences_changed (TpConnection *proxy, GHashTable *presences,
+ gpointer user_data, GObject *weak_object)
+{
+ McdConnectionPrivate *priv = user_data;
+ GValueArray *va;
+
+ va = g_hash_table_lookup (presences, GUINT_TO_POINTER (priv->self_handle));
+ if (va)
+ {
+ TpConnectionPresenceType presence;
+ const gchar *status, *message;
+
+ presence = g_value_get_uint (va->values);
+ status = g_value_get_string (va->values + 1);
+ message = g_value_get_string (va->values + 2);
+ mcd_account_set_current_presence (priv->account,
+ presence, status, message);
+ }
+}
+
+static void
_mcd_connection_setup_presence (McdConnection *connection)
{
McdConnectionPrivate *priv = connection->priv;
@@ -342,6 +328,9 @@ _mcd_connection_setup_presence (McdConnection *connection)
(priv->tp_conn, -1, TP_IFACE_CONNECTION_INTERFACE_SIMPLE_PRESENCE,
"Statuses", presence_get_statuses_cb, priv, NULL,
(GObject *)connection);
+ tp_cli_connection_interface_simple_presence_connect_to_presences_changed
+ (priv->tp_conn, on_presences_changed, priv, NULL,
+ (GObject *)connection, NULL);
}
static void
--
1.5.6.5
More information about the Telepathy-commits
mailing list