[telepathy-gabble/master] Include <reason> in session-terminate

Will Thompson will.thompson at collabora.co.uk
Thu Mar 26 06:24:22 PDT 2009


---
 src/jingle-session.c |   43 ++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 40 insertions(+), 3 deletions(-)

diff --git a/src/jingle-session.c b/src/jingle-session.c
index c89377c..07f5743 100644
--- a/src/jingle-session.c
+++ b/src/jingle-session.c
@@ -1547,11 +1547,36 @@ gabble_jingle_session_accept (GabbleJingleSession *sess)
   try_session_initiate_or_accept (sess);
 }
 
+static const gchar *
+_get_jingle_reason (GabbleJingleSession *sess,
+                    TpChannelGroupChangeReason reason)
+{
+  switch (reason)
+    {
+    case TP_CHANNEL_GROUP_CHANGE_REASON_NONE:
+      if (sess->priv->state == JS_STATE_ACTIVE)
+        return "success";
+      else
+        return "cancel";
+    case TP_CHANNEL_GROUP_CHANGE_REASON_OFFLINE:
+      return "gone";
+    case TP_CHANNEL_GROUP_CHANGE_REASON_BUSY:
+      return "busy";
+    case TP_CHANNEL_GROUP_CHANGE_REASON_ERROR:
+      return "general-error";
+    case TP_CHANNEL_GROUP_CHANGE_REASON_NO_ANSWER:
+      return "timeout";
+    default:
+      return NULL;
+    }
+}
+
 void
 gabble_jingle_session_terminate (GabbleJingleSession *sess,
                                  TpChannelGroupChangeReason reason)
 {
   GabbleJingleSessionPrivate *priv = sess->priv;
+  const gchar *reason_elt;
 
   if (priv->state == JS_STATE_ENDED)
     {
@@ -1559,11 +1584,23 @@ gabble_jingle_session_terminate (GabbleJingleSession *sess,
       return;
     }
 
+  reason_elt = _get_jingle_reason (sess, reason);
+
+  if (reason_elt == NULL)
+    g_warning ("%u doesn't make sense as a reason to end a call", reason);
+
   if (priv->state != JS_STATE_PENDING_CREATED)
     {
-      gabble_jingle_session_send (sess,
-          gabble_jingle_session_new_message (sess,
-              JINGLE_ACTION_SESSION_TERMINATE, NULL), NULL, NULL);
+      LmMessageNode *session_node;
+      LmMessage *msg = gabble_jingle_session_new_message (sess,
+          JINGLE_ACTION_SESSION_TERMINATE, &session_node);
+
+      if (priv->dialect == JINGLE_DIALECT_V032 && reason_elt != NULL)
+        lm_message_node_add_child (
+            lm_message_node_add_child (session_node, "reason", NULL),
+            reason_elt, NULL);
+
+      gabble_jingle_session_send (sess, msg, NULL, NULL);
     }
 
   /* NOTE: on "terminated", jingle factory and media channel will unref
-- 
1.5.6.5




More information about the telepathy-commits mailing list