summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2012-02-23 21:54:21 -0500
committerOlivier CrĂȘte <olivier.crete@collabora.com>2012-02-23 21:54:21 -0500
commit8517957e4d266351eb1dd0e0b2e8834e6a163248 (patch)
tree29d75c5104675d0d13ff75985c41a6bcd2657697
parent86ded282b0416ab12583e1da0d21670aac632b6d (diff)
Make Hold/Unhold work
-rw-r--r--rakia/call-channel.c2
-rw-r--r--rakia/sip-media.c5
-rw-r--r--rakia/sip-session.c7
-rw-r--r--tests/twisted/voip/add-remove-content.py2
-rw-r--r--tests/twisted/voip/calltest.py3
-rw-r--r--tests/twisted/voip/direction-change.py92
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)