besser82 / rpms / pidgin

Forked from rpms/pidgin 6 years ago
Clone
David Woodhouse 313cf00
David Woodhouse 313cf00
# HG changeset patch
David Woodhouse 313cf00
# User Youness Alaoui <kakaroto@kakaroto.homelinux.net>
David Woodhouse 313cf00
# Date 1404764862 14400
David Woodhouse 313cf00
# Node ID d729a9b2126594df3e38647e926ac7c0a7db807b
David Woodhouse 313cf00
# Parent  7767aaeade6404396204794f9bc75d9a2cb723f0
David Woodhouse 313cf00
Add Private media API
David Woodhouse 313cf00
David Woodhouse 313cf00
Creating a private media can be useful for plugins that want to create a
David Woodhouse 313cf00
PurpleMedia for internal use without the front-end being notified of its
David Woodhouse 313cf00
creation.
David Woodhouse 313cf00
David Woodhouse 313cf00
diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c
David Woodhouse 313cf00
--- a/libpurple/mediamanager.c
David Woodhouse 313cf00
+++ b/libpurple/mediamanager.c
David Woodhouse 313cf00
@@ -86,6 +86,7 @@
David Woodhouse 313cf00
 	GstElement *pipeline;
David Woodhouse 313cf00
 	PurpleMediaCaps ui_caps;
David Woodhouse 313cf00
 	GList *medias;
David Woodhouse 313cf00
+	GList *private_medias;
David Woodhouse 313cf00
 	GList *elements;
David Woodhouse 313cf00
 	GList *output_windows;
David Woodhouse 313cf00
 	gulong next_output_window_id;
David Woodhouse 313cf00
@@ -111,6 +112,7 @@
David Woodhouse 313cf00
 
David Woodhouse 313cf00
 enum {
David Woodhouse 313cf00
 	INIT_MEDIA,
David Woodhouse 313cf00
+	INIT_PRIVATE_MEDIA,
David Woodhouse 313cf00
 	UI_CAPS_CHANGED,
David Woodhouse 313cf00
 	LAST_SIGNAL
David Woodhouse 313cf00
 };
David Woodhouse 313cf00
@@ -161,6 +163,15 @@
David Woodhouse 313cf00
 		G_TYPE_BOOLEAN, 3, PURPLE_TYPE_MEDIA,
David Woodhouse 313cf00
 		G_TYPE_POINTER, G_TYPE_STRING);
David Woodhouse 313cf00
 
