[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