summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Adam <jakub.adam@ktknet.cz>2017-10-02 13:27:23 +0200
committerJakub Adam <jakub.adam@ktknet.cz>2017-10-02 13:27:23 +0200
commit2c57430fe0d6e64dca6cbe5367fb8703b1aa9101 (patch)
treee0e17159417852081ab2cb362e1a115389c5327e
parent4e0d38dec2c9bd84cd88ff2039c93522af884974 (diff)
downloadpidgin-2c57430fe0d6e64dca6cbe5367fb8703b1aa9101.tar.gz
media: don't expect FsParticipant always has "cname" property
Because only FsRtpParticipant instances have "cname", libpurple crashed when PurpleMedia was created with conference_type other than "fsrtpconference"[1]. We still set "cname" for Farstream's internal use if the property is present, but libpurple now adds its custom GObject data with key "purple-name" to the participant instance to store and retrieve the participant name in a manner independent of the type of Farstream conference. [1] https://developer.pidgin.im/ticket/17246
-rw-r--r--libpurple/media/backend-fs2.c25
1 files changed, 14 insertions, 11 deletions
diff --git a/libpurple/media/backend-fs2.c b/libpurple/media/backend-fs2.c
index fd658ce0c1..036efb1918 100644
--- a/libpurple/media/backend-fs2.c
+++ b/libpurple/media/backend-fs2.c
@@ -1151,7 +1151,7 @@ gst_handle_message_element(GstBus *bus, GstMessage *msg,
FsParticipant *participant;
PurpleMediaBackendFs2Session *session;
PurpleMediaBackendFs2Stream *media_stream;
- gchar *name;
+ const gchar *name;
value = gst_structure_get_value(structure, "stream");
stream = g_value_get_object(value);
@@ -1165,8 +1165,7 @@ gst_handle_message_element(GstBus *bus, GstMessage *msg,
local_candidate->foundation);
g_object_get(stream, "participant", &participant, NULL);
- g_object_get(participant, "cname", &name, NULL);
- g_object_unref(participant);
+ name = g_object_get_data(G_OBJECT(participant), "purple-name");
media_stream = get_stream(self, session->id, name);
media_stream->local_candidates = g_list_append(
@@ -1177,6 +1176,7 @@ gst_handle_message_element(GstBus *bus, GstMessage *msg,
g_signal_emit_by_name(self, "new-candidate",
session->id, name, candidate);
g_object_unref(candidate);
+ g_object_unref(participant);
} else if (gst_structure_has_name(structure,
#ifdef HAVE_FARSIGHT
"farsight-local-candidates-prepared")) {
@@ -1187,18 +1187,18 @@ gst_handle_message_element(GstBus *bus, GstMessage *msg,
FsStream *stream;
FsParticipant *participant;
PurpleMediaBackendFs2Session *session;
- gchar *name;
value = gst_structure_get_value(structure, "stream");
stream = g_value_get_object(value);
session = get_session_from_fs_stream(self, stream);
g_object_get(stream, "participant", &participant, NULL);
- g_object_get(participant, "cname", &name, NULL);
- g_object_unref(participant);
g_signal_emit_by_name(self, "candidates-prepared",
- session->id, name);
+ session->id,
+ g_object_get_data(G_OBJECT(participant), "purple-name"));
+
+ g_object_unref(participant);
} else if (gst_structure_has_name(structure,
#ifdef HAVE_FARSIGHT
"farsight-new-active-candidate-pair")) {
@@ -1212,7 +1212,6 @@ gst_handle_message_element(GstBus *bus, GstMessage *msg,
FsParticipant *participant;
PurpleMediaBackendFs2Session *session;
PurpleMediaCandidate *lcandidate, *rcandidate;
- gchar *name;
value = gst_structure_get_value(structure, "stream");
stream = g_value_get_object(value);
@@ -1222,8 +1221,6 @@ gst_handle_message_element(GstBus *bus, GstMessage *msg,
remote_candidate = g_value_get_boxed(value);
g_object_get(stream, "participant", &participant, NULL);
- g_object_get(participant, "cname", &name, NULL);
- g_object_unref(participant);
session = get_session_from_fs_stream(self, stream);
@@ -1231,8 +1228,11 @@ gst_handle_message_element(GstBus *bus, GstMessage *msg,
rcandidate = candidate_from_fs(remote_candidate);
g_signal_emit_by_name(self, "active-candidate-pair",
- session->id, name, lcandidate, rcandidate);
+ session->id,
+ g_object_get_data(G_OBJECT(participant), "purple-name"),
+ lcandidate, rcandidate);
+ g_object_unref(participant);
g_object_unref(lcandidate);
g_object_unref(rcandidate);
} else if (gst_structure_has_name(structure,
@@ -1959,6 +1959,9 @@ create_participant(PurpleMediaBackendFs2 *self, const gchar *name)
return FALSE;
}
+ g_object_set_data_full(G_OBJECT(participant), "purple-name",
+ g_strdup(name), g_free);
+
#ifndef HAVE_FARSIGHT
if (g_object_class_find_property(G_OBJECT_GET_CLASS(participant),
"cname")) {