summaryrefslogtreecommitdiff
path: root/telepathy-glib/base-media-call-stream.c
diff options
context:
space:
mode:
authorOlivier CrĂȘte <olivier.crete@collabora.com>2011-12-28 01:08:21 -0500
committerXavier Claessens <xavier.claessens@collabora.co.uk>2012-01-10 09:52:46 +0100
commita5e24b25e63510ee2f5992237841b222e6b98b06 (patch)
treeff8383081bc74124186907b2657264f8e26c59e7 /telepathy-glib/base-media-call-stream.c
parentaa850a6172460e88549bb272d5c94f02a7698ba5 (diff)
downloadtelepathy-glib-a5e24b25e63510ee2f5992237841b222e6b98b06.tar.gz
Start receiving when the other sides asks us to
Diffstat (limited to 'telepathy-glib/base-media-call-stream.c')
-rw-r--r--telepathy-glib/base-media-call-stream.c63
1 files changed, 58 insertions, 5 deletions
diff --git a/telepathy-glib/base-media-call-stream.c b/telepathy-glib/base-media-call-stream.c
index 4d96aeced..b400fef38 100644
--- a/telepathy-glib/base-media-call-stream.c
+++ b/telepathy-glib/base-media-call-stream.c
@@ -113,6 +113,7 @@
#define DEBUG_FLAG TP_DEBUG_CALL
#include "telepathy-glib/base-call-content.h"
+#include "telepathy-glib/base-call-channel.h"
#include "telepathy-glib/base-call-internal.h"
#include "telepathy-glib/base-channel.h"
#include "telepathy-glib/base-connection.h"
@@ -181,6 +182,9 @@ static gboolean tp_base_media_call_stream_request_receiving (
static gboolean tp_base_media_call_stream_set_sending (TpBaseCallStream *self,
gboolean sending, GError **error);
+static void remote_members_changed_cb (TpBaseMediaCallStream *self,
+ GParamSpec *pspec, gpointer user_data);
+
static void
tp_base_media_call_stream_init (TpBaseMediaCallStream *self)
{
@@ -194,6 +198,9 @@ tp_base_media_call_stream_init (TpBaseMediaCallStream *self)
self->priv->receiving_requests = g_array_new (TRUE, FALSE, sizeof (TpHandle));
self->priv->sending_state = TP_STREAM_FLOW_STATE_STOPPED;
self->priv->receiving_state = TP_STREAM_FLOW_STATE_STOPPED;
+
+ g_signal_connect (self, "notify::remote-members",
+ G_CALLBACK (remote_members_changed_cb), NULL);
}
static void
@@ -815,6 +822,57 @@ _tp_base_media_call_stream_start_receiving (TpBaseMediaCallStream *self,
TP_STREAM_FLOW_STATE_PENDING_START);
}
+static void
+remote_members_changed_cb (TpBaseMediaCallStream *self, GParamSpec *pspec,
+ gpointer user_data)
+{
+ TpBaseCallStream *bcs = TP_BASE_CALL_STREAM (self);
+ GHashTable *remote_members = _tp_base_call_stream_borrow_remote_members (bcs);
+ GHashTableIter iter;
+ gpointer key, value;
+ gboolean remote_sending = FALSE;
+ TpBaseCallChannel *channel = _tp_base_call_stream_get_channel (bcs);
+
+ if (channel == NULL || !tp_base_call_channel_is_locally_accepted (channel))
+ return;
+
+ g_hash_table_iter_init (&iter, remote_members);
+ while (g_hash_table_iter_next (&iter, &key, &value))
+ {
+ TpSendingState state = GPOINTER_TO_UINT (value);
+
+ switch (state)
+ {
+ case TP_SENDING_STATE_SENDING:
+ case TP_SENDING_STATE_PENDING_SEND:
+ remote_sending = TRUE;
+ break;
+ case TP_SENDING_STATE_PENDING_STOP_SENDING:
+ case TP_SENDING_STATE_NONE:
+ break;
+ default:
+ g_assert_not_reached ();
+ }
+ if (remote_sending)
+ break;
+ }
+
+ if (remote_sending)
+ {
+ if (self->priv->receiving_state == TP_STREAM_FLOW_STATE_STOPPED ||
+ self->priv->receiving_state == TP_STREAM_FLOW_STATE_PENDING_STOP)
+ tp_base_media_call_stream_set_receiving_state (self,
+ TP_STREAM_FLOW_STATE_PENDING_START);
+ }
+ else
+ {
+ if (self->priv->receiving_state == TP_STREAM_FLOW_STATE_STARTED ||
+ self->priv->receiving_state == TP_STREAM_FLOW_STATE_PENDING_START)
+ tp_base_media_call_stream_set_receiving_state (self,
+ TP_STREAM_FLOW_STATE_PENDING_STOP);
+ }
+}
+
static gboolean
tp_base_media_call_stream_request_receiving (TpBaseCallStream *bcs,
TpHandle contact, gboolean receive, GError **error)
@@ -860,11 +918,6 @@ tp_base_media_call_stream_request_receiving (TpBaseCallStream *bcs,
if (klass->request_receiving != NULL)
klass->request_receiving (self, contact, FALSE);
-
- if (self->priv->receiving_state != TP_STREAM_FLOW_STATE_PENDING_STOP &&
- self->priv->receiving_state != TP_STREAM_FLOW_STATE_STOPPED)
- tp_base_media_call_stream_set_receiving_state (self,
- TP_STREAM_FLOW_STATE_PENDING_STOP);
}
return TRUE;