[Telepathy-commits] [telepathy-mission-control/master] Common code

Alberto Mardegan alberto.mardegan at nokia.com
Mon Jan 5 01:40:44 PST 2009


---
 libmcclient/mc-account.c |  116 ++++++++++++++++++++--------------------------
 1 files changed, 50 insertions(+), 66 deletions(-)

diff --git a/libmcclient/mc-account.c b/libmcclient/mc-account.c
index 141ff20..4f911ca 100644
--- a/libmcclient/mc-account.c
+++ b/libmcclient/mc-account.c
@@ -41,6 +41,12 @@
  * Account D-Bus API.
  */
 
+typedef struct {
+    TpConnectionPresenceType type;
+    gchar *status;
+    gchar *message;
+} McPresence;
+
 struct _McAccountProps {
     gchar *display_name;
     gchar *icon;
@@ -51,21 +57,18 @@ struct _McAccountProps {
     guint emit_connection_status_changed : 1;
     gchar *nickname;
     GHashTable *parameters;
-    TpConnectionPresenceType auto_presence_type;
-    gchar *auto_presence_status;
-    gchar *auto_presence_message;
+    McPresence auto_presence;
     gchar *connection;
     TpConnectionStatus connection_status;
     TpConnectionStatusReason connection_status_reason;
-    TpConnectionPresenceType curr_presence_type;
-    gchar *curr_presence_status;
-    gchar *curr_presence_message;
-    TpConnectionPresenceType req_presence_type;
-    gchar *req_presence_status;
-    gchar *req_presence_message;
+    McPresence curr_presence;
+    McPresence req_presence;
     gchar *normalized_name;
 };
 
+#define mc_presence_free(presence) \
+    { g_free ((presence)->status); g_free ((presence)->message); }
+
 /**
  * McAccount:
  * @parent: the #TpProxy for the account object.
@@ -186,13 +189,10 @@ account_props_free (McAccountProps *props)
     g_free (props->nickname);
     if (props->parameters)
 	g_hash_table_destroy (props->parameters);
-    g_free (props->auto_presence_status);
-    g_free (props->auto_presence_message);
+    mc_presence_free (&props->auto_presence);
     g_free (props->connection);
-    g_free (props->curr_presence_status);
-    g_free (props->curr_presence_message);
-    g_free (props->req_presence_status);
-    g_free (props->req_presence_message);
+    mc_presence_free (&props->curr_presence);
+    mc_presence_free (&props->req_presence);
     g_free (props->normalized_name);
     g_free (props);
 }
@@ -472,26 +472,34 @@ update_parameters (const gchar *name, const GValue *value,
 }
 
 static void
+update_presence (McAccount *account, McPresence *presence, const GValue *value,
+                 GQuark quark, gboolean emit_changed)
+{
+    GValueArray *va;
+
+    mc_presence_free (presence);
+    va = g_value_get_boxed (value);
+    presence->type = (gint)g_value_get_uint (va->values);
+    presence->status = g_value_dup_string (va->values + 1);
+    presence->message = g_value_dup_string (va->values + 2);
+    if (emit_changed)
+        g_signal_emit (account, _mc_account_signals[PRESENCE_CHANGED],
+                       quark,
+                       quark,
+                       presence->type,
+                       presence->status,
+                       presence->message);
+}
+
+static void
 update_automatic_presence (const gchar *name, const GValue *value,
                            gpointer user_data)
 {
     McAccount *account = MC_ACCOUNT (user_data);
     McAccountProps *props = account->priv->props;
-    GValueArray *va;
 
-    g_free (props->auto_presence_status);
-    g_free (props->auto_presence_message);
-    va = g_value_get_boxed (value);
-    props->auto_presence_type = (gint)g_value_get_uint (va->values);
-    props->auto_presence_status = g_value_dup_string (va->values + 1);
-    props->auto_presence_message = g_value_dup_string (va->values + 2);
-    if (props->emit_changed)
-        g_signal_emit (account, _mc_account_signals[PRESENCE_CHANGED],
-                       MC_QUARK_AUTOMATIC_PRESENCE,
-                       MC_QUARK_AUTOMATIC_PRESENCE,
-                       props->auto_presence_type,
-                       props->auto_presence_status,
-                       props->auto_presence_message);
+    update_presence (account, &props->auto_presence, value,
+                     MC_QUARK_AUTOMATIC_PRESENCE, props->emit_changed);
 }
 
 static void
@@ -555,21 +563,9 @@ update_current_presence (const gchar *name, const GValue *value,
 {
     McAccount *account = MC_ACCOUNT (user_data);
     McAccountProps *props = account->priv->props;
-    GValueArray *va;
 
-    g_free (props->curr_presence_status);
-    g_free (props->curr_presence_message);
-    va = g_value_get_boxed (value);
-    props->curr_presence_type = (gint)g_value_get_uint (va->values);
-    props->curr_presence_status = g_value_dup_string (va->values + 1);
-    props->curr_presence_message = g_value_dup_string (va->values + 2);
-    if (props->emit_changed)
-        g_signal_emit (account, _mc_account_signals[PRESENCE_CHANGED],
-                       MC_QUARK_CURRENT_PRESENCE,
-                       MC_QUARK_CURRENT_PRESENCE,
-                       props->curr_presence_type,
-                       props->curr_presence_status,
-                       props->curr_presence_message);
+    update_presence (account, &props->curr_presence, value,
+                     MC_QUARK_CURRENT_PRESENCE, props->emit_changed);
 }
 
 static void
@@ -578,21 +574,9 @@ update_requested_presence (const gchar *name, const GValue *value,
 {
     McAccount *account = MC_ACCOUNT (user_data);
     McAccountProps *props = account->priv->props;
-    GValueArray *va;
 
-    g_free (props->req_presence_status);
-    g_free (props->req_presence_message);
-    va = g_value_get_boxed (value);
-    props->req_presence_type = (gint)g_value_get_uint (va->values);
-    props->req_presence_status = g_value_dup_string (va->values + 1);
-    props->req_presence_message = g_value_dup_string (va->values + 2);
-    if (props->emit_changed)
-        g_signal_emit (account, _mc_account_signals[PRESENCE_CHANGED],
-                       MC_QUARK_REQUESTED_PRESENCE,
-                       MC_QUARK_REQUESTED_PRESENCE,
-                       props->req_presence_type,
-                       props->req_presence_status,
-                       props->req_presence_message);
+    update_presence (account, &props->req_presence, value,
+                     MC_QUARK_REQUESTED_PRESENCE, props->emit_changed);
 }
 
 static void
@@ -943,11 +927,11 @@ mc_account_get_automatic_presence (McAccount *account,
 	return;
     }
     if (type)
-	*type = props->auto_presence_type;
+	*type = props->auto_presence.type;
     if (status)
-	*status = props->auto_presence_status;
+	*status = props->auto_presence.status;
     if (message)
-	*message = props->auto_presence_message;
+	*message = props->auto_presence.message;
 }
 
 /**
@@ -1049,11 +1033,11 @@ mc_account_get_current_presence (McAccount *account,
 	return;
     }
     if (type)
-	*type = props->curr_presence_type;
+	*type = props->curr_presence.type;
     if (status)
-	*status = props->curr_presence_status;
+	*status = props->curr_presence.status;
     if (message)
-	*message = props->curr_presence_message;
+	*message = props->curr_presence.message;
 }
 
 /**
@@ -1090,11 +1074,11 @@ mc_account_get_requested_presence (McAccount *account,
 	return;
     }
     if (type)
-	*type = props->req_presence_type;
+	*type = props->req_presence.type;
     if (status)
-	*status = props->req_presence_status;
+	*status = props->req_presence.status;
     if (message)
-	*message = props->req_presence_message;
+	*message = props->req_presence.message;
 }
 
 /**
-- 
1.5.6.5




More information about the Telepathy-commits mailing list