diff options
author | Jakub Adam <jakub.adam@ktknet.cz> | 2017-10-02 13:27:23 +0200 |
---|---|---|
committer | Jakub Adam <jakub.adam@ktknet.cz> | 2017-10-02 13:27:23 +0200 |
commit | 2c57430fe0d6e64dca6cbe5367fb8703b1aa9101 (patch) | |
tree | e0e17159417852081ab2cb362e1a115389c5327e | |
parent | 4e0d38dec2c9bd84cd88ff2039c93522af884974 (diff) | |
download | pidgin-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.c | 25 |
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")) { |