David Woodhouse 313cf00
+	purple_media_manager_signals[INIT_PRIVATE_MEDIA] =
David Woodhouse 313cf00
+		g_signal_new ("init-private-media",
David Woodhouse 313cf00
+			G_TYPE_FROM_CLASS (klass),
David Woodhouse 313cf00
+			G_SIGNAL_RUN_LAST,
David Woodhouse 313cf00
+			0, NULL, NULL,
David Woodhouse 313cf00
+			purple_smarshal_BOOLEAN__OBJECT_POINTER_STRING,
David Woodhouse 313cf00
+			G_TYPE_BOOLEAN, 3, PURPLE_TYPE_MEDIA,
David Woodhouse 313cf00
+			G_TYPE_POINTER, G_TYPE_STRING);
David Woodhouse 313cf00
+
David Woodhouse 313cf00
 	purple_media_manager_signals[UI_CAPS_CHANGED] = g_signal_new ("ui-caps-changed",
David Woodhouse 313cf00
 		G_TYPE_FROM_CLASS (klass),
David Woodhouse 313cf00
 		G_SIGNAL_RUN_LAST,
David Woodhouse 313cf00
@@ -177,6 +188,7 @@
David Woodhouse 313cf00
 {
David Woodhouse 313cf00
 	media->priv = PURPLE_MEDIA_MANAGER_GET_PRIVATE(media);
David Woodhouse 313cf00
 	media->priv->medias = NULL;
David Woodhouse 313cf00
+	media->priv->private_medias = NULL;
David Woodhouse 313cf00
 	media->priv->next_output_window_id = 1;
David Woodhouse 313cf00
 #ifdef USE_VV
David Woodhouse 313cf00
 	media->priv->backend_type = PURPLE_TYPE_MEDIA_BACKEND_FS2;
David Woodhouse 313cf00
@@ -198,6 +210,10 @@
David Woodhouse 313cf00
 			g_list_delete_link(priv->medias, priv->medias)) {
David Woodhouse 313cf00
 		g_object_unref(priv->medias->data);
David Woodhouse 313cf00
 	}
David Woodhouse 313cf00
+	for (; priv->private_medias; priv->private_medias =
David Woodhouse 313cf00
+			g_list_delete_link(priv->private_medias, priv->private_medias)) {
David Woodhouse 313cf00
+		g_object_unref(priv->private_medias->data);
David Woodhouse 313cf00
+	}
David Woodhouse 313cf00
 	for (; priv->elements; priv->elements =
David Woodhouse 313cf00
 			g_list_delete_link(priv->elements, priv->elements)) {
David Woodhouse 313cf00
 		g_object_unref(priv->elements->data);
David Woodhouse 313cf00
@@ -325,12 +341,13 @@
David Woodhouse 313cf00
 }
David Woodhouse 313cf00
 #endif /* USE_GSTREAMER */
David Woodhouse 313cf00
 
David Woodhouse 313cf00
-PurpleMedia *
David Woodhouse 313cf00
-purple_media_manager_create_media(PurpleMediaManager *manager,
David Woodhouse 313cf00
-				  PurpleAccount *account,
David Woodhouse 313cf00
-				  const char *conference_type,
David Woodhouse 313cf00
-				  const char *remote_user,
David Woodhouse 313cf00
-				  gboolean initiator)
David Woodhouse 313cf00
+static PurpleMedia *
David Woodhouse 313cf00
+create_media(PurpleMediaManager *manager,
David Woodhouse 313cf00
+			  PurpleAccount *account,
David Woodhouse 313cf00
+			  const char *conference_type,
David Woodhouse 313cf00
+			  const char *remote_user,
David Woodhouse 313cf00
+			  gboolean initiator,
David Woodhouse 313cf00
+			  gboolean private)
David Woodhouse 313cf00
 {
David Woodhouse 313cf00
 #ifdef USE_VV
David Woodhouse 313cf00
 	PurpleMedia *media;
David Woodhouse 313cf00
@@ -343,7 +360,9 @@
David Woodhouse 313cf00
 			     "initiator", initiator,
David Woodhouse 313cf00
 			     NULL));
David Woodhouse 313cf00
 
David Woodhouse 313cf00
-	signal_id = purple_media_manager_signals[INIT_MEDIA];
David Woodhouse 313cf00
+	signal_id = private ?
David Woodhouse 313cf00
+			purple_media_manager_signals[INIT_PRIVATE_MEDIA] :
David Woodhouse 313cf00
+			purple_media_manager_signals[INIT_MEDIA];
David Woodhouse 313cf00
 
David Woodhouse 313cf00
 	if (g_signal_has_handler_pending(manager, signal_id, 0, FALSE)) {
David Woodhouse 313cf00
 		gboolean signal_ret;
David Woodhouse 313cf00
@@ -356,26 +375,33 @@
David Woodhouse 313cf00
 		}
David Woodhouse 313cf00
 	}
David Woodhouse 313cf00
 
David Woodhouse 313cf00
-	manager->priv->medias = g_list_append(manager->priv->medias, media);
David Woodhouse 313cf00
+	if (private)
David Woodhouse 313cf00
+		manager->priv->private_medias = g_list_append(
David Woodhouse 313cf00
+			manager->priv->private_medias, media);
David Woodhouse 313cf00
+	else
David Woodhouse 313cf00
+		manager->priv->medias = g_list_append(manager->priv->medias, media);
David Woodhouse 313cf00
 	return media;
