Mercurial > pidgin
comparison libpurple/media/media.c @ 29207:bcee1aab1c01
Keep track of participants better in purple_media_stream_info.
author | maiku@pidgin.im |
---|---|
date | Wed, 28 Oct 2009 18:24:10 +0000 |
parents | 80bdae3ea957 |
children | f66dec812ba9 |
comparison
equal
deleted
inserted
replaced
29206:80bdae3ea957 | 29207:bcee1aab1c01 |
---|---|
807 NULL, NULL, local); | 807 NULL, NULL, local); |
808 | 808 |
809 return; | 809 return; |
810 } else if (type == PURPLE_MEDIA_INFO_HANGUP || | 810 } else if (type == PURPLE_MEDIA_INFO_HANGUP || |
811 type == PURPLE_MEDIA_INFO_REJECT) { | 811 type == PURPLE_MEDIA_INFO_REJECT) { |
812 GList *streams, *participants = NULL; | 812 GList *streams; |
813 | 813 |
814 g_return_if_fail(PURPLE_IS_MEDIA(media)); | 814 g_return_if_fail(PURPLE_IS_MEDIA(media)); |
815 | 815 |
816 streams = purple_media_get_streams(media, | 816 streams = purple_media_get_streams(media, |
817 session_id, participant); | 817 session_id, participant); |
823 | 823 |
824 g_signal_emit(media, | 824 g_signal_emit(media, |
825 purple_media_signals[STREAM_INFO], | 825 purple_media_signals[STREAM_INFO], |
826 0, type, stream->session->id, | 826 0, type, stream->session->id, |
827 stream->participant, local); | 827 stream->participant, local); |
828 | |
829 if (g_list_find_custom(participants, | |
830 stream->participant, | |
831 (GCompareFunc)strcmp) == NULL) | |
832 participants = g_list_prepend(participants, | |
833 g_strdup(stream->participant)); | |
834 } | 828 } |
835 | 829 |
836 if (session_id != NULL && participant != NULL) { | 830 if (session_id != NULL && participant != NULL) { |
837 /* Everything that needs to be emitted has been */ | 831 /* Everything that needs to be emitted has been */ |
838 } else if (session_id == NULL && participant == NULL) { | 832 } else if (session_id == NULL && participant == NULL) { |
839 /* Emit for everything in the conference */ | 833 /* Emit for everything in the conference */ |
840 GList *sessions = g_hash_table_get_values( | 834 GList *sessions = g_hash_table_get_values( |
841 media->priv->sessions); | 835 media->priv->sessions); |
836 GList *participants = media->priv->participants; | |
842 | 837 |
843 /* Emit for sessions */ | 838 /* Emit for sessions */ |
844 for (; sessions; sessions = g_list_delete_link( | 839 for (; sessions; sessions = g_list_delete_link( |
845 sessions, sessions)) { | 840 sessions, sessions)) { |
846 PurpleMediaSession *session = sessions->data; | 841 PurpleMediaSession *session = sessions->data; |
850 session->id, NULL, local); | 845 session->id, NULL, local); |
851 } | 846 } |
852 | 847 |
853 /* Emit for participants */ | 848 /* Emit for participants */ |
854 for (; participants; participants = | 849 for (; participants; participants = |
855 g_list_delete_link( | 850 g_list_next(participants)) { |
856 participants, participants)) { | |
857 gchar *participant = participants->data; | 851 gchar *participant = participants->data; |
858 | 852 |
859 g_signal_emit(media, purple_media_signals[ | 853 g_signal_emit(media, purple_media_signals[ |
860 STREAM_INFO], 0, type, | 854 STREAM_INFO], 0, type, |
861 NULL, participant, local); | 855 NULL, participant, local); |
862 | |
863 g_free(participant); | |
864 } | 856 } |
865 | 857 |
866 /* Emit for conference */ | 858 /* Emit for conference */ |
867 g_signal_emit(media, | 859 g_signal_emit(media, |
868 purple_media_signals[STREAM_INFO], | 860 purple_media_signals[STREAM_INFO], |
882 STREAM_INFO], 0, type, | 874 STREAM_INFO], 0, type, |
883 session->id, NULL, local); | 875 session->id, NULL, local); |
884 } | 876 } |
885 } else if (participant != NULL) { | 877 } else if (participant != NULL) { |
886 /* Emit just the specific participant */ | 878 /* Emit just the specific participant */ |
887 if (!g_list_find_custom(participants, | 879 if (!g_list_find_custom(media->priv->participants, |
888 participant, (GCompareFunc)strcmp)) { | 880 participant, (GCompareFunc)strcmp)) { |
889 purple_debug_warning("media", | 881 purple_debug_warning("media", |
890 "Couldn't find participant" | 882 "Couldn't find participant" |
891 " to hangup/reject.\n"); | 883 " to hangup/reject.\n"); |
892 } else { | 884 } else { |
893 g_signal_emit(media, purple_media_signals[ | 885 g_signal_emit(media, purple_media_signals[ |
894 STREAM_INFO], 0, type, NULL, | 886 STREAM_INFO], 0, type, NULL, |
895 participant, local); | 887 participant, local); |
896 } | 888 } |
897 } | |
898 | |
899 /* Clear participants if any remain */ | |
900 for (; participants; participants = g_list_delete_link( | |
901 participants, participants)) { | |
902 g_free(participants->data); | |
903 } | 889 } |
904 | 890 |
905 purple_media_end(media, session_id, participant); | 891 purple_media_end(media, session_id, participant); |
906 return; | 892 return; |
907 } | 893 } |