[telepathy-gabble/master] Refactor the call channel creation code a bit
Sjoerd Simons
sjoerd.simons at collabora.co.uk
Tue Dec 29 05:34:44 PST 2009
---
src/media-factory.c | 281 +++++++++++++++++++++++++++------------------------
1 files changed, 151 insertions(+), 130 deletions(-)
diff --git a/src/media-factory.c b/src/media-factory.c
index bfa6c39..f394205 100644
--- a/src/media-factory.c
+++ b/src/media-factory.c
@@ -48,6 +48,58 @@
#include "namespaces.h"
#include "util.h"
+typedef struct
+{
+ GabbleMediaFactory *self;
+ TpExportableChannel *channel;
+ GSList *request_tokens;
+} MediaChannelRequest;
+
+static MediaChannelRequest *
+media_channel_request_new (GabbleMediaFactory *self,
+ TpExportableChannel *channel,
+ gpointer request_token)
+{
+ MediaChannelRequest *mcr = g_slice_new0 (MediaChannelRequest);
+
+ mcr->self = self;
+ mcr->channel = channel;
+ if (request_token != NULL)
+ mcr->request_tokens = g_slist_prepend (mcr->request_tokens, request_token);
+
+ return mcr;
+}
+
+static void
+media_channel_request_free (MediaChannelRequest *mcr)
+{
+ g_slist_free (mcr->request_tokens);
+ g_slice_free (MediaChannelRequest, mcr);
+}
+
+static void
+media_channel_request_succeeded_cb (MediaChannelRequest *mcr,
+ GPtrArray *streams)
+{
+ tp_channel_manager_emit_new_channel (mcr->self,
+ mcr->channel, mcr->request_tokens);
+
+ media_channel_request_free (mcr);
+}
+
+static void
+media_channel_request_failed_cb (MediaChannelRequest *mcr,
+ GError *error)
+{
+ GSList *l;
+
+ for (l = mcr->request_tokens; l != NULL; l = g_slist_next (l))
+ tp_channel_manager_emit_request_failed (mcr->self, l->data,
+ error->domain, error->code, error->message);
+
+ media_channel_request_free (mcr);
+}
+
static void channel_manager_iface_init (gpointer, gpointer);
static void caps_channel_manager_iface_init (gpointer, gpointer);
@@ -252,6 +304,103 @@ new_media_channel (GabbleMediaFactory *fac,
}
static void
+call_channel_closed_cb (GabbleCallChannel *chan, gpointer user_data)
+{
+ GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (user_data);
+ GabbleMediaFactoryPrivate *priv = fac->priv;
+
+ tp_channel_manager_emit_channel_closed_for_object (fac,
+ TP_EXPORTABLE_CHANNEL (chan));
+
+ DEBUG ("removing media channel %p with ref count %d",
+ chan, G_OBJECT (chan)->ref_count);
+
+ priv->call_channels = g_list_remove (priv->call_channels, chan);
+ g_object_unref (chan);
+}
+
+static void
+call_channel_initialized (GObject *source,
+ GAsyncResult *res,
+ gpointer user_data)
+{
+ MediaChannelRequest *mcr = user_data;
+ GabbleMediaFactoryPrivate *priv = mcr->self->priv;
+ GError *error = NULL;
+
+ priv->pending_call_channels =
+ g_list_remove (priv->pending_call_channels, mcr);
+
+ if (g_async_initable_init_finish (G_ASYNC_INITABLE (source),
+ res, &error))
+ {
+ priv->call_channels = g_list_prepend (priv->call_channels,
+ mcr->channel);
+
+ tp_channel_manager_emit_new_channel (mcr->self,
+ mcr->channel, mcr->request_tokens);
+
+ g_signal_connect (mcr->channel, "closed",
+ G_CALLBACK (call_channel_closed_cb), mcr->self);
+ }
+ else
+ {
+ GSList *l;
+ for (l = mcr->request_tokens; l != NULL; l = g_slist_next (l))
+ tp_channel_manager_emit_request_failed (mcr->self, l->data,
+ error->domain, error->code, error->message);
+ }
+
+ media_channel_request_free (mcr);
+}
+
+/**
+ * new_call_channel
+ *
+ * Creates and triggers initialisation of a new empty GabbleCallChannel.
+ */
+static void
+new_call_channel (GabbleMediaFactory *self,
+ GabbleJingleSession *sess,
+ TpHandle peer,
+ gboolean initial_audio,
+ gboolean initial_video,
+ gpointer request_token)
+{
+ GabbleCallChannel *channel;
+ MediaChannelRequest *mcr;
+ gchar *object_path;
+ TpBaseConnection *conn = TP_BASE_CONNECTION (self->priv->conn);
+
+ object_path = g_strdup_printf ("%s/CallChannel%u",
+ conn->object_path, self->priv->channel_index);
+ self->priv->channel_index++;
+
+ channel = g_object_new (GABBLE_TYPE_CALL_CHANNEL,
+ "connection", conn,
+ "object-path", object_path,
+ "session", sess,
+ "handle", peer,
+ "initial-audio", initial_audio,
+ "initial-video", initial_video,
+ NULL);
+
+ g_free (object_path);
+
+ mcr = media_channel_request_new (self,
+ TP_EXPORTABLE_CHANNEL (channel), request_token);
+
+ g_async_initable_init_async (G_ASYNC_INITABLE (channel),
+ G_PRIORITY_DEFAULT,
+ NULL, /* FIXME support cancelling the channel creation */
+ call_channel_initialized,
+ mcr);
+
+ self->priv->pending_call_channels
+ = g_list_prepend (self->priv->pending_call_channels, channel);
+}
+
+static void
gabble_media_factory_close_all (GabbleMediaFactory *fac)
{
GabbleMediaFactoryPrivate *priv = fac->priv;
@@ -507,59 +656,6 @@ typedef enum
METHOD_ENSURE,
} RequestMethod;
-
-typedef struct
-{
- GabbleMediaFactory *self;
- TpExportableChannel *channel;
- GSList *request_tokens;
-} MediaChannelRequest;
-
-
-static MediaChannelRequest *
-media_channel_request_new (GabbleMediaFactory *self,
- TpExportableChannel *channel,
- gpointer request_token)
-{
- MediaChannelRequest *mcr = g_slice_new0 (MediaChannelRequest);
-
- mcr->self = self;
- mcr->channel = channel;
- mcr->request_tokens = g_slist_prepend (mcr->request_tokens, request_token);
-
- return mcr;
-}
-
-static void
-media_channel_request_free (MediaChannelRequest *mcr)
-{
- g_slist_free (mcr->request_tokens);
- g_slice_free (MediaChannelRequest, mcr);
-}
-
-static void
-media_channel_request_succeeded_cb (MediaChannelRequest *mcr,
- GPtrArray *streams)
-{
- tp_channel_manager_emit_new_channel (mcr->self,
- mcr->channel, mcr->request_tokens);
-
- media_channel_request_free (mcr);
-}
-
-static void
-media_channel_request_failed_cb (MediaChannelRequest *mcr,
- GError *error)
-{
- GSList *l;
-
- for (l = mcr->request_tokens; l != NULL; l = g_slist_next (l))
- tp_channel_manager_emit_request_failed (mcr->self, l->data,
- error->domain, error->code, error->message);
-
- media_channel_request_free (mcr);
-}
-
static gboolean
gabble_media_factory_requestotron (TpChannelManager *manager,
gpointer request_token,
@@ -702,57 +798,6 @@ error:
return TRUE;
}
-static void
-call_channel_closed_cb (GabbleCallChannel *chan, gpointer user_data)
-{
- GabbleMediaFactory *fac = GABBLE_MEDIA_FACTORY (user_data);
- GabbleMediaFactoryPrivate *priv = fac->priv;
-
- tp_channel_manager_emit_channel_closed_for_object (fac,
- TP_EXPORTABLE_CHANNEL (chan));
-
- DEBUG ("removing media channel %p with ref count %d",
- chan, G_OBJECT (chan)->ref_count);
-
- priv->call_channels = g_list_remove (priv->call_channels, chan);
- g_object_unref (chan);
-}
-
-static void
-call_channel_initialized (GObject *source,
- GAsyncResult *res,
- gpointer user_data)
-{
- MediaChannelRequest *mcr = user_data;
- GabbleMediaFactoryPrivate *priv = mcr->self->priv;
- GError *error = NULL;
-
- priv->pending_call_channels =
- g_list_remove (priv->pending_call_channels, mcr);
-
- if (g_async_initable_init_finish (G_ASYNC_INITABLE (source),
- res, &error))
- {
- priv->call_channels = g_list_prepend (priv->call_channels,
- mcr->channel);
-
- tp_channel_manager_emit_new_channel (mcr->self,
- mcr->channel, mcr->request_tokens);
-
- g_signal_connect (mcr->channel, "closed",
- G_CALLBACK (call_channel_closed_cb), mcr->self);
- }
- else
- {
- GSList *l;
- for (l = mcr->request_tokens; l != NULL; l = g_slist_next (l))
- tp_channel_manager_emit_request_failed (mcr->self, l->data,
- error->domain, error->code, error->message);
- }
-
- media_channel_request_free (mcr);
-}
-
static gboolean
gabble_media_factory_create_call (TpChannelManager *manager,
gpointer request_token,
@@ -760,12 +805,9 @@ gabble_media_factory_create_call (TpChannelManager *manager,
{
GabbleMediaFactory *self = GABBLE_MEDIA_FACTORY (manager);
TpHandle target;
- GabbleCallChannel *channel = NULL;
TpBaseConnection *conn;
GError *error = NULL;
gboolean initial_audio, initial_video;
- gchar *object_path;
- MediaChannelRequest *mcr;
conn = (TpBaseConnection *) self->priv->conn;
@@ -793,29 +835,8 @@ gabble_media_factory_create_call (TpChannelManager *manager,
* FIXME need to cope with disconnecting while channels are setting up
*/
- object_path = g_strdup_printf ("%s/CallChannel%u",
- conn->object_path, self->priv->channel_index);
- self->priv->channel_index++;
-
- channel = g_object_new (GABBLE_TYPE_CALL_CHANNEL,
- "connection", conn,
- "object-path", object_path,
- "handle", target,
- "initial-audio", initial_audio,
- "initial-video", initial_video,
- NULL);
-
- mcr = media_channel_request_new (self,
- TP_EXPORTABLE_CHANNEL (channel), request_token);
-
- g_async_initable_init_async (G_ASYNC_INITABLE (channel),
- G_PRIORITY_DEFAULT,
- NULL, /* FIXME support cancelling the channel creation */
- call_channel_initialized,
- mcr);
-
- self->priv->pending_call_channels
- = g_list_prepend (self->priv->pending_call_channels, channel);
+ new_call_channel (self, NULL, target, initial_audio, initial_video,
+ request_token);
return TRUE;
--
1.5.6.5
More information about the telepathy-commits
mailing list