telepathy-rakia: Call: Set the streams to sending when the remote side accepts

Olivier Crête tester at kemper.freedesktop.org
Tue May 8 10:03:02 PDT 2012


Module: telepathy-rakia
Branch: master
Commit: fb20a3fed62ba2ea18b07a542c29086710691583
URL:    http://cgit.freedesktop.org/telepathy/telepathy-rakia/commit/?id=fb20a3fed62ba2ea18b07a542c29086710691583

Author: Olivier Crête <olivier.crete at collabora.com>
Date:   Thu Mar  1 18:44:03 2012 -0500

Call: Set the streams to sending when the remote side accepts

Also add some tests

---

 rakia/call-channel.c           |   19 +++++++++++++++++--
 rakia/call-content.c           |    6 ++++++
 rakia/call-content.h           |    2 ++
 rakia/call-stream.c            |   21 ++++++++++++---------
 rakia/call-stream.h            |    1 +
 rakia/sip-media.c              |    6 ++++++
 rakia/sip-media.h              |    2 ++
 tests/twisted/voip/calltest.py |   25 ++++++++++++++++++++++---
 8 files changed, 68 insertions(+), 14 deletions(-)

diff --git a/rakia/call-channel.c b/rakia/call-channel.c
index 992c020..5caecb2 100644
--- a/rakia/call-channel.c
+++ b/rakia/call-channel.c
@@ -433,6 +433,8 @@ rakia_call_channel_hold_state_changed (TpBaseMediaCallChannel *bmcc,
 {
   RakiaCallChannel *self = RAKIA_CALL_CHANNEL (bmcc);
 
+  DEBUG ("hold state changed to %d", hold_state);
+
   switch (hold_state)
     {
     case TP_LOCAL_HOLD_STATE_PENDING_HOLD:
@@ -627,8 +629,21 @@ state_changed_cb (RakiaSipSession *session, RakiaSipSessionState old_state,
     case RAKIA_SIP_SESSION_STATE_ACTIVE:
 
       if (tp_base_channel_is_requested (TP_BASE_CHANNEL (self)))
-        tp_base_call_channel_remote_accept (TP_BASE_CALL_CHANNEL (self));
-      break;
+        {
+          GList *e;
+
+          tp_base_call_channel_remote_accept (TP_BASE_CALL_CHANNEL (self));
+
+          for (e = tp_base_call_channel_get_contents (
+                  TP_BASE_CALL_CHANNEL (self));
+               e != NULL;
+               e = e->next)
+            {
+              RakiaCallContent *content = e->data;
+              if (content)
+                rakia_call_content_remote_accept (content);
+            }
+        }
 
     case RAKIA_SIP_SESSION_STATE_ENDED:
       /* the ended callback is used to get more information */
diff --git a/rakia/call-content.c b/rakia/call-content.c
index b525eab..b159ca1 100644
--- a/rakia/call-content.c
+++ b/rakia/call-content.c
@@ -430,3 +430,9 @@ local_media_description_updated (RakiaCallContent *self, TpHandle contact,
 {
   set_telepathy_codecs (self, properties);
 }
+
+void
+rakia_call_content_remote_accept (RakiaCallContent *content)
+{
+  rakia_call_stream_update_direction (content->priv->stream);
+}
diff --git a/rakia/call-content.h b/rakia/call-content.h
index a11467b..65dd415 100644
--- a/rakia/call-content.h
+++ b/rakia/call-content.h
@@ -77,6 +77,8 @@ RakiaSipMedia *rakia_call_content_get_media (RakiaCallContent *self);
 
 void rakia_call_content_add_stream (RakiaCallContent *self);
 
+void rakia_call_content_remote_accept (RakiaCallContent *content);
+
 G_END_DECLS
 
 #endif /* #ifndef __RAKIA_CALL_CONTENT_H__*/
diff --git a/rakia/call-stream.c b/rakia/call-stream.c
index 007c071..7f3d9fe 100644
--- a/rakia/call-stream.c
+++ b/rakia/call-stream.c
@@ -61,8 +61,6 @@ static void rakia_call_stream_finalize (GObject *object);
 
 static void media_remote_candidates_updated_cb (RakiaSipMedia *media,
     RakiaCallStream *self);
-static void media_direction_changed_cb (RakiaSipMedia *media,
-    RakiaCallStream *self);
 static void receiving_updated_cb (RakiaCallStream *self);
 
 
@@ -207,7 +205,7 @@ rakia_call_stream_constructed (GObject *object)
   g_signal_connect_object (priv->media, "remote-candidates-updated",
       G_CALLBACK (media_remote_candidates_updated_cb), self, 0);
   g_signal_connect_object (priv->media, "direction-changed",
-      G_CALLBACK (media_direction_changed_cb), self, 0);
+      G_CALLBACK (rakia_call_stream_update_direction), self, G_CONNECT_SWAPPED);
 
   if (!rakia_sip_media_is_created_locally (priv->media))
     media_remote_candidates_updated_cb (priv->media, self);
@@ -568,8 +566,8 @@ rakia_call_stream_new (RakiaCallChannel *channel,
       NULL);
 }
 
-static void
-media_direction_changed_cb (RakiaSipMedia *media, RakiaCallStream *self)
+void
+rakia_call_stream_update_direction (RakiaCallStream *self)
 {
   TpBaseCallStream *bcs = TP_BASE_CALL_STREAM (self);
   TpBaseMediaCallStream *bmcs = TP_BASE_MEDIA_CALL_STREAM (self);
@@ -578,13 +576,18 @@ media_direction_changed_cb (RakiaSipMedia *media, RakiaCallStream *self)
       TP_BASE_CHANNEL (priv->channel));
   TpHandle self_handle = tp_base_channel_get_self_handle (
       TP_BASE_CHANNEL (priv->channel));
-  RakiaDirection direction = rakia_sip_media_get_direction (media);
+  RakiaDirection direction = rakia_sip_media_get_direction (priv->media);
   RakiaDirection remote_direction =
-      rakia_sip_media_get_remote_direction (media);
+      rakia_sip_media_get_remote_direction (priv->media);
   RakiaDirection requested_direction =
-      rakia_sip_media_get_requested_direction (media);
+      rakia_sip_media_get_requested_direction (priv->media);
+  TpLocalHoldState hold_state =
+      tp_base_media_call_channel_get_local_hold_state (
+          TP_BASE_MEDIA_CALL_CHANNEL (priv->channel), NULL);
 
-  if (direction & requested_direction & RAKIA_DIRECTION_SEND)
+  if ((direction & RAKIA_DIRECTION_SEND ||
+          hold_state != TP_LOCAL_HOLD_STATE_UNHELD) &&
+      requested_direction & RAKIA_DIRECTION_SEND)
     {
       tp_base_call_stream_update_local_sending_state (bcs,
           TP_SENDING_STATE_SENDING, self_handle,
diff --git a/rakia/call-stream.h b/rakia/call-stream.h
index 0fccfbd..3d03d68 100644
--- a/rakia/call-stream.h
+++ b/rakia/call-stream.h
@@ -69,6 +69,7 @@ RakiaCallStream * rakia_call_stream_new (RakiaCallChannel *channel,
     TpBaseConnection *connection,
     TpSendingState local_sending_state);
 
+void rakia_call_stream_update_direction (RakiaCallStream *self);
 
 G_END_DECLS
 
diff --git a/rakia/sip-media.c b/rakia/sip-media.c
index 3fb3e9a..bfaf133 100644
--- a/rakia/sip-media.c
+++ b/rakia/sip-media.c
@@ -1165,6 +1165,12 @@ rakia_sip_media_set_hold_requested (RakiaSipMedia *media,
   media->priv->hold_requested = hold_requested;
 }
 
+gboolean
+rakia_sip_media_get_hold_requested (RakiaSipMedia *media)
+{
+  return media->priv->hold_requested;
+}
+
 
 gboolean
 rakia_sip_media_is_held (RakiaSipMedia *media)
diff --git a/rakia/sip-media.h b/rakia/sip-media.h
index 4275312..6f68ddd 100644
--- a/rakia/sip-media.h
+++ b/rakia/sip-media.h
@@ -168,6 +168,8 @@ RakiaDirection rakia_sip_media_get_remote_direction (RakiaSipMedia *media);
 RakiaDirection rakia_sip_media_get_requested_direction (
     RakiaSipMedia *self);
 
+gboolean rakia_sip_media_get_hold_requested (RakiaSipMedia *media);
+
 void rakia_sip_media_set_can_receive (RakiaSipMedia *media,
     gboolean can_receive);
 
diff --git a/tests/twisted/voip/calltest.py b/tests/twisted/voip/calltest.py
index 08b80e2..490faee 100644
--- a/tests/twisted/voip/calltest.py
+++ b/tests/twisted/voip/calltest.py
@@ -3,7 +3,7 @@ import dbus
 from sofiatest import exec_test
 
 from servicetest import (
-    make_channel_proxy, wrap_channel,
+    make_channel_proxy, wrap_channel, sync_dbus,
     EventPattern, call_async, ProxyWrapper,
     assertEquals, assertNotEquals, assertContains, assertLength,
     )
@@ -422,9 +422,27 @@ class CallTest:
 
     def accept(self):
         if self.incoming:
-            return self.accept_incoming()
+            self.accept_incoming()
         else:
-            return self.accept_outgoing()
+            self.accept_outgoing()
+
+    def running_check(self):
+        self.context.options_ping(self.q)
+        sync_dbus(self.bus, self.q, self.conn)
+
+        for c in self.contents:
+            props = c.stream.Properties.GetAll(cs.CALL_STREAM)
+            assertEquals(cs.CALL_SENDING_STATE_SENDING,
+                         props['LocalSendingState'])
+            assertEquals({self.remote_handle: cs.CALL_SENDING_STATE_SENDING},
+                         props['RemoteMembers'])
+
+            props = c.stream.Properties.GetAll(cs.CALL_STREAM_IFACE_MEDIA)
+            assertEquals(cs.CALL_STREAM_FLOW_STATE_STARTED,
+                         props['SendingState'])
+            assertEquals(cs.CALL_STREAM_FLOW_STATE_STARTED,
+                         props['ReceivingState'])
+
 
     def hangup(self):
         if self.incoming:
@@ -462,6 +480,7 @@ class CallTest:
         self.connect()
         self.initiate()
         self.accept()
+        self.running_check()
         self.during_call()
         self.hangup()
         self.chan.Close()



More information about the telepathy-commits mailing list