[telepathy-gabble/master] Propagate session-terminate <reason> to MembersChanged

Will Thompson will.thompson at collabora.co.uk
Thu Mar 26 08:43:32 PDT 2009


---
 src/jingle-session.c |   46 ++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 44 insertions(+), 2 deletions(-)

diff --git a/src/jingle-session.c b/src/jingle-session.c
index 07f5743..26fbcfb 100644
--- a/src/jingle-session.c
+++ b/src/jingle-session.c
@@ -893,12 +893,54 @@ on_session_accept (GabbleJingleSession *sess, LmMessageNode *node,
   set_state (sess, JS_STATE_ACTIVE, 0);
 }
 
+typedef struct {
+    const gchar *element;
+    TpChannelGroupChangeReason reason;
+} ReasonMapping;
+
+/* Taken from the schema in XEP 0166 */
+ReasonMapping reasons[] = {
+    { "alternative-session", TP_CHANNEL_GROUP_CHANGE_REASON_NONE },
+    { "busy", TP_CHANNEL_GROUP_CHANGE_REASON_BUSY },
+    { "cancel", TP_CHANNEL_GROUP_CHANGE_REASON_NONE },
+    { "connectivity-error", TP_CHANNEL_GROUP_CHANGE_REASON_ERROR },
+    { "decline", TP_CHANNEL_GROUP_CHANGE_REASON_NONE },
+    { "expired", TP_CHANNEL_GROUP_CHANGE_REASON_NONE },
+    { "failed-application", TP_CHANNEL_GROUP_CHANGE_REASON_ERROR },
+    { "failed-transport", TP_CHANNEL_GROUP_CHANGE_REASON_ERROR },
+    { "general-error", TP_CHANNEL_GROUP_CHANGE_REASON_ERROR },
+    { "gone", TP_CHANNEL_GROUP_CHANGE_REASON_OFFLINE },
+    { "incompatible-parameters", TP_CHANNEL_GROUP_CHANGE_REASON_ERROR },
+    { "media-error", TP_CHANNEL_GROUP_CHANGE_REASON_ERROR },
+    { "security-error", TP_CHANNEL_GROUP_CHANGE_REASON_ERROR },
+    { "success", TP_CHANNEL_GROUP_CHANGE_REASON_NONE },
+    { "timeout", TP_CHANNEL_GROUP_CHANGE_REASON_NO_ANSWER },
+    { "unsupported-applications", TP_CHANNEL_GROUP_CHANGE_REASON_ERROR },
+    { "unsupported-transports", TP_CHANNEL_GROUP_CHANGE_REASON_ERROR },
+    { NULL, }
+};
+
 static void
 on_session_terminate (GabbleJingleSession *sess, LmMessageNode *node,
     GError **error)
 {
-  DEBUG ("remote end terminates the session");
-  set_state (sess, JS_STATE_ENDED, TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
+  TpChannelGroupChangeReason reason = TP_CHANNEL_GROUP_CHANGE_REASON_NONE;
+  LmMessageNode *n = lm_message_node_get_child (node, "reason");
+  ReasonMapping *m = NULL;
+
+  if (n != NULL)
+    for (n = n->children; n != NULL; n = n->next)
+      for (m = reasons; m->element != NULL; m++)
+        if (!tp_strdiff (m->element, lm_message_node_get_name (n)))
+          {
+            reason = m->reason;
+            goto pub;
+          }
+
+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);
 }
 
 static void
-- 
1.5.6.5




More information about the telepathy-commits mailing list