diff options
-rw-r--r-- | rakia/call-channel.c | 2 | ||||
-rw-r--r-- | rakia/sip-media.c | 5 | ||||
-rw-r--r-- | rakia/sip-session.c | 7 | ||||
-rw-r--r-- | tests/twisted/voip/add-remove-content.py | 2 | ||||
-rw-r--r-- | tests/twisted/voip/calltest.py | 3 | ||||
-rw-r--r-- | 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) |