[telepathy-gabble/master] Propagate reason to JingleSession:terminated

Will Thompson will.thompson at collabora.co.uk
Mon Mar 23 05:41:45 PDT 2009


---
 src/jingle-session.c |   51 ++++++++++++++++++++++++++++++-------------------
 src/jingle-session.h |    3 +-
 src/media-channel.c  |    6 +++-
 3 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/src/jingle-session.c b/src/jingle-session.c
index 4f7b4bb..91c2a33 100644
--- a/src/jingle-session.c
+++ b/src/jingle-session.c
@@ -481,7 +481,8 @@ action_is_allowed (JingleAction action, JingleState state)
   return FALSE;
 }
 
-static void set_state (GabbleJingleSession *sess, JingleState state);
+static void set_state (GabbleJingleSession *sess, JingleState state,
+    TpChannelGroupChangeReason termination_reason);
 static GabbleJingleContent *_get_any_content (GabbleJingleSession *session);
 
 #define SET_BAD_REQ(txt...) g_set_error (error, GABBLE_XMPP_ERROR, XMPP_ERROR_BAD_REQUEST, txt)
@@ -787,7 +788,8 @@ on_session_initiate (GabbleJingleSession *sess, LmMessageNode *node,
     {
       /* We ignore initiate from us, and terminate the session immediately
        * afterwards */
-      gabble_jingle_session_terminate (sess);
+      gabble_jingle_session_terminate (sess,
+          TP_CHANNEL_GROUP_CHANGE_REASON_BUSY);
       return;
     }
 
@@ -808,7 +810,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);
+      set_state (sess, JS_STATE_PENDING_INITIATED, 0);
     }
 }
 
