[telepathy-gabble/telepathy-gabble-0.8] Expose <reason><text> as MembersChanged message

Will Thompson will.thompson at collabora.co.uk
Mon Sep 28 14:38:33 PDT 2009


---
 src/jingle-factory.c                               |    5 +-
 src/jingle-session.c                               |   63 ++++++++++++-------
 src/media-channel.c                                |    7 ++-
 tests/twisted/jingle/jingletest2.py                |    8 ++-
 .../twisted/jingle/test-outgoing-call-rejected.py  |   11 ++-
 5 files changed, 62 insertions(+), 32 deletions(-)

diff --git a/src/jingle-factory.c b/src/jingle-factory.c
index 1dbf23a..ae3ec3d 100644
--- a/src/jingle-factory.c
+++ b/src/jingle-factory.c
@@ -101,7 +101,9 @@ static GabbleJingleSession *create_session (GabbleJingleFactory *fac,
     gboolean local_hold);
 
 static void session_terminated_cb (GabbleJingleSession *sess,
-    gboolean local_terminator, TpChannelGroupChangeReason reason,
+    gboolean local_terminator,
+    TpChannelGroupChangeReason reason,
+    const gchar *text,
     GabbleJingleFactory *fac);
 
 static void connection_status_changed_cb (GabbleConnection *conn,
@@ -925,6 +927,7 @@ static void
 session_terminated_cb (GabbleJingleSession *session,
                        gboolean local_terminator,
                        TpChannelGroupChangeReason reason,
+                       const gchar *text,
                        GabbleJingleFactory *factory)
 {
   gchar *key = make_session_map_key (session->peer,
diff --git a/src/jingle-session.c b/src/jingle-session.c
index d76e996..1c0b1b4 100644
--- a/src/jingle-session.c
+++ b/src/jingle-session.c
@@ -468,8 +468,8 @@ gabble_jingle_session_class_init (GabbleJingleSessionClass *cls)
 
   signals[TERMINATED] = g_signal_new ("terminated",
         G_TYPE_FROM_CLASS (cls), G_SIGNAL_RUN_LAST,
-        0, NULL, NULL, gabble_marshal_VOID__BOOLEAN_UINT,
-        G_TYPE_NONE, 2, G_TYPE_BOOLEAN, G_TYPE_UINT);
+        0, NULL, NULL, gabble_marshal_VOID__BOOLEAN_UINT_STRING,
+        G_TYPE_NONE, 3, G_TYPE_BOOLEAN, G_TYPE_UINT, G_TYPE_STRING);
 
   signals[REMOTE_STATE_CHANGED] = g_signal_new ("remote-state-changed",
         G_TYPE_FROM_CLASS (cls), G_SIGNAL_RUN_LAST,
@@ -583,8 +583,10 @@ action_is_allowed (JingleAction action, JingleState state)
 
 static void gabble_jingle_session_send_rtp_info (GabbleJingleSession *sess,
     const gchar *name);
-static void set_state (GabbleJingleSession *sess, JingleState state,
-    TpChannelGroupChangeReason termination_reason);
+static void set_state (GabbleJingleSession *sess,
+    JingleState state,
+    TpChannelGroupChangeReason termination_reason,
+    const gchar *text);
 static GabbleJingleContent *_get_any_content (GabbleJingleSession *session);
 
 static gboolean
@@ -982,7 +984,7 @@ on_session_initiate (GabbleJingleSession *sess, LmMessageNode *node,
        * disposition; resolve this as soon as the proper procedure is defined
        * in XEP-0166. */
 
-      set_state (sess, JS_STATE_PENDING_INITIATED, 0);
+      set_state (sess, JS_STATE_PENDING_INITIATED, 0, NULL);
 
       gabble_jingle_session_send_rtp_info (sess, "ringing");
     }
@@ -1065,7 +1067,7 @@ on_session_accept (GabbleJingleSession *sess, LmMessageNode *node,
   if (*error != NULL)
       return;
 
-  set_state (sess, JS_STATE_ACTIVE, 0);
+  set_state (sess, JS_STATE_ACTIVE, 0, NULL);
 
   if (priv->dialect != JINGLE_DIALECT_V032)
     {
@@ -1278,6 +1280,7 @@ on_session_terminate (GabbleJingleSession *sess, LmMessageNode *node,
     GError **error)
 {
   TpChannelGroupChangeReason reason = TP_CHANNEL_GROUP_CHANGE_REASON_NONE;
+  const gchar *text = NULL;
   LmMessageNode *n = lm_message_node_get_child (node, "reason");
   ReasonMapping *m = NULL;
   NodeIter i;
@@ -1285,27 +1288,36 @@ on_session_terminate (GabbleJingleSession *sess, LmMessageNode *node,
   /* If the session-terminate stanza has a <reason> child, then iterate across
    * its children, looking for a child whose name we recognise as a
    * machine-readable reason for the call ending (looked up from the table
-   * above). (The XEP also defines <text> for a human-readable message. TODO:
-   * expose and send that as the group change message.) Once we find a reason
-   * we recognise, break out of both loops.
+   * above), and a <text> node containing a human-readable message.
    */
   if (n != NULL)
     for (i = node_iter (n); i; i = node_iter_next (i))
       {
+        const gchar *name;
+
         n = node_iter_data (i);
 
+        name = lm_message_node_get_name (n);
+
+        if (!tp_strdiff (name, "text"))
+          {
+            text = lm_message_node_get_value (n);
+            continue;
+          }
+
         for (m = reasons; m->element != NULL; m++)
-          if (!tp_strdiff (m->element, lm_message_node_get_name (n)))
+          if (!tp_strdiff (m->element, name))
             {
               reason = m->reason;
-              goto pub;
+              break;
             }
       }
 
-pub:
-  DEBUG ("remote end terminated the session with reason %s (%u)",
-      (m != NULL && m->element != NULL ? m->element : "(none)"), reason);
-  set_state (sess, JS_STATE_ENDED, reason);
+  DEBUG ("remote end terminated the session with reason %s (%u) "
+      "and text '%s'",
+      (m != NULL && m->element != NULL ? m->element : "(none)"), reason,
+      (text != NULL ? text : "(none)"));
+  set_state (sess, JS_STATE_ENDED, reason, text);
 }
 
 static void
@@ -1757,7 +1769,7 @@ _on_initiate_reply (GObject *sess_as_obj,
 
   if (success)
     {
-      set_state (sess, JS_STATE_PENDING_INITIATED, 0);
+      set_state (sess, JS_STATE_PENDING_INITIATED, 0, NULL);
 
       if (priv->dialect != JINGLE_DIALECT_V032)
         {
@@ -1770,7 +1782,8 @@ _on_initiate_reply (GObject *sess_as_obj,
     }
   else
     {
-      set_state (sess, JS_STATE_ENDED, TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
+      set_state (sess, JS_STATE_ENDED, TP_CHANNEL_GROUP_CHANGE_REASON_NONE,
+          NULL);
     }
 }
 
@@ -1783,12 +1796,13 @@ _on_accept_reply (GObject *sess_as_obj,
 
   if (success)
     {
-      set_state (sess, JS_STATE_ACTIVE, 0);
+      set_state (sess, JS_STATE_ACTIVE, 0, NULL);
       gabble_jingle_session_send_rtp_info (sess, "active");
     }
   else
     {
-      set_state (sess, JS_STATE_ENDED, TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
+      set_state (sess, JS_STATE_ENDED, TP_CHANNEL_GROUP_CHANGE_REASON_NONE,
+          NULL);
     }
 }
 
@@ -1879,7 +1893,7 @@ try_session_initiate_or_accept (GabbleJingleSession *sess)
 
   _map_initial_contents (sess, _fill_content, sess_node);
   gabble_jingle_session_send (sess, msg, handler, (GObject *) sess);
-  set_state (sess, new_state, 0);
+  set_state (sess, new_state, 0, NULL);
 
   /* now all initial contents can transmit their candidates */
   _map_initial_contents (sess, _transmit_candidates, NULL);
@@ -1891,11 +1905,14 @@ try_session_initiate_or_accept (GabbleJingleSession *sess)
  * @state: the new state for the session
  * @termination_reason: if @state is JS_STATE_ENDED, the reason the session
  *                      ended. Otherwise, must be 0.
+ * @text: if @state is JS_STATE_ENDED, the human-readable reason the session
+ *        ended.
  */
 static void
 set_state (GabbleJingleSession *sess,
            JingleState state,
-           TpChannelGroupChangeReason termination_reason)
+           TpChannelGroupChangeReason termination_reason,
+           const gchar *text)
 {
   GabbleJingleSessionPrivate *priv = sess->priv;
 
@@ -1921,7 +1938,7 @@ set_state (GabbleJingleSession *sess,
 
   if (state == JS_STATE_ENDED)
     g_signal_emit (sess, signals[TERMINATED], 0, priv->locally_terminated,
-        termination_reason);
+        termination_reason, text);
 }
 
 void
@@ -2008,7 +2025,7 @@ gabble_jingle_session_terminate (GabbleJingleSession *sess,
 
   DEBUG ("we are terminating this session");
   priv->locally_terminated = TRUE;
-  set_state (sess, JS_STATE_ENDED, reason);
+  set_state (sess, JS_STATE_ENDED, reason, text);
 
   return TRUE;
 }
diff --git a/src/media-channel.c b/src/media-channel.c
index 5199f80..6b0812f 100644
--- a/src/media-channel.c
+++ b/src/media-channel.c
@@ -182,7 +182,9 @@ gabble_media_channel_init (GabbleMediaChannel *self)
 static void session_state_changed_cb (GabbleJingleSession *session,
     GParamSpec *arg1, GabbleMediaChannel *channel);
 static void session_terminated_cb (GabbleJingleSession *session,
-    gboolean local_terminator, TpChannelGroupChangeReason reason,
+    gboolean local_terminator,
+    TpChannelGroupChangeReason reason,
+    const gchar *text,
     gpointer user_data);
 static void session_new_content_cb (GabbleJingleSession *session,
     GabbleJingleContent *c, gpointer user_data);
@@ -2272,6 +2274,7 @@ static void
 session_terminated_cb (GabbleJingleSession *session,
                        gboolean local_terminator,
                        TpChannelGroupChangeReason reason,
+                       const gchar *text,
                        gpointer user_data)
 {
   GabbleMediaChannel *channel = (GabbleMediaChannel *) user_data;
@@ -2301,7 +2304,7 @@ session_terminated_cb (GabbleJingleSession *session,
   tp_intset_add (set, peer);
 
   tp_group_mixin_change_members ((GObject *) channel,
-      "", NULL, set, NULL, NULL, terminator, reason);
+      text, NULL, set, NULL, NULL, terminator, reason);
 
   tp_intset_destroy (set);
 
diff --git a/tests/twisted/jingle/jingletest2.py b/tests/twisted/jingle/jingletest2.py
index adc4e29..312d1d6 100644
--- a/tests/twisted/jingle/jingletest2.py
+++ b/tests/twisted/jingle/jingletest2.py
@@ -612,11 +612,15 @@ class JingleTest2:
                 jp.TransportGoogleP2P() ]) ]) ])
         self.stream.send(jp.xml(node))
 
-    def terminate(self, reason=None):
+    def terminate(self, reason=None, text=""):
         jp = self.jp
 
         if reason is not None and jp.is_modern_jingle():
-            body = [("reason", None, {}, [(reason, None, {}, [])])]
+            body = [("reason", None, {},
+                        [(reason, None, {}, []),
+                         ("text", None, {}, [text]),
+                        ]
+                    )]
         else:
             body = []
 
diff --git a/tests/twisted/jingle/test-outgoing-call-rejected.py b/tests/twisted/jingle/test-outgoing-call-rejected.py
index 2541423..d629b2a 100644
--- a/tests/twisted/jingle/test-outgoing-call-rejected.py
+++ b/tests/twisted/jingle/test-outgoing-call-rejected.py
@@ -4,7 +4,7 @@ remote party rejects our call because they're busy.
 """
 
 from gabbletest import make_result_iq
-from servicetest import make_channel_proxy
+from servicetest import make_channel_proxy, assertEquals
 import constants as cs
 from jingletest2 import JingleTest2, test_all_dialects
 
@@ -44,11 +44,13 @@ def test(jp, q, bus, conn, stream):
     e = q.expect('stream-iq', predicate=jp.action_predicate('session-initiate'))
     stream.send(make_result_iq(stream, e.stanza))
 
+    text = u"begone!"
+
     jt.parse_session_initiate(e.query)
-    jt.terminate(reason="busy")
+    jt.terminate(reason="busy", text=text)
 
     mc = q.expect('dbus-signal', signal='MembersChanged')
-    _, added, removed, lp, rp, actor, reason = mc.args
+    message, added, removed, lp, rp, actor, reason = mc.args
     assert added == [], added
     assert set(removed) == set([self_handle, remote_handle]), \
         (removed, self_handle, remote_handle)
@@ -56,7 +58,8 @@ def test(jp, q, bus, conn, stream):
     assert rp == [], rp
     assert actor == remote_handle, (actor, remote_handle)
     if jp.is_modern_jingle():
-        assert reason == cs.GC_REASON_BUSY, reason
+        assertEquals(text, message)
+        assertEquals(cs.GC_REASON_BUSY, reason)
 
     q.expect('dbus-signal', signal='Close') #XXX - match against the path
 
-- 
1.5.6.5




More information about the telepathy-commits mailing list