David Woodhouse 313cf00
 #else
David Woodhouse 313cf00
 	return NULL;
David Woodhouse 313cf00
 #endif
David Woodhouse 313cf00
 }
David Woodhouse 313cf00
 
David Woodhouse 313cf00
-GList *
David Woodhouse 313cf00
-purple_media_manager_get_media(PurpleMediaManager *manager)
David Woodhouse 313cf00
+static GList *
David Woodhouse 313cf00
+get_media(PurpleMediaManager *manager, gboolean private)
David Woodhouse 313cf00
 {
David Woodhouse 313cf00
 #ifdef USE_VV
David Woodhouse 313cf00
-	return manager->priv->medias;
David Woodhouse 313cf00
+	if (private)
David Woodhouse 313cf00
+		return manager->priv->private_medias;
David Woodhouse 313cf00
+	else
David Woodhouse 313cf00
+		return manager->priv->medias;
David Woodhouse 313cf00
 #else
David Woodhouse 313cf00
 	return NULL;
David Woodhouse 313cf00
 #endif
David Woodhouse 313cf00
 }
David Woodhouse 313cf00
 
David Woodhouse 313cf00
-GList *
David Woodhouse 313cf00
-purple_media_manager_get_media_by_account(PurpleMediaManager *manager,
David Woodhouse 313cf00
-		PurpleAccount *account)
David Woodhouse 313cf00
+static GList *
David Woodhouse 313cf00
+get_media_by_account(PurpleMediaManager *manager,
David Woodhouse 313cf00
+		PurpleAccount *account, gboolean private)
David Woodhouse 313cf00
 {
David Woodhouse 313cf00
 #ifdef USE_VV
David Woodhouse 313cf00
 	GList *media = NULL;
David Woodhouse 313cf00
@@ -383,7 +409,10 @@
David Woodhouse 313cf00
 
David Woodhouse 313cf00
 	g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), NULL);
David Woodhouse 313cf00
 
