/pidgin/main: cfe439dd03f1: Add Private media API

Youness Alaoui <[email protected]>
Newsgroups gmane.comp.gnome.gaim.cvs
Message-ID <[email protected]>
Changeset: cfe439dd03f143d61e8fce735bf7519b479fa832
Author:	 Youness Alaoui <[email protected]>
Date:	 2014-07-07 16:27 -0400
Branch:	 default
URL: https://hg.pidgin.im/pidgin/main/rev/cfe439dd03f1

Description:

Add Private media API

Creating a private media can be useful for plugins that want to create a
PurpleMedia for internal use without the front-end being notified of its
creation.

diffstat:

 libpurple/mediamanager.c |  121 +++++++++++++++++++++++++++++++++++++++-------
 libpurple/mediamanager.h |   45 +++++++++++++++++
 2 files changed, 146 insertions(+), 20 deletions(-)

diffs (272 lines):

diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c
--- a/libpurple/mediamanager.c
+++ b/libpurple/mediamanager.c
@@ -65,6 +65,7 @@ struct _PurpleMediaManagerPrivate
 	GstElement *pipeline;
 	PurpleMediaCaps ui_caps;
 	GList *medias;
+	GList *private_medias;
 	GList *elements;
 	GList *output_windows;
 	gulong next_output_window_id;
@@ -90,6 +91,7 @@ static GObjectClass *parent_class = NULL
 
 enum {
 	INIT_MEDIA,
+	INIT_PRIVATE_MEDIA,
 	UI_CAPS_CHANGED,
 	LAST_SIGNAL
 };
@@ -140,6 +142,15 @@ purple_media_manager_class_init (PurpleM
 		G_TYPE_BOOLEAN, 3, PURPLE_TYPE_MEDIA,
 		G_TYPE_POINTER, G_TYPE_STRING);
 
