[telepathy-gabble/master] Detect whether we're talking to a GTalk03 or a GTalk04 client

Sjoerd Simons sjoerd.simons at collabora.co.uk
Thu Jun 25 09:59:42 PDT 2009


---
 src/jingle-session.c |   52 +++++++++++++++++++++++++++++++++++++++++++++----
 1 files changed, 47 insertions(+), 5 deletions(-)

diff --git a/src/jingle-session.c b/src/jingle-session.c
index c245f00..f8a7408 100644
--- a/src/jingle-session.c
+++ b/src/jingle-session.c
@@ -818,8 +818,36 @@ on_session_initiate (GabbleJingleSession *sess, LmMessageNode *node,
       return;
     }
 
-  if ((priv->dialect == JINGLE_DIALECT_GTALK3) ||
-      (priv->dialect == JINGLE_DIALECT_GTALK4))
+  if ((priv->dialect == JINGLE_DIALECT_GTALK3))
+    {
+       const gchar *content_ns = NULL;
+       LmMessageNode *desc_node =
+          lm_message_node_get_child_any_ns (node, "description");
+      content_ns = lm_message_node_get_namespace (desc_node);
+
+      if (!tp_strdiff (content_ns, NS_GOOGLE_SESSION_VIDEO))
+        {
+          GType content_type = 0;
+
+          DEBUG ("GTalk v3 session with audio and video");
+
+          /* audio and video content */
+          content_type = gabble_jingle_factory_lookup_content_type (
+            priv->conn->jingle_factory, content_ns);
+          create_content (sess, content_type, JINGLE_MEDIA_TYPE_VIDEO,
+            NS_GOOGLE_SESSION_VIDEO, NULL, "video", node, error);
+
+          content_type = gabble_jingle_factory_lookup_content_type (
+            priv->conn->jingle_factory, NS_GOOGLE_SESSION_PHONE);
+          create_content (sess, content_type, JINGLE_MEDIA_TYPE_AUDIO,
+            NS_GOOGLE_SESSION_PHONE, NULL, "audio", node, error);
+        }
+      else
+        {
+          _each_content_add (sess, NULL, node, error);
+        }
+    }
+   else if (priv->dialect == JINGLE_DIALECT_GTALK4)
     {
       /* in this case we implicitly have just one content */
       _each_content_add (sess, NULL, node, error);
@@ -1243,6 +1271,22 @@ jingle_state_machine_dance (GabbleJingleSession *sess,
   handlers[action] (sess, node, error);
 }
 
+static JingleDialect
+detect_google_dialect (LmMessageNode *session_node)
+{
+  /* The GTALK3 dialect is the only one that supports video at this time */
+  if (lm_message_node_get_child_with_namespace (session_node,
+      "description", NS_GOOGLE_SESSION_VIDEO) != NULL)
+    return JINGLE_DIALECT_GTALK3;
+
+  /* GTalk4 has a transport item, GTalk3 doesn't */
+  if (lm_message_node_get_child_with_namespace (session_node,
+      "transport", NS_GOOGLE_TRANSPORT_P2P) == NULL)
+    return JINGLE_DIALECT_GTALK3;
+
+  return JINGLE_DIALECT_GTALK4;
+}
+
 const gchar *
 gabble_jingle_session_detect (LmMessage *message, JingleAction *action, JingleDialect *dialect)
 {
@@ -1284,11 +1328,9 @@ gabble_jingle_session_detect (LmMessage *message, JingleAction *action, JingleDi
           session_node = lm_message_node_get_child_with_namespace (iq_node,
               "session", NS_GOOGLE_SESSION);
 
-          /* we can't distinguish between libjingle 0.3 and libjingle0.4 at this
-           * point, assume the better case */
           if (session_node != NULL)
             {
-              *dialect = JINGLE_DIALECT_GTALK4;
+              *dialect = detect_google_dialect (session_node);
               google_mode = TRUE;
             }
           else
-- 
1.5.6.5




More information about the telepathy-commits mailing list