# HG changeset patch # User Mike Ruprecht # Date 1212206478 0 # Node ID d048100a43abf19e55ce14ac63b2b977ec2e75ba # Parent 10f5a529d2a67d45a1973a4ec7c1cc82b7e454ee Free the PurpleMedia object when the media session ends and fix ending the session when the conversation is closed. diff -r 10f5a529d2a6 -r d048100a43ab libpurple/media.c --- a/libpurple/media.c Wed May 28 21:13:36 2008 +0000 +++ b/libpurple/media.c Sat May 31 04:01:18 2008 +0000 @@ -253,6 +253,62 @@ static void purple_media_finalize (GObject *media) { + PurpleMediaPrivate *priv = PURPLE_MEDIA_GET_PRIVATE(media); + GList *iter; + purple_debug_info("media","purple_media_finalize\n"); + + g_free(priv->name); + + if (priv->audio_pipeline) { + gst_element_set_state(priv->audio_pipeline, GST_STATE_NULL); + gst_object_unref(priv->audio_pipeline); + } + if (priv->video_pipeline) { + gst_element_set_state(priv->video_pipeline, GST_STATE_NULL); + gst_object_unref(priv->video_pipeline); + } + + if (priv->audio_src) + gst_object_unref(priv->audio_src); + if (priv->audio_sink) + gst_object_unref(priv->audio_sink); + if (priv->video_src) + gst_object_unref(priv->video_src); + if (priv->video_sink) + gst_object_unref(priv->video_sink); + + for (iter = priv->audio_streams; iter; iter = g_list_next(iter)) { + g_object_unref(iter->data); + } + g_list_free(priv->audio_streams); + + for (iter = priv->video_streams; iter; iter = g_list_next(iter)) { + g_object_unref(iter->data); + } + g_list_free(priv->video_streams); + + if (priv->audio_session) + g_object_unref(priv->audio_session); + if (priv->video_session) + g_object_unref(priv->video_session); + + for (iter = priv->participants; iter; iter = g_list_next(iter)) { + g_object_unref(iter->data); + } + g_list_free(priv->participants); + + for (iter = priv->local_candidates; iter; iter = g_list_next(iter)) { + g_free(iter->data); + } + g_list_free(priv->local_candidates); + + if (priv->local_candidate) + g_free(priv->local_candidate); + if (priv->remote_candidate) + g_free(priv->remote_candidate); + + gst_object_unref(priv->conference); + parent_class->finalize(media); } diff -r 10f5a529d2a6 -r d048100a43ab libpurple/protocols/jabber/jingle.c --- a/libpurple/protocols/jabber/jingle.c Wed May 28 21:13:36 2008 +0000 +++ b/libpurple/protocols/jabber/jingle.c Sat May 31 04:01:18 2008 +0000 @@ -101,6 +101,7 @@ { g_hash_table_remove(sess->js->sessions, sess->id); g_free(sess->id); + g_object_unref(sess->media); g_free(sess); } @@ -119,13 +120,18 @@ { GList *values = g_hash_table_get_values(js->sessions); GList *iter = values; + gboolean use_bare = strchr(jid, '/') == NULL; for (; iter; iter = iter->next) { JingleSession *session = (JingleSession *)iter->data; - if (session->js == js && !strcmp(jid, session->remote_jid)) { + gchar *cmp_jid = use_bare ? jabber_get_bare_jid(session->remote_jid) + : g_strdup(session->remote_jid); + if (!strcmp(jid, cmp_jid)) { + g_free(cmp_jid); g_list_free(values); return session; } + g_free(cmp_jid); } g_list_free(values);