@@ -836,7 +838,8 @@ on_content_remove (GabbleJingleSession *sess, LmMessageNode *node,
 
   if (g_hash_table_size (priv->contents) == 0)
     {
-      gabble_jingle_session_terminate (sess);
+      gabble_jingle_session_terminate (sess,
+          TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
     }
 }
 
@@ -887,7 +890,7 @@ on_session_accept (GabbleJingleSession *sess, LmMessageNode *node,
   if (*error != NULL)
       return;
 
-  set_state (sess, JS_STATE_ACTIVE);
+  set_state (sess, JS_STATE_ACTIVE, 0);
 }
 
 static void
@@ -895,7 +898,7 @@ on_session_terminate (GabbleJingleSession *sess, LmMessageNode *node,
     GError **error)
 {
   DEBUG ("remote end terminates the session");
-  set_state (sess, JS_STATE_ENDED);
+  set_state (sess, JS_STATE_ENDED, TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
 }
 
 static void
@@ -1402,9 +1405,9 @@ _on_initiate_reply (GabbleJingleSession *sess, gboolean success,
     LmMessage *reply, gpointer user_data)
 {
   if (success)
-      set_state (sess, JS_STATE_PENDING_INITIATED);
+      set_state (sess, JS_STATE_PENDING_INITIATED, 0);
   else
-      set_state (sess, JS_STATE_ENDED);
+      set_state (sess, JS_STATE_ENDED, TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
 }
 
 static void
@@ -1412,9 +1415,9 @@ _on_accept_reply (GabbleJingleSession *sess, gboolean success,
     LmMessage *reply, gpointer user_data)
 {
   if (success)
-      set_state (sess, JS_STATE_ACTIVE);
+      set_state (sess, JS_STATE_ACTIVE, 0);
   else
-      set_state (sess, JS_STATE_ENDED);
+      set_state (sess, JS_STATE_ENDED, TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
 }
 
 static gboolean
@@ -1425,10 +1428,8 @@ timeout_session (gpointer data)
   DEBUG ("session timed out");
   session->priv->timer_id = 0;
 
-  /* FIXME: distinguish between different cases; we somehow need to
-   * signal this to media channel - parameter to TERMINATED perhaps?*/
-
-  gabble_jingle_session_terminate (session);
+  gabble_jingle_session_terminate (session,
+      TP_CHANNEL_GROUP_CHANGE_REASON_NO_ANSWER);
   return FALSE;
 }
 
@@ -1485,14 +1486,23 @@ try_session_initiate_or_accept (GabbleJingleSession *sess)
   msg = gabble_jingle_session_new_message (sess, action, &sess_node);
   _map_initial_contents (sess, _fill_content, sess_node);
   gabble_jingle_session_send (sess, msg, handler, NULL);
-  set_state (sess, new_state);
+  set_state (sess, new_state, 0);
 
   /* now all initial contents can transmit their candidates */
   _map_initial_contents (sess, _transmit_candidates, NULL);
 }
 
+/**
+ * set_state:
+ * @sess: a jingle session
+ * @state: the new state for the session
+ * @termination_reason: if @state is JS_STATE_ENDED, the reason the session
+ *                      ended. Otherwise, ignored.
+ */
 static void
-set_state (GabbleJingleSession *sess, JingleState state)
+set_state (GabbleJingleSession *sess,
+           JingleState state,
+           TpChannelGroupChangeReason termination_reason)
 {
   GabbleJingleSessionPrivate *priv = sess->priv;
 
@@ -1524,7 +1534,7 @@ set_state (GabbleJingleSession *sess, JingleState state)
 
   if (state == JS_STATE_ENDED)
     g_signal_emit (sess, signals[TERMINATED], 0, priv->locally_terminated,
-        TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
+        termination_reason);
 }
 
 void
@@ -1538,7 +1548,8 @@ gabble_jingle_session_accept (GabbleJingleSession *sess)
 }
 
 void
-gabble_jingle_session_terminate (GabbleJingleSession *sess)
+gabble_jingle_session_terminate (GabbleJingleSession *sess,
+                                 TpChannelGroupChangeReason reason)
 {
   GabbleJingleSessionPrivate *priv = sess->priv;
 
@@ -1561,7 +1572,7 @@ gabble_jingle_session_terminate (GabbleJingleSession *sess)
 
   DEBUG ("we are terminating this session");
   priv->locally_terminated = TRUE;
-  set_state (sess, JS_STATE_ENDED);
+  set_state (sess, JS_STATE_ENDED, reason);
 }
 
 static void
@@ -1603,7 +1614,7 @@ content_removed_cb (GabbleJingleContent *c, gpointer user_data)
       return;
 
   if (count_active_contents (sess) == 0)
-    gabble_jingle_session_terminate (sess);
+    gabble_jingle_session_terminate (sess, TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
 }
 
 
diff --git a/src/jingle-session.h b/src/jingle-session.h
index 264f7cd..1ca3ea9 100644
--- a/src/jingle-session.h
+++ b/src/jingle-session.h
@@ -91,7 +91,8 @@ LmMessage *gabble_jingle_session_new_message (GabbleJingleSession *sess,
     JingleAction action, LmMessageNode **sess_node);
 
 void gabble_jingle_session_accept (GabbleJingleSession *sess);
-void gabble_jingle_session_terminate (GabbleJingleSession *sess);
+void gabble_jingle_session_terminate (GabbleJingleSession *sess,
+    TpChannelGroupChangeReason reason);
 void gabble_jingle_session_remove_content (GabbleJingleSession *sess,
     GabbleJingleContent *c);
 
diff --git a/src/media-channel.c b/src/media-channel.c
index f617e90..5a5913b 100644
--- a/src/media-channel.c
+++ b/src/media-channel.c
@@ -843,7 +843,8 @@ gabble_media_channel_close (GabbleMediaChannel *self)
 
   if (priv->session)
     {
-      gabble_jingle_session_terminate (priv->session);
+      gabble_jingle_session_terminate (priv->session,
+          TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
     }
 
   tp_svc_channel_emit_closed (self);
@@ -2024,7 +2025,8 @@ gabble_media_channel_remove_member (GObject *obj,
   tp_group_mixin_change_flags (obj, 0,
       TP_CHANNEL_GROUP_FLAG_CAN_REMOVE | TP_CHANNEL_GROUP_FLAG_CAN_RESCIND);
 
-  gabble_jingle_session_terminate (priv->session);
+  gabble_jingle_session_terminate (priv->session,
+      TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
 
   return TRUE;
 }
-- 
1.5.6.5




More information about the telepathy-commits mailing list