comparison libpurple/media/media.c @ 29565:eef5ec04a5bf

Remove the list of participants from PurpleMedia and use the Fs2 backend's.
author maiku@pidgin.im
date Mon, 26 Oct 2009 20:17:35 +0000
parents 1156bf88b4d3
children f600903f7811
comparison
equal deleted inserted replaced
29564:7b0931b3e060 29565:eef5ec04a5bf
116 gulong gst_bus_handler_id; 116 gulong gst_bus_handler_id;
117 gboolean initiator; 117 gboolean initiator;
118 gpointer prpl_data; 118 gpointer prpl_data;
119 119
120 GHashTable *sessions; /* PurpleMediaSession table */ 120 GHashTable *sessions; /* PurpleMediaSession table */
121 GHashTable *participants; /* FsParticipant table */
122 121
123 GList *streams; /* PurpleMediaStream table */ 122 GList *streams; /* PurpleMediaStream table */
124 123
125 GstElement *confbin; 124 GstElement *confbin;
126 #else 125 #else
366 PurpleMediaStream *stream = iter->data; 365 PurpleMediaStream *stream = iter->data;
367 if (stream->stream) { 366 if (stream->stream) {
368 g_object_unref(stream->stream); 367 g_object_unref(stream->stream);
369 stream->stream = NULL; 368 stream->stream = NULL;
370 } 369 }
371 }
372
373 if (priv->participants) {
374 GList *participants = g_hash_table_get_values(priv->participants);
375 for (; participants; participants = g_list_delete_link(participants, participants))
376 g_object_unref(participants->data);
377 } 370 }
378 371
379 if (priv->gst_bus_handler_id != 0) { 372 if (priv->gst_bus_handler_id != 0) {
380 GstElement *pipeline = purple_media_manager_get_pipeline( 373 GstElement *pipeline = purple_media_manager_get_pipeline(
381 priv->manager); 374 priv->manager);
724 g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL); 717 g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
725 return (PurpleMediaSession*) (media->priv->sessions) ? 718 return (PurpleMediaSession*) (media->priv->sessions) ?
726 g_hash_table_lookup(media->priv->sessions, sess_id) : NULL; 719 g_hash_table_lookup(media->priv->sessions, sess_id) : NULL;
727 } 720 }
728 721
729 static FsParticipant*
730 purple_media_get_participant(PurpleMedia *media, const gchar *name)
731 {
732 g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
733 return (FsParticipant*) (media->priv->participants) ?
734 g_hash_table_lookup(media->priv->participants, name) : NULL;
735 }
736
737 static PurpleMediaStream* 722 static PurpleMediaStream*
738 purple_media_get_stream(PurpleMedia *media, const gchar *session, const gchar *participant) 723 purple_media_get_stream(PurpleMedia *media, const gchar *session, const gchar *participant)
739 { 724 {
740 GList *streams; 725 GList *streams;
741 726
792 static gboolean 777 static gboolean
793 purple_media_remove_session(PurpleMedia *media, PurpleMediaSession *session) 778 purple_media_remove_session(PurpleMedia *media, PurpleMediaSession *session)
794 { 779 {
795 g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE); 780 g_return_val_if_fail(PURPLE_IS_MEDIA(media), FALSE);
796 return g_hash_table_remove(media->priv->sessions, session->id); 781 return g_hash_table_remove(media->priv->sessions, session->id);
797 }
798
799 static FsParticipant *
800 purple_media_add_participant(PurpleMedia *media, const gchar *name)
801 {
802 FsParticipant *participant;
803 GError *err = NULL;
804
805 g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
806
807 participant = purple_media_get_participant(media, name);
808
809 if (participant)
810 return participant;
811
812 participant = fs_conference_new_participant(media->priv->conference,
813 (gchar*)name, &err);
814
815 if (err) {
816 purple_debug_error("media", "Error creating participant: %s\n",
817 err->message);
818 g_error_free(err);
819 return NULL;
820 }
821
822 if (!media->priv->participants) {
823 purple_debug_info("media", "Creating hash table for participants\n");
824 media->priv->participants = g_hash_table_new_full(g_str_hash,
825 g_str_equal, g_free, NULL);
826 }
827
828 g_hash_table_insert(media->priv->participants, g_strdup(name), participant);
829
830 return participant;
831 } 782 }
832 783
833 static PurpleMediaStream * 784 static PurpleMediaStream *
834 purple_media_insert_stream(PurpleMediaSession *session, const gchar *name, FsStream *stream) 785 purple_media_insert_stream(PurpleMediaSession *session, const gchar *name, FsStream *stream)
835 { 786 {
1473 session->media, 1424 session->media,
1474 session->id, NULL); 1425 session->id, NULL);
1475 } 1426 }
1476 } 1427 }
1477 1428
1478 if (!(participant = purple_media_add_participant(media, who))) { 1429 participant = purple_media_backend_fs2_get_participant(
1479 purple_media_remove_session(media, session); 1430 PURPLE_MEDIA_BACKEND_FS2(media->priv->backend), who);
1480 g_free(session);
1481 return FALSE;
1482 } else {
1483 g_signal_emit(media, purple_media_signals[STATE_CHANGED],
1484 0, PURPLE_MEDIA_STATE_NEW,
1485 NULL, who);
1486 }
1487 1431
1488 stream = purple_media_get_stream(media, sess_id, who); 1432 stream = purple_media_get_stream(media, sess_id, who);
1489 1433
1490 if (!stream) { 1434 if (!stream) {
1491 GError *err = NULL; 1435 GError *err = NULL;
1542 g_value_set_boxed(&param[next_param_index].value, 1486 g_value_set_boxed(&param[next_param_index].value,
1543 relay_info); 1487 relay_info);
1544 g_value_array_free(relay_info); 1488 g_value_array_free(relay_info);
1545 } else { 1489 } else {
1546 purple_debug_error("media", "Error relay info"); 1490 purple_debug_error("media", "Error relay info");
1547 g_object_unref(participant);
1548 g_hash_table_remove(media->priv->participants, who);
1549 purple_media_remove_session(media, session); 1491 purple_media_remove_session(media, session);
1550 g_free(session); 1492 g_free(session);
1551 return FALSE; 1493 return FALSE;
1552 } 1494 }
1553 } 1495 }
1569 "Error creating stream: %s\n", 1511 "Error creating stream: %s\n",
1570 err && err->message ? 1512 err && err->message ?
1571 err->message : "NULL"); 1513 err->message : "NULL");
1572 if (err) 1514 if (err)
1573 g_error_free(err); 1515 g_error_free(err);
1574 g_object_unref(participant);
1575 g_hash_table_remove(media->priv->participants, who);
1576 purple_media_remove_session(media, session); 1516 purple_media_remove_session(media, session);
1577 g_free(session); 1517 g_free(session);
1578 return FALSE; 1518 return FALSE;
1579 } 1519 }
1580 1520