+	purple_media_manager_signals[INIT_PRIVATE_MEDIA] =
+		g_signal_new ("init-private-media",
+			G_TYPE_FROM_CLASS (klass),
+			G_SIGNAL_RUN_LAST,
+			0, NULL, NULL,
+			purple_smarshal_BOOLEAN__OBJECT_POINTER_STRING,
+			G_TYPE_BOOLEAN, 3, PURPLE_TYPE_MEDIA,
+			G_TYPE_POINTER, G_TYPE_STRING);
+
 	purple_media_manager_signals[UI_CAPS_CHANGED] = g_signal_new ("ui-caps-changed",
 		G_TYPE_FROM_CLASS (klass),
 		G_SIGNAL_RUN_LAST,
@@ -156,6 +167,7 @@ purple_media_manager_init (PurpleMediaMa
 {
 	media->priv = PURPLE_MEDIA_MANAGER_GET_PRIVATE(media);
 	media->priv->medias = NULL;
+	media->priv->private_medias = NULL;
 	media->priv->next_output_window_id = 1;
 #ifdef USE_VV
 	media->priv->backend_type = PURPLE_TYPE_MEDIA_BACKEND_FS2;
@@ -177,6 +189,10 @@ purple_media_manager_finalize (GObject *
 			g_list_delete_link(priv->medias, priv->medias)) {
 		g_object_unref(priv->medias->data);
 	}
+	for (; priv->private_medias; priv->private_medias =
+			g_list_delete_link(priv->private_medias, priv->private_medias)) {
+		g_object_unref(priv->private_medias->data);
+	}
 	for (; priv->elements; priv->elements =
 			g_list_delete_link(priv->elements, priv->elements)) {
 		g_object_unref(priv->elements->data);
@@ -304,12 +320,13 @@ purple_media_manager_get_pipeline(Purple
 }
 #endif /* USE_GSTREAMER */
 
-PurpleMedia *
-purple_media_manager_create_media(PurpleMediaManager *manager,
-				  PurpleAccount *account,
-				  const char *conference_type,
-				  const char *remote_user,
-				  gboolean initiator)
+static PurpleMedia *
+create_media(PurpleMediaManager *manager,
+			  PurpleAccount *account,
+			  const char *conference_type,
+			  const char *remote_user,
+			  gboolean initiator,
+			  gboolean private)
 {
 #ifdef USE_VV
 	PurpleMedia *media;
@@ -322,7 +339,9 @@ purple_media_manager_create_media(Purple
 			     "initiator", initiator,
 			     NULL));
 
-	signal_id = purple_media_manager_signals[INIT_MEDIA];
+	signal_id = private ?
+			purple_media_manager_signals[INIT_PRIVATE_MEDIA] :
+			purple_media_manager_signals[INIT_MEDIA];
 
 	if (g_signal_has_handler_pending(manager, signal_id, 0, FALSE)) {
 		gboolean signal_ret;
@@ -335,26 +354,33 @@ purple_media_manager_create_media(Purple
 		}
 	}
 
-	manager->priv->medias = g_list_append(manager->priv->medias, media);
+	if (private)
+		manager->priv->private_medias = g_list_append(
+			manager->priv->private_medias, media);
+	else
+		manager->priv->medias = g_list_append(manager->priv->medias, media);
 	return media;
 #else
 	return NULL;
 #endif
 }
 
-GList *
-purple_media_manager_get_media(PurpleMediaManager *manager)
+static GList *
+get_media(PurpleMediaManager *manager, gboolean private)
 {
 #ifdef USE_VV
-	return manager->priv->medias;
+	if (private)
+		return manager->priv->private_medias;
+	else
+		return manager->priv->medias;
 #else
 	return NULL;
 #endif
 }
 
-GList *
-purple_media_manager_get_media_by_account(PurpleMediaManager *manager,
-		PurpleAccount *account)
+static GList *
+get_media_by_account(PurpleMediaManager *manager,
+		PurpleAccount *account, gboolean private)
 {
 #ifdef USE_VV
 	GList *media = NULL;
@@ -362,7 +388,10 @@ purple_media_manager_get_media_by_accoun
 
 	g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), NULL);
 
-	iter = manager->priv->medias;
+	if (private)
+		iter = manager->priv->private_medias;
+	else
+		iter = manager->priv->medias;
 	for (; iter; iter = g_list_next(iter)) {
 		if (purple_media_get_account(iter->data) == account) {
 			media = g_list_prepend(media, iter->data);
@@ -376,21 +405,73 @@ purple_media_manager_get_media_by_accoun
 }
 
 void
-purple_media_manager_remove_media(PurpleMediaManager *manager,
-				  PurpleMedia *media)
+purple_media_manager_remove_media(PurpleMediaManager *manager, PurpleMedia *media)
 {
 #ifdef USE_VV
 	GList *list;
+	GList **medias;
 
 	g_return_if_fail(manager != NULL);
 
-	list = g_list_find(manager->priv->medias, media);
+	if ((list = g_list_find(manager->priv->medias, media))) {
+		medias = &manager->priv->medias;
+	} else if ((list = g_list_find(manager->priv->private_medias, media))) {
+		medias = &manager->priv->private_medias;
+	}
+
 	if (list)
-		manager->priv->medias =
-			g_list_delete_link(manager->priv->medias, list);
+		*medias = g_list_delete_link(*medias, list);
 #endif
 }
 
+PurpleMedia *
+purple_media_manager_create_media(PurpleMediaManager *manager,
+				  PurpleAccount *account,
+				  const char *conference_type,
+				  const char *remote_user,
+				  gboolean initiator)
+{
+	return create_media (manager, account, conference_type,
+						  remote_user, initiator, FALSE);
+}
+
+GList *
+purple_media_manager_get_media(PurpleMediaManager *manager)
+{
+	return get_media (manager, FALSE);
+}
+
+GList *
+purple_media_manager_get_media_by_account(PurpleMediaManager *manager,
+		PurpleAccount *account)
+{
+	return get_media_by_account (manager, account, FALSE);
+}
+
+PurpleMedia *
+purple_media_manager_create_private_media(PurpleMediaManager *manager,
+				  PurpleAccount *account,
+				  const char *conference_type,
+				  const char *remote_user,
+				  gboolean initiator)
+{
+	return create_media (manager, account, conference_type,
+		remote_user, initiator, TRUE);
+}
+
+GList *
+purple_media_manager_get_private_media(PurpleMediaManager *manager)
+{
+	return get_media (manager, TRUE);
+}
+
+GList *
+purple_media_manager_get_private_media_by_account(PurpleMediaManager *manager,
+		PurpleAccount *account)
+{
+	return get_media_by_account (manager, account, TRUE);
+}
+
 #ifdef USE_VV
 static void
 request_pad_unlinked_cb(GstPad *pad, GstPad *peer, gpointer user_data)
diff --git a/libpurple/mediamanager.h b/libpurple/mediamanager.h
--- a/libpurple/mediamanager.h
+++ b/libpurple/mediamanager.h
@@ -151,6 +151,51 @@ purple_media_manager_remove_media(Purple
 				  PurpleMedia *media);
 
 /**
+ * purple_media_manager_create_private_media:
+ * @manager: The media manager to create the session under.
+ * @account: The account to create the session on.
+ * @conference_type: The conference type to feed into Farsight2.
+ * @remote_user: The remote user to initiate the session with.
+ * @initiator: TRUE if the local user is the initiator of this media call, FALSE otherwise.
+ *
+ * Creates a private media session.
+ * A private media session is a media session which is private to the caller. It is
+ * meant to be used by plugins to create a media session that the front-end does not
+ * get notified about. It is useful especially for sessions with a type of
+ * PURPLE_MEDIA_APPLICATION which the front-end wouldn't know how to handle.
+ *
+ * Returns: A newly created media session.
+ */
+PurpleMedia *purple_media_manager_create_private_media(
+                                                PurpleMediaManager *manager,
+						PurpleAccount *account,
+						const char *conference_type,
+						const char *remote_user,
+						gboolean initiator);
+
+/**
+ * purple_media_manager_get_private_media:
+ * @manager: The media manager to get all of the sessions from.
+ *
+ * Gets all of the private media sessions.
+ *
+ * Returns: A list of all the private media sessions.
+ */
+GList *purple_media_manager_get_private_media(PurpleMediaManager *manager);
+
+/**
+ * purple_media_manager_get_private_media_by_account:
+ * @manager: The media manager to get the sessions from.
+ * @account: The account the sessions are on.
+ *
+ * Gets all of the private media sessions for a given account.
+ *
+ * Returns: A list of the private media sessions on the given account.
+ */
+GList *purple_media_manager_get_private_media_by_account(
+		PurpleMediaManager *manager, PurpleAccount *account);
+
+/**
  * purple_media_manager_create_output_window:
  * @manager: Manager the output windows are registered with.
  * @media: Media session the output windows are registered for.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.