David Woodhouse 313cf00
-	iter = manager->priv->medias;
David Woodhouse 313cf00
+	if (private)
David Woodhouse 313cf00
+		iter = manager->priv->private_medias;
David Woodhouse 313cf00
+	else
David Woodhouse 313cf00
+		iter = manager->priv->medias;
David Woodhouse 313cf00
 	for (; iter; iter = g_list_next(iter)) {
David Woodhouse 313cf00
 		if (purple_media_get_account(iter->data) == account) {
David Woodhouse 313cf00
 			media = g_list_prepend(media, iter->data);
David Woodhouse 313cf00
@@ -397,21 +426,73 @@
David Woodhouse 313cf00
 }
David Woodhouse 313cf00
 
David Woodhouse 313cf00
 void
David Woodhouse 313cf00
-purple_media_manager_remove_media(PurpleMediaManager *manager,
David Woodhouse 313cf00
-				  PurpleMedia *media)
David Woodhouse 313cf00
+purple_media_manager_remove_media(PurpleMediaManager *manager, PurpleMedia *media)
David Woodhouse 313cf00
 {
David Woodhouse 313cf00
 #ifdef USE_VV
David Woodhouse 313cf00
 	GList *list;
David Woodhouse 313cf00
+	GList **medias;
David Woodhouse 313cf00
 
David Woodhouse 313cf00
 	g_return_if_fail(manager != NULL);
David Woodhouse 313cf00
 
David Woodhouse 313cf00
-	list = g_list_find(manager->priv->medias, media);
David Woodhouse 313cf00
+	if ((list = g_list_find(manager->priv->medias, media))) {
David Woodhouse 313cf00
+		medias = &manager->priv->medias;
David Woodhouse 313cf00
+	} else if ((list = g_list_find(manager->priv->private_medias, media))) {
David Woodhouse 313cf00
+		medias = &manager->priv->private_medias;
David Woodhouse 313cf00
+	}
David Woodhouse 313cf00
+
David Woodhouse 313cf00
 	if (list)
David Woodhouse 313cf00
-		manager->priv->medias =
David Woodhouse 313cf00
-			g_list_delete_link(manager->priv->medias, list);
David Woodhouse 313cf00
+		*medias = g_list_delete_link(*medias, list);
David Woodhouse 313cf00
 #endif
David Woodhouse 313cf00
 }
David Woodhouse 313cf00
 
David Woodhouse 313cf00
+PurpleMedia *
David Woodhouse 313cf00
+purple_media_manager_create_media(PurpleMediaManager *manager,
David Woodhouse 313cf00
+				  PurpleAccount *account,
David Woodhouse 313cf00
+				  const char *conference_type,
David Woodhouse 313cf00
+				  const char *remote_user,
David Woodhouse 313cf00
+				  gboolean initiator)
David Woodhouse 313cf00
+{
David Woodhouse 313cf00
+	return create_media (manager, account, conference_type,
David Woodhouse 313cf00
+						  remote_user, initiator, FALSE);
David Woodhouse 313cf00
+}
David Woodhouse 313cf00
+
David Woodhouse 313cf00
+GList *
David Woodhouse 313cf00
+purple_media_manager_get_media(PurpleMediaManager *manager)
David Woodhouse 313cf00
+{
David Woodhouse 313cf00
+	return get_media (manager, FALSE);
David Woodhouse 313cf00
+}
David Woodhouse 313cf00
+
David Woodhouse 313cf00
+GList *
David Woodhouse 313cf00
+purple_media_manager_get_media_by_account(PurpleMediaManager *manager,
David Woodhouse 313cf00
+		PurpleAccount *account)
David Woodhouse 313cf00
+{
David Woodhouse 313cf00
+	return get_media_by_account (manager, account, FALSE);
David Woodhouse 313cf00
+}
David Woodhouse 313cf00
+
David Woodhouse 313cf00
+PurpleMedia *
David Woodhouse 313cf00
+purple_media_manager_create_private_media(PurpleMediaManager *manager,
David Woodhouse 313cf00
+				  PurpleAccount *account,
David Woodhouse 313cf00
+				  const char *conference_type,
David Woodhouse 313cf00
+				  const char *remote_user,
David Woodhouse 313cf00
+				  gboolean initiator)
David Woodhouse 313cf00
+{
David Woodhouse 313cf00
+	return create_media (manager, account, conference_type,
David Woodhouse 313cf00
+		remote_user, initiator, TRUE);
David Woodhouse 313cf00
+}
David Woodhouse 313cf00
+
David Woodhouse 313cf00
+GList *
David Woodhouse 313cf00
+purple_media_manager_get_private_media(PurpleMediaManager *manager)
David Woodhouse 313cf00
+{
David Woodhouse 313cf00
+	return get_media (manager, TRUE);
David Woodhouse 313cf00
+}
David Woodhouse 313cf00
+
David Woodhouse 313cf00
+GList *
David Woodhouse 313cf00
+purple_media_manager_get_private_media_by_account(PurpleMediaManager *manager,
David Woodhouse 313cf00
+		PurpleAccount *account)
David Woodhouse 313cf00
+{
David Woodhouse 313cf00
+	return get_media_by_account (manager, account, TRUE);
David Woodhouse 313cf00
+}
David Woodhouse 313cf00
+
David Woodhouse 313cf00
 #ifdef USE_VV
David Woodhouse 313cf00
 static void
David Woodhouse 313cf00
 request_pad_unlinked_cb(GstPad *pad, GstPad *peer, gpointer user_data)
David Woodhouse 313cf00
diff --git a/libpurple/mediamanager.h b/libpurple/mediamanager.h
David Woodhouse 313cf00
--- a/libpurple/mediamanager.h
David Woodhouse 313cf00
+++ b/libpurple/mediamanager.h
David Woodhouse 313cf00
@@ -130,6 +130,56 @@
David Woodhouse 313cf00
 				  PurpleMedia *media);
