cpw.maiku.media_refactor: 849fc4c2: Emit PURPLE_MEDIA_END state-changed sign...
maiku at pidgin.im
maiku at pidgin.im
Tue Oct 27 20:28:00 EDT 2009
-----------------------------------------------------------------
Revision: 849fc4c22258b647b93f48c4abcedf7fe5beb9f4
Ancestor: df62408c68e8a12f56ff200b90cdf1867ae09479
Author: maiku at pidgin.im
Date: 2009-10-27T23:44:34
Branch: im.pidgin.cpw.maiku.media_refactor
URL: http://d.pidgin.im/viewmtn/revision/info/849fc4c22258b647b93f48c4abcedf7fe5beb9f4
Modified files:
libpurple/media/media.c
ChangeLog:
Emit PURPLE_MEDIA_END state-changed signals for each stream, session, and
participant.
-------------- next part --------------
============================================================
--- libpurple/media/media.c a9b2df028017939342b607233fdc84fee2b92c27
+++ libpurple/media/media.c 512781b69967a7008ddbbc19144a3baf6f408410
@@ -634,12 +634,90 @@ purple_media_end(PurpleMedia *media,
const gchar *session_id, const gchar *participant)
{
#ifdef USE_VV
+ GList *iter, *sessions = NULL, *participants = NULL;
+
g_return_if_fail(PURPLE_IS_MEDIA(media));
- if (session_id == NULL && participant == NULL) {
+
+ iter = purple_media_get_streams(media, session_id, participant);
+
+ /* Free matching streams */
+ for (; iter; iter = g_list_delete_link(iter, iter)) {
+ PurpleMediaStream *stream = iter->data;
+
g_signal_emit(media, purple_media_signals[STATE_CHANGED],
0, PURPLE_MEDIA_STATE_END,
+ stream->session->id, stream->participant);
+
+ media->priv->streams =
+ g_list_remove(media->priv->streams, stream);
+
+ if (g_list_find(sessions, stream->session) == NULL)
+ sessions = g_list_prepend(sessions, stream->session);
+
+ if (g_list_find_custom(participants, stream->participant,
+ (GCompareFunc)strcmp) == NULL)
+ participants = g_list_prepend(participants,
+ g_strdup(stream->participant));
+
+ purple_media_stream_free(stream);
+ }
+
+ iter = media->priv->streams;
+
+ /* Reduce to list of sessions to remove */
+ for (; iter; iter = g_list_next(iter)) {
+ PurpleMediaStream *stream = iter->data;
+
+ sessions = g_list_remove(sessions, stream->session);
+ }
+
+ /* Free sessions with no streams left */
+ for (; sessions; sessions = g_list_delete_link(sessions, sessions)) {
+ PurpleMediaSession *session = sessions->data;
+
+ g_signal_emit(media, purple_media_signals[STATE_CHANGED],
+ 0, PURPLE_MEDIA_STATE_END,
+ session->id, NULL);
+
+ g_hash_table_remove(media->priv->sessions, session->id);
+ purple_media_session_free(session);
+ }
+
+ iter = media->priv->streams;
+
+ /* Reduce to list of participants to remove */
+ for (; iter; iter = g_list_next(iter)) {
+ PurpleMediaStream *stream = iter->data;
+ GList *tmp;
+
+ tmp = g_list_find_custom(participants,
+ stream->participant, (GCompareFunc)strcmp);
+
+ if (tmp != NULL) {
+ g_free(tmp->data);
+ participants = g_list_delete_link(participants, tmp);
+ }
+ }
+
+ /* Remove participants with no streams left (just emit the signal) */
+ for (; participants; participants =
+ g_list_delete_link(participants, participants)) {
+ gchar *participant = participants->data;
+
+ g_signal_emit(media, purple_media_signals[STATE_CHANGED],
+ 0, PURPLE_MEDIA_STATE_END,
+ NULL, participant);
+
+ g_free(participant);
+ }
+
+ /* Free the conference if no sessions left */
+ if (g_hash_table_size(media->priv->sessions) == 0) {
+ g_signal_emit(media, purple_media_signals[STATE_CHANGED],
+ 0, PURPLE_MEDIA_STATE_END,
NULL, NULL);
g_object_unref(media);
+ return;
}
#endif
}
More information about the Commits
mailing list