[telepathy-gabble/master] Factor out code to add the status, caps and vcard to a presence

Sjoerd Simons sjoerd.simons at collabora.co.uk
Mon Jan 4 02:34:13 PST 2010


---
 src/presence.c |   80 +++++++++++++++++++++++++++++++++----------------------
 src/presence.h |    3 ++
 2 files changed, 51 insertions(+), 32 deletions(-)

diff --git a/src/presence.c b/src/presence.c
index 19a1df1..0d96724 100644
--- a/src/presence.c
+++ b/src/presence.c
@@ -465,26 +465,11 @@ OUT:
   return ret;
 }
 
-LmMessage *
-gabble_presence_as_message (GabblePresence *presence,
-                            const gchar *to)
+void
+gabble_presence_add_status_and_vcard (GabblePresence *presence,
+  WockyXmppStanza *stanza)
 {
-  GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (presence);
-  LmMessage *message;
-  LmMessageNode *node, *subnode;
-  LmMessageSubType subtype;
-  Resource *res = priv->resources->data; /* pick first resource */
-
-  g_assert (NULL != res);
-
-  if (presence->status == GABBLE_PRESENCE_OFFLINE)
-    subtype = LM_MESSAGE_SUB_TYPE_UNAVAILABLE;
-  else
-    subtype = LM_MESSAGE_SUB_TYPE_AVAILABLE;
-
-  message = lm_message_new_with_sub_type (to, LM_MESSAGE_TYPE_PRESENCE,
-              subtype);
-  node = lm_message_get_node (message);
+  WockyXmppNode *vcard_node;
 
   switch (presence->status)
     {
@@ -493,16 +478,20 @@ gabble_presence_as_message (GabblePresence *presence,
     case GABBLE_PRESENCE_HIDDEN:
       break;
     case GABBLE_PRESENCE_AWAY:
-      lm_message_node_add_child (node, "show", JABBER_PRESENCE_SHOW_AWAY);
+      wocky_xmpp_node_add_child_with_content (stanza->node, "show",
+          JABBER_PRESENCE_SHOW_AWAY);
       break;
     case GABBLE_PRESENCE_CHAT:
-      lm_message_node_add_child (node, "show", JABBER_PRESENCE_SHOW_CHAT);
+      wocky_xmpp_node_add_child_with_content (stanza->node, "show",
+          JABBER_PRESENCE_SHOW_CHAT);
       break;
     case GABBLE_PRESENCE_DND:
-      lm_message_node_add_child (node, "show", JABBER_PRESENCE_SHOW_DND);
+      wocky_xmpp_node_add_child_with_content (stanza->node, "show",
+          JABBER_PRESENCE_SHOW_DND);
       break;
     case GABBLE_PRESENCE_XA:
-      lm_message_node_add_child (node, "show", JABBER_PRESENCE_SHOW_XA);
+      wocky_xmpp_node_add_child_with_content (stanza->node, "show",
+          JABBER_PRESENCE_SHOW_XA);
       break;
     default:
       g_critical ("%s: Unexpected Telepathy presence type", G_STRFUNC);
@@ -510,23 +499,50 @@ gabble_presence_as_message (GabblePresence *presence,
     }
 
   if (presence->status_message)
-    lm_message_node_add_child (node, "status", presence->status_message);
+    wocky_xmpp_node_add_child_with_content (stanza->node, "status",
+        presence->status_message);
+
+  vcard_node = wocky_xmpp_node_add_child_ns (stanza->node, "x",
+        NS_VCARD_TEMP_UPDATE);
+
+  if (presence->avatar_sha1 != NULL)
+    {
+      wocky_xmpp_node_add_child_with_content (vcard_node, "photo",
+        presence->avatar_sha1);
+    }
+}
+
+LmMessage *
+gabble_presence_as_message (GabblePresence *presence,
+                            const gchar *to)
+{
+  GabblePresencePrivate *priv = GABBLE_PRESENCE_PRIV (presence);
+  LmMessage *message;
+  LmMessageSubType subtype;
+  Resource *res = priv->resources->data; /* pick first resource */
+
+  g_assert (NULL != res);
+
+  if (presence->status == GABBLE_PRESENCE_OFFLINE)
+    subtype = LM_MESSAGE_SUB_TYPE_UNAVAILABLE;
+  else
+    subtype = LM_MESSAGE_SUB_TYPE_AVAILABLE;
+
+  message = lm_message_new_with_sub_type (to, LM_MESSAGE_TYPE_PRESENCE,
+              subtype);
+
+  gabble_presence_add_status_and_vcard (presence, WOCKY_XMPP_STANZA (message));
 
   if (res->priority)
     {
       gchar *priority = g_strdup_printf ("%d", res->priority);
+      LmMessageNode *node;
+
+      node = lm_message_get_node (message);
       lm_message_node_add_child (node, "priority", priority);
       g_free (priority);
     }
 
-  subnode = lm_message_node_add_child (node, "x", "");
-  lm_message_node_set_attribute (subnode, "xmlns", NS_VCARD_TEMP_UPDATE);
-  /* NULL means we make no particular assertion about the avatar. */
-  if (presence->avatar_sha1 != NULL)
-    {
-      lm_message_node_add_child (subnode, "photo", presence->avatar_sha1);
-    }
-
   return message;
 }
 
diff --git a/src/presence.h b/src/presence.h
index b1422b2..2735013 100644
--- a/src/presence.h
+++ b/src/presence.h
@@ -96,6 +96,9 @@ gboolean gabble_presence_resource_has_caps (GabblePresence *presence,
 
 LmMessage *gabble_presence_as_message (GabblePresence *presence,
     const gchar *to);
+void gabble_presence_add_status_and_vcard (GabblePresence *presence,
+  WockyXmppStanza *stanza);
+
 gchar *gabble_presence_dump (GabblePresence *presence);
 
 gboolean gabble_presence_added_to_view (GabblePresence *presence);
-- 
1.5.6.5




More information about the telepathy-commits mailing list