summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2012-03-01 18:44:03 -0500
committerOlivier CrĂȘte <olivier.crete@collabora.com>2012-03-01 19:23:30 -0500
commitfb20a3fed62ba2ea18b07a542c29086710691583 (patch)
tree51641e595eb2381bf803efe685050a8ad244942d
parentd90b713b5198cb6e0bb3e4c79b99198dec122806 (diff)
Call: Set the streams to sending when the remote side accepts
Also add some tests
-rw-r--r--rakia/call-channel.c19
-rw-r--r--rakia/call-content.c6
-rw-r--r--rakia/call-content.h2
-rw-r--r--rakia/call-stream.c21
-rw-r--r--rakia/call-stream.h1
-rw-r--r--rakia/sip-media.c6
-rw-r--r--rakia/sip-media.h2
-rw-r--r--tests/twisted/voip/calltest.py25
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()