summaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authorSimon McVittie <simon.mcvittie@collabora.co.uk>2009-03-13 16:30:27 +0000
committerSimon McVittie <simon.mcvittie@collabora.co.uk>2009-03-17 11:43:25 +0000
commit914356c99424b2705eef75679de34c262c4ea1e8 (patch)
tree38771803c9a130a53c31adde0a7f779b34dd9feb /examples
parent761a290341bedd0ad507f44769d44606e3975590 (diff)
ExampleCallableMediaStream: simulate the streams becoming connected
Diffstat (limited to 'examples')
-rw-r--r--examples/cm/callable/media-channel.c32
-rw-r--r--examples/cm/callable/media-stream.c48
-rw-r--r--examples/cm/callable/media-stream.h1
3 files changed, 78 insertions, 3 deletions
diff --git a/examples/cm/callable/media-channel.c b/examples/cm/callable/media-channel.c
index 853b20db..10b70fbd 100644
--- a/examples/cm/callable/media-channel.c
+++ b/examples/cm/callable/media-channel.c
@@ -803,11 +803,29 @@ stream_direction_changed_cb (ExampleCallableMediaStream *stream,
direction, pending);
}
+static void
+stream_state_changed_cb (ExampleCallableMediaStream *stream,
+ GParamSpec *spec G_GNUC_UNUSED,
+ ExampleCallableMediaChannel *self)
+{
+ guint id, state;
+
+ g_object_get (stream,
+ "id", &id,
+ "state", &state,
+ NULL);
+
+ tp_svc_channel_type_streamed_media_emit_stream_state_changed (self, id,
+ state);
+}
+
static gboolean
simulate_contact_answered_cb (gpointer p)
{
ExampleCallableMediaChannel *self = p;
TpIntSet *peer_set;
+ GHashTableIter iter;
+ gpointer v;
/* if the call has been cancelled while we were waiting for the
* contact to answer, do nothing */
@@ -832,6 +850,13 @@ simulate_contact_answered_cb (gpointer p)
TP_CHANNEL_GROUP_CHANGE_REASON_NONE);
tp_intset_destroy (peer_set);
+ g_hash_table_iter_init (&iter, self->priv->streams);
+
+ while (g_hash_table_iter_next (&iter, NULL, &v))
+ {
+ example_callable_media_stream_connect (v);
+ }
+
return FALSE;
}
@@ -936,9 +961,16 @@ media_request_streams (TpSvcChannelTypeStreamedMedia *iface,
g_signal_connect (stream, "removed", G_CALLBACK (stream_removed_cb),
self);
+ g_signal_connect (stream, "notify::state",
+ G_CALLBACK (stream_state_changed_cb), self);
g_signal_connect (stream, "direction-changed",
G_CALLBACK (stream_direction_changed_cb), self);
+ if (self->priv->progress == PROGRESS_ACTIVE)
+ {
+ example_callable_media_stream_connect (stream);
+ }
+
g_object_get (stream,
"stream-info", &info,
NULL);
diff --git a/examples/cm/callable/media-stream.c b/examples/cm/callable/media-stream.c
index 605bd042..e3dff228 100644
--- a/examples/cm/callable/media-stream.c
+++ b/examples/cm/callable/media-stream.c
@@ -66,7 +66,12 @@ struct _ExampleCallableMediaStreamPrivate
TpMediaStreamState state;
TpMediaStreamDirection direction;
TpMediaStreamPendingSend pending_send;
+
gulong call_terminated_id;
+
+ guint connected_event_id;
+
+ unsigned removed : 1;
};
static void
@@ -217,6 +222,8 @@ dispose (GObject *object)
TpHandleRepoIface *contact_repo = tp_base_connection_get_handles (
self->priv->conn, TP_HANDLE_TYPE_CONTACT);
+ example_callable_media_stream_close (self);
+
if (self->priv->handle != 0)
{
tp_handle_unref (contact_repo, self->priv->handle);
@@ -323,10 +330,20 @@ example_callable_media_stream_class_init (ExampleCallableMediaStreamClass *klass
void
example_callable_media_stream_close (ExampleCallableMediaStream *self)
{
- g_message ("Sending to server: Closing stream %u",
- self->priv->id);
+ if (!self->priv->removed)
+ {
+ self->priv->removed = TRUE;
- g_signal_emit (self, signals[SIGNAL_REMOVED], 0);
+ g_message ("Sending to server: Closing stream %u",
+ self->priv->id);
+
+ g_signal_emit (self, signals[SIGNAL_REMOVED], 0);
+
+ if (self->priv->connected_event_id != 0)
+ {
+ g_source_remove (self->priv->connected_event_id);
+ }
+ }
}
gboolean
@@ -412,3 +429,28 @@ example_callable_media_stream_change_direction (
return TRUE;
}
+
+static gboolean
+simulate_stream_connected_cb (gpointer p)
+{
+ ExampleCallableMediaStream *self = EXAMPLE_CALLABLE_MEDIA_STREAM (p);
+
+ g_message ("MEDIA: stream connected");
+ self->priv->state = TP_MEDIA_STREAM_STATE_CONNECTED;
+ g_object_notify ((GObject *) self, "state");
+
+ return FALSE;
+}
+
+void
+example_callable_media_stream_connect (ExampleCallableMediaStream *self)
+{
+
+ /* if already trying to connect, do nothing */
+ if (self->priv->connected_event_id != 0)
+ return;
+
+ /* simulate it taking a short time to connect */
+ self->priv->connected_event_id = g_timeout_add (1000,
+ simulate_stream_connected_cb, self);
+}
diff --git a/examples/cm/callable/media-stream.h b/examples/cm/callable/media-stream.h
index 4f1a5082..09d1a8ea 100644
--- a/examples/cm/callable/media-stream.h
+++ b/examples/cm/callable/media-stream.h
@@ -71,6 +71,7 @@ void example_callable_media_stream_close (ExampleCallableMediaStream *self);
gboolean example_callable_media_stream_change_direction (
ExampleCallableMediaStream *self, TpMediaStreamDirection direction,
GError **error);
+void example_callable_media_stream_connect (ExampleCallableMediaStream *self);
G_END_DECLS