telepathy-rakia: Make Hold/Unhold work

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


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

Author: Olivier Crête <olivier.crete at collabora.com>
Date:   Thu Feb 23 21:54:21 2012 -0500

Make Hold/Unhold work

---

 rakia/call-channel.c                     |    2 +-
 rakia/sip-media.c                        |    5 +-
 rakia/sip-session.c                      |    7 ++-
 tests/twisted/voip/add-remove-content.py |    2 +-
 tests/twisted/voip/calltest.py           |    3 +-
 tests/twisted/voip/direction-change.py   |   92 ++++++++++++++++++++++++++++--
 6 files changed, 98 insertions(+), 13 deletions(-)

diff --git a/rakia/call-channel.c b/rakia/call-channel.c
index 3c99a9e..b7f29ac 100644
--- a/rakia/call-channel.c
+++ b/rakia/call-channel.c
@@ -432,9 +432,9 @@ rakia_call_channel_hold_state_changed (TpBaseMediaCallChannel *bmcc,
     {
     case TP_LOCAL_HOLD_STATE_PENDING_HOLD:
     case TP_LOCAL_HOLD_STATE_HELD:
+    case TP_LOCAL_HOLD_STATE_PENDING_UNHOLD:
       rakia_sip_session_set_hold_requested (self->priv->session, TRUE);
       break;
-    case TP_LOCAL_HOLD_STATE_PENDING_UNHOLD:
     case TP_LOCAL_HOLD_STATE_UNHELD:
       rakia_sip_session_set_hold_requested (self->priv->session, FALSE);
       break;
diff --git a/rakia/sip-media.c b/rakia/sip-media.c
index 2fe0cae..9f013a6 100644
--- a/rakia/sip-media.c
+++ b/rakia/sip-media.c
@@ -371,7 +371,6 @@ static RakiaDirection
 priv_get_sdp_direction (RakiaSipMedia *media, gboolean authoritative)
 {
   RakiaSipMediaPrivate *priv = RAKIA_SIP_MEDIA_GET_PRIVATE (media);
-
   RakiaDirection direction = priv->requested_direction;
 
   if (!authoritative)
@@ -379,7 +378,7 @@ priv_get_sdp_direction (RakiaSipMedia *media, gboolean authoritative)
 
   /* Don't allow send, only receive if a hold is requested */
   if (priv->hold_requested)
-    direction &= RAKIA_DIRECTION_RECEIVE;
+    direction &= RAKIA_DIRECTION_SEND;
 
   if (!authoritative)
     rakia_sip_media_set_direction (media, direction);
@@ -1156,8 +1155,6 @@ rakia_sip_media_set_hold_requested (RakiaSipMedia *media,
     return;
 
   media->priv->hold_requested = hold_requested;
-
-  rakia_sip_media_local_updated (media);
 }
 
 
diff --git a/rakia/sip-session.c b/rakia/sip-session.c
index 44e8f4b..b52abd0 100644
--- a/rakia/sip-session.c
+++ b/rakia/sip-session.c
@@ -1734,17 +1734,22 @@ rakia_sip_session_set_hold_requested (RakiaSipSession *session,
   if (session->priv->hold_requested == hold_requested)
     return;
 
+  SESSION_DEBUG (session, "set hold: %d", hold_requested);
+
   session->priv->hold_requested = hold_requested;
 
   for (i = 0; i < priv->medias->len; i++)
     {
       RakiaSipMedia *media = g_ptr_array_index (priv->medias, i);
 
-      if (!media)
+      if (media == NULL)
         continue;
 
       rakia_sip_media_set_hold_requested (media, hold_requested);
     }
+
+  rakia_sip_session_media_changed (session);
+
 }
 
 GPtrArray *
diff --git a/tests/twisted/voip/add-remove-content.py b/tests/twisted/voip/add-remove-content.py
index 90c4246..d72102e 100644
--- a/tests/twisted/voip/add-remove-content.py
+++ b/tests/twisted/voip/add-remove-content.py
@@ -101,7 +101,7 @@ class AddRemoveContent(calltest.CallTest):
 
         self.context.check_call_sdp(reinvite_event.sip_message.body,
                                    self.medias + [('audio', None, None)])
-        res =  re.match('(.*)(m=.*)', reinvite_event.sip_message.body,
+        res = re.match('(.*)(m=.*)', reinvite_event.sip_message.body,
                        re.MULTILINE | re.DOTALL)
 
         body = res.group(1) + 'm=audio 0 RTP/AVP 0'
diff --git a/tests/twisted/voip/calltest.py b/tests/twisted/voip/calltest.py
index 07f6115..cc95e73 100644
--- a/tests/twisted/voip/calltest.py
+++ b/tests/twisted/voip/calltest.py
@@ -270,7 +270,8 @@ class CallTest:
         self.check_channel_props(props, True)
                 
         self.chan = wrap_channel(
-            self.bus.get_object(self.conn.bus_name, self.chan_path), 'Call1')
+            self.bus.get_object(self.conn.bus_name, self.chan_path), 'Call1',
+            ['Hold'])
             
         call_props = self.chan.Properties.GetAll(cs.CHANNEL_TYPE_CALL)
         self.check_call_properties(call_props)
diff --git a/tests/twisted/voip/direction-change.py b/tests/twisted/voip/direction-change.py
index e1f0acc..8e2a3a3 100644
--- a/tests/twisted/voip/direction-change.py
+++ b/tests/twisted/voip/direction-change.py
@@ -367,14 +367,98 @@ class DirectionChange(calltest.CallTest):
 
 
     def hold(self):
-        pass
 
-    def unhold(self):
+        self.chan.Hold.RequestHold(True)
+
+        events = self.stream_dbus_signal_event (
+            'ReceivingStateChanged',
+            args=[cs.CALL_STREAM_FLOW_STATE_PENDING_STOP])
+        events += self.stream_dbus_signal_event(
+            'SendingStateChanged',
+                args=[cs.CALL_STREAM_FLOW_STATE_PENDING_STOP])
+        o = self.q.expect_many(
+            EventPattern('sip-invite'),
+            EventPattern('dbus-signal', signal='HoldStateChanged',
+                         args=[cs.HS_PENDING_HOLD, cs.HSR_REQUESTED]),
+            *events)
+        reinvite_event = o[0]
+        for c in self.contents:
+            c.stream.Media.CompleteReceivingStateChange(
+                cs.CALL_STREAM_FLOW_STATE_STOPPED)
+            c.stream.Media.CompleteSendingStateChange(
+                cs.CALL_STREAM_FLOW_STATE_STOPPED)
+
+        events = self.stream_dbus_signal_event (
+            'ReceivingStateChanged',
+            args=[cs.CALL_STREAM_FLOW_STATE_STOPPED])
+        events += self.stream_dbus_signal_event(
+            'SendingStateChanged',
+            args=[cs.CALL_STREAM_FLOW_STATE_STOPPED])
+        self.q.expect_many(
+            EventPattern('dbus-signal', signal='HoldStateChanged',
+                         args=[cs.HS_HELD, cs.HSR_REQUESTED]),
+            *events)
+        medias = map(lambda x: (x[0], x[1] == 'recvonly' and 'inactive' or 'sendonly'), self.medias)
+        self.context.check_call_sdp(reinvite_event.sip_message.body, medias)
+
+        body = reinvite_event.sip_message.body.replace('sendonly', 'recvonly')
+        self.context.accept(reinvite_event.sip_message, body)
+
+        ack_cseq = "%s ACK" % reinvite_event.cseq.split()[0]
+        self.q.expect('sip-ack', cseq=ack_cseq)
+
+
+    def unhold_fail(self):
+        # TODO!!
         pass
 
+    def unhold_succeed(self):
+        self.chan.Hold.RequestHold(False)
+
+        events = self.stream_dbus_signal_event (
+            'ReceivingStateChanged',
+            args=[cs.CALL_STREAM_FLOW_STATE_PENDING_START])
+        events += self.stream_dbus_signal_event(
+            'SendingStateChanged',
+                args=[cs.CALL_STREAM_FLOW_STATE_PENDING_START])
+        o = self.q.expect_many(
+            EventPattern('dbus-signal', signal='HoldStateChanged',
+                         args=[cs.HS_PENDING_UNHOLD, cs.HSR_REQUESTED]),
+            *events)
+        for c in self.contents:
+            c.stream.Media.CompleteReceivingStateChange(
+                cs.CALL_STREAM_FLOW_STATE_STARTED)
+            c.stream.Media.CompleteSendingStateChange(
+                cs.CALL_STREAM_FLOW_STATE_STARTED)
+
+        events = self.stream_dbus_signal_event (
+            'ReceivingStateChanged',
+            args=[cs.CALL_STREAM_FLOW_STATE_STARTED])
+        events += self.stream_dbus_signal_event(
+            'SendingStateChanged',
+            args=[cs.CALL_STREAM_FLOW_STATE_STARTED])
+        o = self.q.expect_many(
+            EventPattern('sip-invite'),
+            EventPattern('dbus-signal', signal='HoldStateChanged',
+                         args=[cs.HS_UNHELD, cs.HSR_REQUESTED]),
+            *events)
+        reinvite_event = o[0]
+        medias = map(lambda x: (x[0], None), self.medias)
+        assertDoesNotContain('a=sendonly', reinvite_event.sip_message.body)
+        assertDoesNotContain('a=inactive', reinvite_event.sip_message.body)
+        self.context.check_call_sdp(reinvite_event.sip_message.body, medias)
+
+        self.context.accept(reinvite_event.sip_message)
+
+        ack_cseq = "%s ACK" % reinvite_event.cseq.split()[0]
+        self.q.expect('sip-ack', cseq=ack_cseq)
+
+
     def hold_unhold(self):
         self.hold()
-        self.unhold()
+        self.unhold_fail()
+        self.unhold_succeed()
+
 
     def during_call(self):
         content = self.contents[0]
@@ -396,8 +480,6 @@ class DirectionChange(calltest.CallTest):
 
         self.hold_unhold()
 
-        
-
         return calltest.CallTest.during_call(self)
 
 



More information about the telepathy-commits mailing list