David Woodhouse 313cf00
 
David Woodhouse 313cf00
 /**
David Woodhouse 313cf00
+ * Creates a private media session.  A private media session is a
David Woodhouse 313cf00
+ * media session which is private to the caller. It is meant to be
David Woodhouse 313cf00
+ * used by plugins to create a media session that the front-end does
David Woodhouse 313cf00
+ * not get notified about. It is useful especially for sessions with a
David Woodhouse 313cf00
+ * type of PURPLE_MEDIA_APPLICATION which the front-end wouldn't know
David Woodhouse 313cf00
+ * how to handle.
David Woodhouse 313cf00
+ *
David Woodhouse 313cf00
+ * @param manager The media manager to create the session under.
David Woodhouse 313cf00
+ * @param account The account to create the session on.
David Woodhouse 313cf00
+ * @param conference_type The conference type to feed into Farsight2.
David Woodhouse 313cf00
+ * @param remote_user The remote user to initiate the session with.
David Woodhouse 313cf00
+ * @param initiator TRUE if the local user is the initiator of this media
David Woodhouse 313cf00
+ *        call, FALSE otherwise.
David Woodhouse 313cf00
+ *
David Woodhouse 313cf00
+ * @return A newly created media session.
David Woodhouse 313cf00
+ *
David Woodhouse 313cf00
+ * @since 2.11.0
David Woodhouse 313cf00
+ */
David Woodhouse 313cf00
+PurpleMedia *purple_media_manager_create_private_media(
David Woodhouse 313cf00
+                                                PurpleMediaManager *manager,
David Woodhouse 313cf00
+						PurpleAccount *account,
David Woodhouse 313cf00
+						const char *conference_type,
David Woodhouse 313cf00
+						const char *remote_user,
David Woodhouse 313cf00
+						gboolean initiator);
David Woodhouse 313cf00
+
David Woodhouse 313cf00
+/**
David Woodhouse 313cf00
+ * Gets all of the private media sessions.
David Woodhouse 313cf00
+ *
David Woodhouse 313cf00
+ * @param manager The media manager to get all of the sessions from.
David Woodhouse 313cf00
+ *
David Woodhouse 313cf00
+ * @return A list of all the private media sessions.
David Woodhouse 313cf00
+ *
David Woodhouse 313cf00
+ * @since 2.11.0
David Woodhouse 313cf00
+ */
David Woodhouse 313cf00
+GList *purple_media_manager_get_private_media(PurpleMediaManager *manager);
David Woodhouse 313cf00
+
David Woodhouse 313cf00
+/**
David Woodhouse 313cf00
+ * Gets all of the private media sessions for a given account.
David Woodhouse 313cf00
+ *
David Woodhouse 313cf00
+ * @param manager The media manager to get the sessions from.
David Woodhouse 313cf00
+ * @param account The account the sessions are on.
David Woodhouse 313cf00
+ *
David Woodhouse 313cf00
+ * @return A list of the private media sessions on the given account.
David Woodhouse 313cf00
+ *
David Woodhouse 313cf00
+ * @since 2.11.0
David Woodhouse 313cf00
+ */
David Woodhouse 313cf00
+GList *purple_media_manager_get_private_media_by_account(
David Woodhouse 313cf00
+		PurpleMediaManager *manager, PurpleAccount *account);
David Woodhouse 313cf00
+
David Woodhouse 313cf00
+/**
David Woodhouse 313cf00
  * Signals that output windows should be created for the chosen stream.
David Woodhouse 313cf00
  *
David Woodhouse 313cf00
  * This shouldn't be called outside of mediamanager.c and media.c
David Woodhouse 313cf00