--- a/libpurple/media.c Tue Oct 26 04:06:28 2021 -0500
+++ b/libpurple/media.c Tue Oct 26 04:07:12 2021 -0500
@@ -852,13 +852,12 @@
-purple_media_set_params(PurpleMedia *media,
- guint num_params, GParameter *params)
+purple_media_set_params(PurpleMedia *media, GHashTable *params) g_return_if_fail(PURPLE_IS_MEDIA(media));
- purple_media_backend_set_params(media->priv->backend, num_params, params);
+ purple_media_backend_set_params(media->priv->backend, params); @@ -990,9 +989,8 @@
purple_media_add_stream(PurpleMedia *media, const gchar *sess_id,
- const gchar *who, PurpleMediaSessionType type,
- gboolean initiator, const gchar *transmitter,
- guint num_params, GParameter *params)
+ const gchar *who, PurpleMediaSessionType type, gboolean initiator, + const gchar *transmitter, GHashTable *params) PurpleMediaSession *session;
@@ -1000,8 +998,8 @@
g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
if (!purple_media_backend_add_stream(media->priv->backend,
- sess_id, who, type, initiator, transmitter,
+ sess_id, who, type, initiator, transmitter, params)) purple_debug_error("media", "Error adding stream.\n");
--- a/libpurple/media.h Tue Oct 26 04:06:28 2021 -0500
+++ b/libpurple/media.h Tue Oct 26 04:07:12 2021 -0500
@@ -175,8 +175,8 @@
* purple_media_set_params:
* @media: The media object to set the parameters on.
- * @num_params: The number of parameters to pass
- * @params: Array of @c GParameter to pass
+ * @params: (element-type utf8 GObject.Value) (transfer none): Hash table of * Sets various optional parameters of the media call.
@@ -189,10 +189,7 @@
* - "sdes-note" : The NOTE to put in SDES messages
* - "sdes-phone" : The PHONE to put in SDES messages
-G_GNUC_BEGIN_IGNORE_DEPRECATIONS
-void purple_media_set_params(PurpleMedia *media,
- guint num_params, GParameter *params);
-G_GNUC_END_IGNORE_DEPRECATIONS
+void purple_media_set_params(PurpleMedia *media, GHashTable *params); * purple_media_get_available_params:
@@ -226,8 +223,8 @@
* @type: The type of stream to create.
* @initiator: Whether or not the local user initiated the stream.
* @transmitter: The transmitter to use for the stream.
- * @num_params: The number of parameters to pass to Farstream.
- * @params: The parameters to pass to Farstream.
+ * @params: (element-type utf8 GObject.Value) (transfer none): The stream + * parameters to pass to Farstream. * Adds a stream to a session.
@@ -236,12 +233,9 @@
* Returns: %TRUE The stream was added successfully, %FALSE otherwise.
-G_GNUC_BEGIN_IGNORE_DEPRECATIONS
gboolean purple_media_add_stream(PurpleMedia *media, const gchar *sess_id,
- const gchar *who, PurpleMediaSessionType type,
- gboolean initiator, const gchar *transmitter,
- guint num_params, GParameter *params);
-G_GNUC_END_IGNORE_DEPRECATIONS
+ const gchar *who, PurpleMediaSessionType type, gboolean initiator, + const gchar *transmitter, GHashTable *params); * purple_media_get_session_type:
--- a/libpurple/media/backend-fs2.c Tue Oct 26 04:06:28 2021 -0500
+++ b/libpurple/media/backend-fs2.c Tue Oct 26 04:07:12 2021 -0500
@@ -32,7 +32,10 @@
#include <purplekeyvaluepair.h>
+/* Ignore deprecations of GParameter in FarStream's headers. */ +G_GNUC_BEGIN_IGNORE_DEPRECATIONS #include <farstream/fs-conference.h>
+G_GNUC_END_IGNORE_DEPRECATIONS #include <farstream/fs-element-added-notifier.h>
#include <farstream/fs-utils.h>
#include <gst/gststructure.h>
@@ -57,8 +60,7 @@
static gboolean purple_media_backend_fs2_add_stream(PurpleMediaBackend *self,
const gchar *sess_id, const gchar *who,
PurpleMediaSessionType type, gboolean initiator,
- const gchar *transmitter,
- guint num_params, GParameter *params);
+ const gchar *transmitter, GHashTable *params); static void purple_media_backend_fs2_add_remote_candidates(
PurpleMediaBackend *self,
const gchar *sess_id, const gchar *participant,
@@ -88,7 +90,7 @@
PurpleMediaBackend *self, const gchar *sess_id,
PurpleMediaCodec *codec);
static void purple_media_backend_fs2_set_params(PurpleMediaBackend *self,
- guint num_params, GParameter *params);
static const gchar **purple_media_backend_fs2_get_available_params(void);
static gboolean purple_media_backend_fs2_send_dtmf(
PurpleMediaBackend *self, const gchar *sess_id,
@@ -1867,7 +1869,7 @@
const gchar *sess_id, const gchar *who,
PurpleMediaSessionType type, gboolean initiator,
const gchar *transmitter,
- guint num_params, GParameter *params)
PurpleMediaBackendFs2Private *priv =
purple_media_backend_fs2_get_instance_private(self);
@@ -1875,8 +1877,11 @@
FsStream *fsstream = NULL;
const gchar *stun_ip = purple_network_get_stun_ip();
const gchar *turn_ip = purple_network_get_turn_ip();
- guint _num_params = num_params;
+ GHashTable *our_params = NULL; + GList *our_values = NULL; FsStreamDirection type_direction =
session_type_to_fs_stream_direction(type);
PurpleMediaBackendFs2Session *session;
@@ -1886,7 +1891,6 @@
we need to do this to allow them to override when using non-standard
TURN modes, like Google f.ex. */
gboolean got_turn_from_protocol = FALSE;
GPtrArray *relay_info = g_ptr_array_new_full (1, (GDestroyNotify) gst_structure_free);
@@ -1921,30 +1925,33 @@
- for (i = 0 ; i < num_params ; i++) {
- if (purple_strequal(params[i].name, "relay-info")) {
- got_turn_from_protocol = TRUE;
+ our_params = g_hash_table_new(g_str_hash, g_str_equal); + g_hash_table_iter_init(&iter, params); + while (g_hash_table_iter_next(&iter, (gpointer)&key, (gpointer)&value)) { + if (purple_strequal(key, "relay-info")) { + got_turn_from_protocol = TRUE; + g_hash_table_insert(our_params, key, value); - _params = g_new0(GParameter, num_params + 3);
- memcpy(_params, params, sizeof(GParameter) * num_params);
/* set the controlling mode parameter */
- _params[_num_params].name = "controlling-mode";
- g_value_init(&_params[_num_params].value, G_TYPE_BOOLEAN);
- g_value_set_boolean(&_params[_num_params].value, initiator);
+ value = g_new(GValue, 1); + g_value_init(value, G_TYPE_BOOLEAN); + g_value_set_boolean(value, initiator); + our_values = g_list_prepend(our_values, value); + g_hash_table_insert(our_params, "controlling-mode", value); purple_debug_info("backend-fs2",
"Setting stun-ip on new stream: %s\n", stun_ip);
- _params[_num_params].name = "stun-ip";
- g_value_init(&_params[_num_params].value, G_TYPE_STRING);
- g_value_set_string(&_params[_num_params].value, stun_ip);
+ value = g_new(GValue, 1); + g_value_init(value, G_TYPE_STRING); + g_value_set_string(value, stun_ip); + our_values = g_list_prepend(our_values, value); + g_hash_table_insert(our_params, "stun-ip", value); if (turn_ip && purple_strequal("nice", transmitter) && !got_turn_from_protocol) {
@@ -1985,17 +1992,22 @@
purple_debug_info("backend-fs2",
"Setting relay-info on new stream\n");
- _params[_num_params].name = "relay-info";
- g_value_init(&_params[_num_params].value, G_TYPE_PTR_ARRAY);
- g_value_set_boxed(&_params[_num_params].value, relay_info);
+ value = g_new(GValue, 1); + g_value_init(value, G_TYPE_PTR_ARRAY); + g_value_set_boxed(value, relay_info); + our_values = g_list_prepend(our_values, value); + g_hash_table_insert(our_params, "relay-info", value); - ret = fs_stream_set_transmitter(fsstream, transmitter,
- _params, _num_params, &err);
- for (i = 0 ; i < _num_params ; i++)
- g_value_unset (&_params[i].value);
+ ret = fs_stream_set_transmitter_ht(fsstream, transmitter, our_params, &err); + while (our_values != NULL) { + value = (GValue *)our_values->data; + our_values = g_list_delete_link(our_values, our_values); + g_hash_table_destroy(our_params); g_ptr_array_unref (relay_info);
@@ -2042,8 +2054,7 @@
purple_media_backend_fs2_add_stream(PurpleMediaBackend *self,
const gchar *sess_id, const gchar *who,
PurpleMediaSessionType type, gboolean initiator,
- const gchar *transmitter,
- guint num_params, GParameter *params)
+ const gchar *transmitter, GHashTable *params) PurpleMediaBackendFs2 *backend = PURPLE_MEDIA_BACKEND_FS2(self);
PurpleMediaBackendFs2Private *priv =
@@ -2084,7 +2095,7 @@
} else if (!create_stream(backend, sess_id, who, type,
- initiator, transmitter, num_params, params)) {
+ initiator, transmitter, params)) { purple_debug_error("backend-fs2",
"Error creating the stream.\n");
@@ -2448,10 +2459,12 @@
purple_media_backend_fs2_set_params(PurpleMediaBackend *self,
- guint num_params, GParameter *params)
PurpleMediaBackendFs2Private *priv;
g_return_if_fail(PURPLE_MEDIA_IS_BACKEND_FS2(self));
@@ -2468,13 +2481,15 @@
g_object_get(G_OBJECT(priv->conference), "sdes", &sdes, NULL);
- for (i = 0; i != num_params; ++i) {
- const gchar *sdes_type = param_to_sdes_type(params[i].name);
+ g_hash_table_iter_init(&iter, params); + while (g_hash_table_iter_next(&iter, (gpointer)&name, (gpointer)&value)) { + const gchar *sdes_type = param_to_sdes_type(name); gst_structure_set(sdes, sdes_type,
- G_TYPE_STRING, g_value_get_string(¶ms[i].value),
+ G_TYPE_STRING, g_value_get_string(value), --- a/libpurple/media/backend-iface.h Tue Oct 26 04:06:28 2021 -0500
+++ b/libpurple/media/backend-iface.h Tue Oct 26 04:07:12 2021 -0500
@@ -66,13 +66,10 @@
/* Implementable functions called with purple_media_backend_* */
- G_GNUC_BEGIN_IGNORE_DEPRECATIONS
gboolean (*add_stream) (PurpleMediaBackend *self,
const gchar *sess_id, const gchar *who,
PurpleMediaSessionType type, gboolean initiator,
- const gchar *transmitter,
- guint num_params, GParameter *params);
- G_GNUC_END_IGNORE_DEPRECATIONS
+ const gchar *transmitter, GHashTable *params); void (*add_remote_candidates) (PurpleMediaBackend *self,
const gchar *sess_id, const gchar *participant,
@@ -98,10 +95,7 @@
gboolean (*set_require_encryption) (PurpleMediaBackend *self,
const gchar *sess_id, const gchar *participant,
gboolean require_encryption);
- G_GNUC_BEGIN_IGNORE_DEPRECATIONS
- void (*set_params) (PurpleMediaBackend *self,
- guint num_params, GParameter *params);
- G_GNUC_END_IGNORE_DEPRECATIONS
+ void (*set_params) (PurpleMediaBackend *self, GHashTable *params); const gchar **(*get_available_params) (void);
gboolean (*send_dtmf) (PurpleMediaBackend *self,
const gchar *sess_id, gchar dtmf, guint8 volume,
@@ -127,20 +121,16 @@
* @type: The media type and direction of the stream to add.
* @initiator: True if the local user initiated the stream.
* @transmitter: The string id of the tranmsitter to use.
- * @num_params: The number of parameters in the param parameter.
- * @params: The additional parameters to pass when creating the stream.
+ * @params: (element-type utf8 GValue) (transfer none): The additional + * parameters to pass when creating the stream. * Creates and adds a stream to the media backend.
* Returns: True if the stream was successfully created, otherwise False.
-G_GNUC_BEGIN_IGNORE_DEPRECATIONS
gboolean purple_media_backend_add_stream(PurpleMediaBackend *self,
- const gchar *sess_id, const gchar *who,
- PurpleMediaSessionType type, gboolean initiator,
- const gchar *transmitter,
- guint num_params, GParameter *params);
-G_GNUC_END_IGNORE_DEPRECATIONS
+ const gchar *sess_id, const gchar *who, PurpleMediaSessionType type, + gboolean initiator, const gchar *transmitter, GHashTable *params); * purple_media_backend_add_remote_candidates:
@@ -277,15 +267,13 @@
* purple_media_backend_set_params:
* @self: The media backend to set the parameters on.
- * @num_params: The number of parameters to pass to backend
- * @params: Array of @c GParameter to pass to backend
+ * @params: (element-type utf8 GObject.Value) (transfer none): Hash table of + * parameters to pass to the backend. * Sets various optional parameters of the media backend.
-G_GNUC_BEGIN_IGNORE_DEPRECATIONS
void purple_media_backend_set_params(PurpleMediaBackend *self,
- guint num_params, GParameter *params);
-G_GNUC_END_IGNORE_DEPRECATIONS
* purple_media_backend_get_available_params:
--- a/libpurple/protocols/jabber/jingle/jingle.c Tue Oct 26 04:06:28 2021 -0500
+++ b/libpurple/protocols/jabber/jingle/jingle.c Tue Oct 26 04:07:12 2021 -0500
@@ -458,37 +458,43 @@
+jingle_param_free(GValue *value) jingle_get_params(JabberStream *js, const gchar *relay_ip, guint relay_udp,
guint relay_tcp, guint relay_ssltcp, const gchar *relay_username,
- const gchar *relay_password, guint *num)
+ const gchar *relay_password) /* don't set a STUN server if one is set globally in prefs, in that case
this will be handled in media.c */
gboolean has_account_stun = js->stun_ip && !purple_network_get_stun_ip();
- guint num_params = has_account_stun ?
- (relay_ip ? 3 : 2) : (relay_ip ? 1 : 0);
- GParameter *params = NULL;
+ GHashTable *params = NULL;
- params = g_new0(GParameter, num_params);
+ if (has_account_stun || relay_ip) { + params = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, (GDestroyNotify)jingle_param_free); purple_debug_info("jabber",
"setting param stun-ip for stream using auto-config: %s\n",
- params[next_index].name = "stun-ip";
- g_value_init(¶ms[next_index].value, G_TYPE_STRING);
- g_value_set_string(¶ms[next_index].value, js->stun_ip);
+ value = g_new(GValue, 1); + g_value_init(value, G_TYPE_STRING); + g_value_set_string(value, js->stun_ip); + g_hash_table_insert(params, "stun-ip", value); purple_debug_info("jabber",
"setting param stun-port for stream using auto-config: %d\n",
- params[next_index].name = "stun-port";
- g_value_init(¶ms[next_index].value, G_TYPE_UINT);
- g_value_set_uint(¶ms[next_index].value, js->stun_port);
+ value = g_new(GValue, 1); + g_value_init(value, G_TYPE_UINT); + g_value_set_uint(value, js->stun_port); + g_hash_table_insert(params, "stun-port", value); @@ -511,16 +517,16 @@
jingle_create_relay_info(relay_ip, relay_ssltcp, relay_username,
relay_password, "tls", relay_info);
- params[next_index].name = "relay-info";
+ value = g_new(GValue, 1); G_GNUC_BEGIN_IGNORE_DEPRECATIONS
- g_value_init(¶ms[next_index].value, G_TYPE_VALUE_ARRAY);
- g_value_set_boxed(¶ms[next_index].value, relay_info);
+ g_value_init(value, G_TYPE_VALUE_ARRAY); + g_value_set_boxed(value, relay_info); g_value_array_free(relay_info);
G_GNUC_END_IGNORE_DEPRECATIONS
+ g_hash_table_insert(params, "relay-info", value);
--- a/libpurple/protocols/jabber/jingle/rtp.c Tue Oct 26 04:06:28 2021 -0500
+++ b/libpurple/protocols/jabber/jingle/rtp.c Tue Oct 26 04:07:12 2021 -0500
@@ -315,8 +315,7 @@
PurpleMediaSessionType type;
JingleTransport *transport;
- GParameter *params = NULL;
+ GHashTable *params = NULL; /* maybe this create ought to just be in initiate and handle initiate */
@@ -360,7 +359,7 @@
jingle_get_params(jingle_session_get_js(session), NULL, 0, 0, 0,
- NULL, NULL, &num_params);
creator = jingle_content_get_creator(content);
@@ -368,7 +367,7 @@
+ g_hash_table_destroy(params); @@ -380,7 +379,7 @@
if(!purple_media_add_stream(media, name, remote_jid,
- type, is_creator, transmitter, num_params, params)) {
+ type, is_creator, transmitter, params)) { purple_media_end(media, NULL, NULL);
/* TODO: How much clean-up is necessary here? (does calling
purple_media_end lead to cleaning up Jingle structs?) */
@@ -391,7 +390,7 @@
+ g_hash_table_destroy(params);