[Telepathy-commits] [telepathy-glib/master] ExampleCallableMediaManager: when our status becomes available, or our message changes while available, simulate an incoming call
Simon McVittie
simon.mcvittie at collabora.co.uk
Wed Mar 18 11:06:13 PDT 2009
---
examples/cm/callable/media-channel.c | 9 ++++-
examples/cm/callable/media-manager.c | 58 ++++++++++++++++++++++++++++++++-
2 files changed, 63 insertions(+), 4 deletions(-)
diff --git a/examples/cm/callable/media-channel.c b/examples/cm/callable/media-channel.c
index de3a429..2a7a5ed 100644
--- a/examples/cm/callable/media-channel.c
+++ b/examples/cm/callable/media-channel.c
@@ -229,12 +229,14 @@ constructed (GObject *object)
if (self->priv->initial_audio)
{
+ g_message ("Channel initially has an audio stream");
example_callable_media_channel_add_stream (self,
TP_MEDIA_STREAM_TYPE_AUDIO, FALSE);
}
if (self->priv->initial_video)
{
+ g_message ("Channel initially has a video stream");
example_callable_media_channel_add_stream (self,
TP_MEDIA_STREAM_TYPE_VIDEO, FALSE);
}
@@ -943,8 +945,11 @@ example_callable_media_channel_add_stream (ExampleCallableMediaChannel *self,
ExampleCallableMediaStream *stream;
guint id = self->priv->next_stream_id++;
- g_message ("SIGNALLING: send: new %s stream",
- media_type == TP_MEDIA_STREAM_TYPE_AUDIO ? "audio" : "video");
+ if (locally_requested)
+ {
+ g_message ("SIGNALLING: send: new %s stream",
+ media_type == TP_MEDIA_STREAM_TYPE_AUDIO ? "audio" : "video");
+ }
stream = g_object_new (EXAMPLE_TYPE_CALLABLE_MEDIA_STREAM,
"channel", self,
diff --git a/examples/cm/callable/media-manager.c b/examples/cm/callable/media-manager.c
index 7f9372b..c5548eb 100644
--- a/examples/cm/callable/media-manager.c
+++ b/examples/cm/callable/media-manager.c
@@ -62,6 +62,7 @@ struct _ExampleCallableMediaManagerPrivate
guint next_channel_index;
gulong status_changed_id;
+ gulong available_id;
};
static void
@@ -74,6 +75,7 @@ example_callable_media_manager_init (ExampleCallableMediaManager *self)
self->priv->conn = NULL;
self->priv->channels = NULL;
self->priv->status_changed_id = 0;
+ self->priv->available_id = 0;
}
static void
@@ -89,6 +91,13 @@ example_callable_media_manager_close_all (ExampleCallableMediaManager *self)
g_list_free (tmp);
}
+ if (self->priv->available_id != 0)
+ {
+ g_signal_handler_disconnect (self->priv->conn,
+ self->priv->available_id);
+ self->priv->available_id = 0;
+ }
+
if (self->priv->status_changed_id != 0)
{
g_signal_handler_disconnect (self->priv->conn,
@@ -177,6 +186,44 @@ status_changed_cb (TpBaseConnection *conn,
}
}
+static ExampleCallableMediaChannel *new_channel (
+ ExampleCallableMediaManager *self, TpHandle handle, TpHandle initiator,
+ gpointer request_token, gboolean initial_audio, gboolean initial_video);
+
+static gboolean
+simulate_incoming_call_cb (gpointer p)
+{
+ ExampleCallableMediaManager *self = p;
+ TpHandleRepoIface *contact_repo;
+ TpHandle caller;
+
+ /* do nothing if we've been disconnected while waiting for the contact to
+ * call us */
+ if (self->priv->available_id == 0)
+ return FALSE;
+
+ /* We're called by someone whose ID on the IM service is "caller" */
+ contact_repo = tp_base_connection_get_handles (self->priv->conn,
+ TP_HANDLE_TYPE_CONTACT);
+ caller = tp_handle_ensure (contact_repo, "caller", NULL, NULL);
+
+ new_channel (self, caller, caller, NULL, TRUE, FALSE);
+
+ return FALSE;
+}
+
+/* Whenever our presence changes from away to available, and whenever our
+ * presence message changes while remaining available, simulate a call from
+ * a contact */
+static void
+available_cb (GObject *conn G_GNUC_UNUSED,
+ const gchar *message,
+ ExampleCallableMediaManager *self)
+{
+ g_timeout_add_full (G_PRIORITY_DEFAULT, self->priv->simulation_delay,
+ simulate_incoming_call_cb, g_object_ref (self), g_object_unref);
+}
+
static void
constructed (GObject *object)
{
@@ -191,6 +238,9 @@ constructed (GObject *object)
self->priv->status_changed_id = g_signal_connect (self->priv->conn,
"status-changed", (GCallback) status_changed_cb, self);
+
+ self->priv->available_id = g_signal_connect (self->priv->conn,
+ "available", (GCallback) available_cb, self);
}
static void
@@ -250,7 +300,9 @@ static ExampleCallableMediaChannel *
new_channel (ExampleCallableMediaManager *self,
TpHandle handle,
TpHandle initiator,
- gpointer request_token)
+ gpointer request_token,
+ gboolean initial_audio,
+ gboolean initial_video)
{
ExampleCallableMediaChannel *chan;
gchar *object_path;
@@ -268,6 +320,8 @@ new_channel (ExampleCallableMediaManager *self,
"initiator-handle", initiator,
"requested", (self->priv->conn->self_handle == initiator),
"simulation-delay", self->priv->simulation_delay,
+ "initial-audio", initial_audio,
+ "initial-video", initial_video,
NULL);
g_free (object_path);
@@ -387,7 +441,7 @@ example_callable_media_manager_request (ExampleCallableMediaManager *self,
}
new_channel (self, handle, self->priv->conn->self_handle,
- request_token);
+ request_token, FALSE, FALSE);
return TRUE;
error:
--
1.5.6.5
More information about the telepathy-commits
mailing list