static void google_session_handle_terminate(JabberStream *js, GoogleSession *session, xmlnode *sess) { GoogleAVSessionData *session_data = (GoogleAVSessionData *) session->session_data; purple_media_end(session_data->media, NULL, NULL); }
static void google_session_handle_reject(JabberStream *js, GoogleSession *session, PurpleXmlNode *sess) { GoogleAVSessionData *session_data = (GoogleAVSessionData *) session->session_data; purple_media_end(session_data->media, NULL, NULL); }
/*------------------------------------------------------------------------ * Initiate a voice/video session with a contact. * * @param account The MXit account object * @param who The username of the contact. * @param type The type of media session to initiate * @return TRUE if session was initiated */ gboolean mxit_media_initiate(PurpleAccount *account, const char *who, PurpleMediaSessionType type) { gchar* transmitter = "rawudp"; PurpleMedia* media = NULL; purple_debug_info(MXIT_PLUGIN_ID, "mxit_media_initiate: buddy '%s'\n", who); media = purple_media_manager_create_media( purple_media_manager_get(), account, "fsrtpconference", who, TRUE ); if (!media) { purple_debug_info(MXIT_PLUGIN_ID, "mxit_media_initiate: could not create media session\n"); return FALSE; } /* attach callbacks */ g_signal_connect(G_OBJECT(media), "candidates-prepared", G_CALLBACK(mxit_candidates_prepared_cb), NULL); g_signal_connect(G_OBJECT(media), "stream-info", G_CALLBACK(mxit_stream_info_cb), NULL); g_signal_connect(G_OBJECT(media), "state-changed", G_CALLBACK(mxit_state_changed_cb), NULL); /* initiate audio session */ if ((type & PURPLE_MEDIA_AUDIO) && (!purple_media_add_stream(media, "audio", who, PURPLE_MEDIA_AUDIO, TRUE, transmitter, 0, NULL))) { purple_media_end(media, NULL, NULL); return FALSE; } /* initiate video session */ if ((type & PURPLE_MEDIA_VIDEO) && (!purple_media_add_stream(media, "video", who, PURPLE_MEDIA_VIDEO, TRUE, transmitter, 0, NULL))) { purple_media_end(media, NULL, NULL); return FALSE; } return TRUE; }
static void jabber_google_relay_response_session_initiate_cb(GoogleSession *session, const gchar *relay_ip, guint relay_udp, guint relay_tcp, guint relay_ssltcp, const gchar *relay_username, const gchar *relay_password) { GParameter *params; guint num_params; JabberStream *js = session->js; GoogleAVSessionData *session_data = (GoogleAVSessionData *) session->session_data; session_data->media = purple_media_manager_create_media( purple_media_manager_get(), purple_connection_get_account(js->gc), "fsrtpconference", session->remote_jid, TRUE); purple_media_set_prpl_data(session_data->media, session); g_signal_connect_swapped(G_OBJECT(session_data->media), "candidates-prepared", G_CALLBACK(google_session_ready), session); g_signal_connect_swapped(G_OBJECT(session_data->media), "codecs-changed", G_CALLBACK(google_session_ready), session); g_signal_connect(G_OBJECT(session_data->media), "state-changed", G_CALLBACK(google_session_state_changed_cb), session); g_signal_connect(G_OBJECT(session_data->media), "stream-info", G_CALLBACK(google_session_stream_info_cb), session); params = jabber_google_session_get_params(js, relay_ip, relay_udp, relay_tcp, relay_ssltcp, relay_username, relay_password, &num_params); if (purple_media_add_stream(session_data->media, "google-voice", session->remote_jid, PURPLE_MEDIA_AUDIO, TRUE, "nice", num_params, params) == FALSE || (session_data->video && purple_media_add_stream( session_data->media, "google-video", session->remote_jid, PURPLE_MEDIA_VIDEO, TRUE, "nice", num_params, params) == FALSE)) { purple_media_error(session_data->media, "Error adding stream."); purple_media_end(session_data->media, NULL, NULL); g_free(params); } else { session_data->added_streams = TRUE; } g_free(params); }
void purple_media_stream_info(PurpleMedia *media, PurpleMediaInfoType type, const gchar *session_id, const gchar *participant, gboolean local) { #ifdef USE_VV g_return_if_fail(PURPLE_IS_MEDIA(media)); if (type == PURPLE_MEDIA_INFO_ACCEPT) { 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; } else if (type == PURPLE_MEDIA_INFO_HANGUP || type == PURPLE_MEDIA_INFO_REJECT) { GList *streams; g_return_if_fail(PURPLE_IS_MEDIA(media)); streams = purple_media_get_streams(media, session_id, participant); /* Emit for stream */ for (; streams; streams = g_list_delete_link(streams, streams)) { PurpleMediaStream *stream = streams->data; g_signal_emit(media, purple_media_signals[STREAM_INFO], 0, type, stream->session->id, stream->participant, local); } if (session_id != NULL && participant != NULL) { /* Everything that needs to be emitted has been */ } else if (session_id == NULL && participant == NULL) { /* Emit for everything in the conference */ GList *sessions = NULL; GList *participants = media->priv->participants; if (media->priv->sessions != NULL) sessions = g_hash_table_get_values( media->priv->sessions); /* Emit for sessions */ for (; sessions; sessions = g_list_delete_link( sessions, sessions)) { PurpleMediaSession *session = sessions->data; g_signal_emit(media, purple_media_signals[ STREAM_INFO], 0, type, session->id, NULL, local); } /* Emit for participants */ for (; participants; participants = g_list_next(participants)) { gchar *participant = participants->data; g_signal_emit(media, purple_media_signals[ STREAM_INFO], 0, type, NULL, participant, local); } /* Emit for conference */ g_signal_emit(media, purple_media_signals[STREAM_INFO], 0, type, NULL, NULL, local); } else if (session_id != NULL) { /* Emit just the specific session */ PurpleMediaSession *session = purple_media_get_session( media, session_id); if (session == NULL) { purple_debug_warning("media", "Couldn't find session" " to hangup/reject.\n"); } else { g_signal_emit(media, purple_media_signals[ STREAM_INFO], 0, type, session->id, NULL, local); } } else if (participant != NULL) { /* Emit just the specific participant */ if (!g_list_find_custom(media->priv->participants, participant, (GCompareFunc)strcmp)) { purple_debug_warning("media", "Couldn't find participant" " to hangup/reject.\n"); } else { g_signal_emit(media, purple_media_signals[ STREAM_INFO], 0, type, NULL, participant, local); } } purple_media_end(media, session_id, participant); return; } g_signal_emit(media, purple_media_signals[STREAM_INFO], 0, type, session_id, participant, local); #endif }