pidgin-2.10.11-private-media.patch 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. # HG changeset patch
  2. # User Youness Alaoui <kakaroto@kakaroto.homelinux.net>
  3. # Date 1404764862 14400
  4. # Node ID d729a9b2126594df3e38647e926ac7c0a7db807b
  5. # Parent 7767aaeade6404396204794f9bc75d9a2cb723f0
  6. Add Private media API
  7. Creating a private media can be useful for plugins that want to create a
  8. PurpleMedia for internal use without the front-end being notified of its
  9. creation.
  10. diff --git a/libpurple/mediamanager.c b/libpurple/mediamanager.c
  11. --- a/libpurple/mediamanager.c
  12. +++ b/libpurple/mediamanager.c
  13. @@ -86,6 +86,7 @@
  14. GstElement *pipeline;
  15. PurpleMediaCaps ui_caps;
  16. GList *medias;
  17. + GList *private_medias;
  18. GList *elements;
  19. GList *output_windows;
  20. gulong next_output_window_id;
  21. @@ -111,6 +112,7 @@
  22. enum {
  23. INIT_MEDIA,
  24. + INIT_PRIVATE_MEDIA,
  25. UI_CAPS_CHANGED,
  26. LAST_SIGNAL
  27. };
  28. @@ -161,6 +163,15 @@
  29. G_TYPE_BOOLEAN, 3, PURPLE_TYPE_MEDIA,
  30. G_TYPE_POINTER, G_TYPE_STRING);
  31. + purple_media_manager_signals[INIT_PRIVATE_MEDIA] =
  32. + g_signal_new ("init-private-media",
  33. + G_TYPE_FROM_CLASS (klass),
  34. + G_SIGNAL_RUN_LAST,
  35. + 0, NULL, NULL,
  36. + purple_smarshal_BOOLEAN__OBJECT_POINTER_STRING,
  37. + G_TYPE_BOOLEAN, 3, PURPLE_TYPE_MEDIA,
  38. + G_TYPE_POINTER, G_TYPE_STRING);
  39. +
  40. purple_media_manager_signals[UI_CAPS_CHANGED] = g_signal_new ("ui-caps-changed",
  41. G_TYPE_FROM_CLASS (klass),
  42. G_SIGNAL_RUN_LAST,
  43. @@ -177,6 +188,7 @@
  44. {
  45. media->priv = PURPLE_MEDIA_MANAGER_GET_PRIVATE(media);
  46. media->priv->medias = NULL;
  47. + media->priv->private_medias = NULL;
  48. media->priv->next_output_window_id = 1;
  49. #ifdef USE_VV
  50. media->priv->backend_type = PURPLE_TYPE_MEDIA_BACKEND_FS2;
  51. @@ -198,6 +210,10 @@
  52. g_list_delete_link(priv->medias, priv->medias)) {
  53. g_object_unref(priv->medias->data);
  54. }
  55. + for (; priv->private_medias; priv->private_medias =
  56. + g_list_delete_link(priv->private_medias, priv->private_medias)) {
  57. + g_object_unref(priv->private_medias->data);
  58. + }
  59. for (; priv->elements; priv->elements =
  60. g_list_delete_link(priv->elements, priv->elements)) {
  61. g_object_unref(priv->elements->data);
  62. @@ -325,12 +341,13 @@
  63. }
  64. #endif /* USE_GSTREAMER */
  65. -PurpleMedia *
  66. -purple_media_manager_create_media(PurpleMediaManager *manager,
  67. - PurpleAccount *account,
  68. - const char *conference_type,
  69. - const char *remote_user,
  70. - gboolean initiator)
  71. +static PurpleMedia *
  72. +create_media(PurpleMediaManager *manager,
  73. + PurpleAccount *account,
  74. + const char *conference_type,
  75. + const char *remote_user,
  76. + gboolean initiator,
  77. + gboolean private)
  78. {
  79. #ifdef USE_VV
  80. PurpleMedia *media;
  81. @@ -343,7 +360,9 @@
  82. "initiator", initiator,
  83. NULL));
  84. - signal_id = purple_media_manager_signals[INIT_MEDIA];
  85. + signal_id = private ?
  86. + purple_media_manager_signals[INIT_PRIVATE_MEDIA] :
  87. + purple_media_manager_signals[INIT_MEDIA];
  88. if (g_signal_has_handler_pending(manager, signal_id, 0, FALSE)) {
  89. gboolean signal_ret;
  90. @@ -356,26 +375,33 @@
  91. }
  92. }
  93. - manager->priv->medias = g_list_append(manager->priv->medias, media);
  94. + if (private)
  95. + manager->priv->private_medias = g_list_append(
  96. + manager->priv->private_medias, media);
  97. + else
  98. + manager->priv->medias = g_list_append(manager->priv->medias, media);
  99. return media;
  100. #else
  101. return NULL;
  102. #endif
  103. }
  104. -GList *
  105. -purple_media_manager_get_media(PurpleMediaManager *manager)
  106. +static GList *
  107. +get_media(PurpleMediaManager *manager, gboolean private)
  108. {
  109. #ifdef USE_VV
  110. - return manager->priv->medias;
  111. + if (private)
  112. + return manager->priv->private_medias;
  113. + else
  114. + return manager->priv->medias;
  115. #else
  116. return NULL;
  117. #endif
  118. }
  119. -GList *
  120. -purple_media_manager_get_media_by_account(PurpleMediaManager *manager,
  121. - PurpleAccount *account)
  122. +static GList *
  123. +get_media_by_account(PurpleMediaManager *manager,
  124. + PurpleAccount *account, gboolean private)
  125. {
  126. #ifdef USE_VV
  127. GList *media = NULL;
  128. @@ -383,7 +409,10 @@
  129. g_return_val_if_fail(PURPLE_IS_MEDIA_MANAGER(manager), NULL);
  130. - iter = manager->priv->medias;
  131. + if (private)
  132. + iter = manager->priv->private_medias;
  133. + else
  134. + iter = manager->priv->medias;
  135. for (; iter; iter = g_list_next(iter)) {
  136. if (purple_media_get_account(iter->data) == account) {
  137. media = g_list_prepend(media, iter->data);
  138. @@ -397,21 +426,73 @@
  139. }
  140. void
  141. -purple_media_manager_remove_media(PurpleMediaManager *manager,
  142. - PurpleMedia *media)
  143. +purple_media_manager_remove_media(PurpleMediaManager *manager, PurpleMedia *media)
  144. {
  145. #ifdef USE_VV
  146. GList *list;
  147. + GList **medias;
  148. g_return_if_fail(manager != NULL);
  149. - list = g_list_find(manager->priv->medias, media);
  150. + if ((list = g_list_find(manager->priv->medias, media))) {
  151. + medias = &manager->priv->medias;
  152. + } else if ((list = g_list_find(manager->priv->private_medias, media))) {
  153. + medias = &manager->priv->private_medias;
  154. + }
  155. +
  156. if (list)
  157. - manager->priv->medias =
  158. - g_list_delete_link(manager->priv->medias, list);
  159. + *medias = g_list_delete_link(*medias, list);
  160. #endif
  161. }
  162. +PurpleMedia *
  163. +purple_media_manager_create_media(PurpleMediaManager *manager,
  164. + PurpleAccount *account,
  165. + const char *conference_type,
  166. + const char *remote_user,
  167. + gboolean initiator)
  168. +{
  169. + return create_media (manager, account, conference_type,
  170. + remote_user, initiator, FALSE);
  171. +}
  172. +
  173. +GList *
  174. +purple_media_manager_get_media(PurpleMediaManager *manager)
  175. +{
  176. + return get_media (manager, FALSE);
  177. +}
  178. +
  179. +GList *
  180. +purple_media_manager_get_media_by_account(PurpleMediaManager *manager,
  181. + PurpleAccount *account)
  182. +{
  183. + return get_media_by_account (manager, account, FALSE);
  184. +}
  185. +
  186. +PurpleMedia *
  187. +purple_media_manager_create_private_media(PurpleMediaManager *manager,
  188. + PurpleAccount *account,
  189. + const char *conference_type,
  190. + const char *remote_user,
  191. + gboolean initiator)
  192. +{
  193. + return create_media (manager, account, conference_type,
  194. + remote_user, initiator, TRUE);
  195. +}
  196. +
  197. +GList *
  198. +purple_media_manager_get_private_media(PurpleMediaManager *manager)
  199. +{
  200. + return get_media (manager, TRUE);
  201. +}
  202. +
  203. +GList *
  204. +purple_media_manager_get_private_media_by_account(PurpleMediaManager *manager,
  205. + PurpleAccount *account)
  206. +{
  207. + return get_media_by_account (manager, account, TRUE);
  208. +}
  209. +
  210. #ifdef USE_VV
  211. static void
  212. request_pad_unlinked_cb(GstPad *pad, GstPad *peer, gpointer user_data)
  213. diff --git a/libpurple/mediamanager.h b/libpurple/mediamanager.h
  214. --- a/libpurple/mediamanager.h
  215. +++ b/libpurple/mediamanager.h
  216. @@ -130,6 +130,56 @@
  217. PurpleMedia *media);
  218. /**
  219. + * Creates a private media session. A private media session is a
  220. + * media session which is private to the caller. It is meant to be
  221. + * used by plugins to create a media session that the front-end does
  222. + * not get notified about. It is useful especially for sessions with a
  223. + * type of PURPLE_MEDIA_APPLICATION which the front-end wouldn't know
  224. + * how to handle.
  225. + *
  226. + * @param manager The media manager to create the session under.
  227. + * @param account The account to create the session on.
  228. + * @param conference_type The conference type to feed into Farsight2.
  229. + * @param remote_user The remote user to initiate the session with.
  230. + * @param initiator TRUE if the local user is the initiator of this media
  231. + * call, FALSE otherwise.
  232. + *
  233. + * @return A newly created media session.
  234. + *
  235. + * @since 2.11.0
  236. + */
  237. +PurpleMedia *purple_media_manager_create_private_media(
  238. + PurpleMediaManager *manager,
  239. + PurpleAccount *account,
  240. + const char *conference_type,
  241. + const char *remote_user,
  242. + gboolean initiator);
  243. +
  244. +/**
  245. + * Gets all of the private media sessions.
  246. + *
  247. + * @param manager The media manager to get all of the sessions from.
  248. + *
  249. + * @return A list of all the private media sessions.
  250. + *
  251. + * @since 2.11.0
  252. + */
  253. +GList *purple_media_manager_get_private_media(PurpleMediaManager *manager);
  254. +
  255. +/**
  256. + * Gets all of the private media sessions for a given account.
  257. + *
  258. + * @param manager The media manager to get the sessions from.
  259. + * @param account The account the sessions are on.
  260. + *
  261. + * @return A list of the private media sessions on the given account.
  262. + *
  263. + * @since 2.11.0
  264. + */
  265. +GList *purple_media_manager_get_private_media_by_account(
  266. + PurpleMediaManager *manager, PurpleAccount *account);
  267. +
  268. +/**
  269. * Signals that output windows should be created for the chosen stream.
  270. *
  271. * This shouldn't be called outside of mediamanager.c and media.c