diff options
author | Olivier CrĂȘte <olivier.crete@collabora.com> | 2012-03-01 18:44:03 -0500 |
---|---|---|
committer | Olivier CrĂȘte <olivier.crete@collabora.com> | 2012-03-01 19:23:30 -0500 |
commit | fb20a3fed62ba2ea18b07a542c29086710691583 (patch) | |
tree | 51641e595eb2381bf803efe685050a8ad244942d | |
parent | d90b713b5198cb6e0bb3e4c79b99198dec122806 (diff) |
Call: Set the streams to sending when the remote side accepts
Also add some tests
-rw-r--r-- | rakia/call-channel.c | 19 | ||||
-rw-r--r-- | rakia/call-content.c | 6 | ||||
-rw-r--r-- | rakia/call-content.h | 2 | ||||
-rw-r--r-- | rakia/call-stream.c | 21 | ||||
-rw-r--r-- | rakia/call-stream.h | 1 | ||||
-rw-r--r-- | rakia/sip-media.c | 6 | ||||
-rw-r--r-- | rakia/sip-media.h | 2 | ||||
-rw-r--r-- | 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() |