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 }