comparison libpurple/media.c @ 25695:13936e4405b7

Added better Farsight error handling.
author Mike Ruprecht <maiku@soc.pidgin.im>
date Fri, 27 Jun 2008 21:39:56 +0000
parents 72e738dac5f7
children 86f05fa8a90a
comparison
equal deleted inserted replaced
25694:72e738dac5f7 25695:13936e4405b7
377 media->priv->sessions = g_hash_table_new(g_str_hash, g_str_equal); 377 media->priv->sessions = g_hash_table_new(g_str_hash, g_str_equal);
378 } 378 }
379 g_hash_table_insert(media->priv->sessions, g_strdup(session->id), session); 379 g_hash_table_insert(media->priv->sessions, g_strdup(session->id), session);
380 } 380 }
381 381
382 static gboolean
383 purple_media_remove_session(PurpleMedia *media, PurpleMediaSession *session)
384 {
385 return g_hash_table_remove(media->priv->sessions, session->id);
386 }
387
382 static FsParticipant * 388 static FsParticipant *
383 purple_media_add_participant(PurpleMedia *media, const gchar *name) 389 purple_media_add_participant(PurpleMedia *media, const gchar *name)
384 { 390 {
385 FsParticipant *participant = purple_media_get_participant(media, name); 391 FsParticipant *participant = purple_media_get_participant(media, name);
392 GError *err = NULL;
386 393
387 if (participant) 394 if (participant)
388 return participant; 395 return participant;
389 396
390 participant = fs_conference_new_participant(media->priv->conference, g_strdup(name), NULL); 397 participant = fs_conference_new_participant(media->priv->conference,
398 g_strdup(name), &err);
399
400 if (err) {
401 purple_debug_error("media", "Error creating participant: %s\n",
402 err->message);
403 g_error_free(err);
404 return NULL;
405 }
391 406
392 if (!media->priv->participants) { 407 if (!media->priv->participants) {
393 purple_debug_info("media", "Creating hash table for participants\n"); 408 purple_debug_info("media", "Creating hash table for participants\n");
394 media->priv->participants = g_hash_table_new(g_str_hash, g_str_equal); 409 media->priv->participants = g_hash_table_new(g_str_hash, g_str_equal);
395 } 410 }
986 session->type = purple_media_from_fs(type, type_direction); 1001 session->type = purple_media_from_fs(type, type_direction);
987 1002
988 purple_media_add_session(media, session); 1003 purple_media_add_session(media, session);
989 } 1004 }
990 1005
991 participant = purple_media_add_participant(media, who); 1006 if (!(participant = purple_media_add_participant(media, who))) {
1007 purple_media_remove_session(media, session);
1008 g_free(session);
1009 return FALSE;
1010 }
992 1011
993 stream = purple_media_session_get_stream(session, who); 1012 stream = purple_media_session_get_stream(session, who);
994 1013
995 if (!stream) { 1014 if (!stream) {
1015 GError *err = NULL;
1016
996 stream = fs_session_new_stream(session->session, participant, 1017 stream = fs_session_new_stream(session->session, participant,
997 type_direction, transmitter, 0, NULL, NULL); 1018 type_direction, transmitter, 0,
1019 NULL, &err);
1020
1021 if (err) {
1022 purple_debug_error("media", "Error creating stream: %s\n",
1023 err->message);
1024 g_error_free(err);
1025 g_object_unref(participant);
1026 purple_media_remove_session(media, session);
1027 g_free(session);
1028 return FALSE;
1029 }
1030
998 purple_media_insert_stream(session, who, stream); 1031 purple_media_insert_stream(session, who, stream);
999 /* callback for new local candidate (new local candidate retreived) */ 1032 /* callback for new local candidate (new local candidate retreived) */
1000 g_signal_connect(G_OBJECT(stream), 1033 g_signal_connect(G_OBJECT(stream),
1001 "new-local-candidate", G_CALLBACK(purple_media_new_local_candidate_cb), session); 1034 "new-local-candidate", G_CALLBACK(purple_media_new_local_candidate_cb), session);
1002 /* callback for source pad added (new stream source ready) */ 1035 /* callback for source pad added (new stream source ready) */
1089 const gchar *name, GList *remote_candidates) 1122 const gchar *name, GList *remote_candidates)
1090 { 1123 {
1091 PurpleMediaSession *session = purple_media_get_session(media, sess_id); 1124 PurpleMediaSession *session = purple_media_get_session(media, sess_id);
1092 FsStream *stream = purple_media_session_get_stream(session, name); 1125 FsStream *stream = purple_media_session_get_stream(session, name);
1093 GList *candidates = remote_candidates; 1126 GList *candidates = remote_candidates;
1094 for (; candidates; candidates = candidates->next) 1127 for (; candidates; candidates = candidates->next) {
1095 fs_stream_add_remote_candidate(stream, candidates->data, NULL); 1128 GError *err = NULL;
1129 fs_stream_add_remote_candidate(stream, candidates->data, &err);
1130
1131 if (err) {
1132 purple_debug_error("media", "Error adding remote candidate: %s\n",
1133 err->message);
1134 g_error_free(err);
1135 }
1136 }
1096 } 1137 }
1097 1138
1098 FsCandidate * 1139 FsCandidate *
1099 purple_media_get_local_candidate(PurpleMedia *media, const gchar *sess_id, const gchar *name) 1140 purple_media_get_local_candidate(PurpleMedia *media, const gchar *sess_id, const gchar *name)
1100 { 1141 {
1107 { 1148 {
1108 PurpleMediaSession *session = purple_media_get_session(media, sess_id); 1149 PurpleMediaSession *session = purple_media_get_session(media, sess_id);
1109 return session->remote_candidate; 1150 return session->remote_candidate;
1110 } 1151 }
1111 1152
1112 void 1153 gboolean
1113 purple_media_set_remote_codecs(PurpleMedia *media, const gchar *sess_id, const gchar *name, GList *codecs) 1154 purple_media_set_remote_codecs(PurpleMedia *media, const gchar *sess_id, const gchar *name, GList *codecs)
1114 { 1155 {
1115 PurpleMediaSession *session = purple_media_get_session(media, sess_id); 1156 PurpleMediaSession *session = purple_media_get_session(media, sess_id);
1116 FsStream *stream = purple_media_session_get_stream(session, name); 1157 FsStream *stream = purple_media_session_get_stream(session, name);
1117 fs_stream_set_remote_codecs(stream, codecs, NULL); 1158 GError *err = NULL;
1159
1160 fs_stream_set_remote_codecs(stream, codecs, &err);
1161
1162 if (err) {
1163 purple_debug_error("media", "Error setting remote codecs: %s\n",
1164 err->message);
1165 g_error_free(err);
1166 return FALSE;
1167 }
1168 return TRUE;
1118 } 1169 }
1119 1170
1120 gboolean 1171 gboolean
1121 purple_media_candidates_prepared(PurpleMedia *media, const gchar *name) 1172 purple_media_candidates_prepared(PurpleMedia *media, const gchar *name)
1122 { 1173 {