summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Ruprecht <maiku@pidgin.im>2009-10-28 00:12:19 +0000
committerMichael Ruprecht <maiku@pidgin.im>2009-10-28 00:12:19 +0000
commit323c3117e05ecfa288bf2b90bc34640d748151d7 (patch)
treed436567917a8b7979b4cee711c7c5b46addbc506
parent31b39785d3b9f08902aefc389819a4f7f9942cfc (diff)
downloadpidgin-323c3117e05ecfa288bf2b90bc34640d748151d7.tar.gz
Have PURPLE_MEDIA_INFO_ACCEPT in stream-info emit for each accepted stream,
session, participant, and conference.
-rw-r--r--libpurple/media/media.c53
1 files changed, 52 insertions, 1 deletions
diff --git a/libpurple/media/media.c b/libpurple/media/media.c
index 8519b3313b..68ad2298c8 100644
--- a/libpurple/media/media.c
+++ b/libpurple/media/media.c
@@ -731,19 +731,70 @@ purple_media_stream_info(PurpleMedia *media, PurpleMediaInfoType type,
g_return_if_fail(PURPLE_IS_MEDIA(media));
if (type == PURPLE_MEDIA_INFO_ACCEPT) {
- GList *streams;
+ GList *streams, *sessions = NULL, *participants = NULL;
g_return_if_fail(PURPLE_IS_MEDIA(media));
streams = purple_media_get_streams(media,
session_id, participant);
+ /* Emit stream acceptance */
for (; streams; streams =
g_list_delete_link(streams, streams)) {
PurpleMediaStream *stream = streams->data;
stream->accepted = TRUE;
+
+ g_signal_emit(media,
+ purple_media_signals[STREAM_INFO],
+ 0, type, stream->session->id,
+ stream->participant, local);
+
+ 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));
}
+
+ /* Emit session acceptance */
+ for (; sessions; sessions =
+ g_list_delete_link(sessions, sessions)) {
+ PurpleMediaSession *session = sessions->data;
+
+ if (purple_media_accepted(media, session->id, NULL))
+ g_signal_emit(media, purple_media_signals[
+ STREAM_INFO], 0,
+ PURPLE_MEDIA_INFO_ACCEPT,
+ session->id, NULL, local);
+ }
+
+ /* Emit participant acceptance */
+ for (; participants; participants = g_list_delete_link(
+ participants, participants)) {
+ gchar *participant = participants->data;
+
+ if (purple_media_accepted(media, NULL, participant))
+ g_signal_emit(media, purple_media_signals[
+ STREAM_INFO], 0,
+ PURPLE_MEDIA_INFO_ACCEPT,
+ NULL, participant, local);
+
+ g_free(participant);
+ }
+
+ /* Emit conference acceptance */
+ if (purple_media_accepted(media, NULL, NULL))
+ g_signal_emit(media,
+ purple_media_signals[STREAM_INFO],
+ 0, PURPLE_MEDIA_INFO_ACCEPT,
+ NULL, NULL, local);
+
+ return;
}
g_signal_emit(media, purple_media_signals[STREAM_INFO],