# HG changeset patch # User Mike Ruprecht # Date 1213243166 0 # Node ID ddbea813862e90a0de0ebfaa15a760b0882a442e # Parent 3bf9748fdef09dcd29f80ba295ae085ffc669deb Notify the user which type of media session the remote user wants to initiate. diff -r 3bf9748fdef0 -r ddbea813862e libpurple/media.c --- a/libpurple/media.c Tue Jun 10 05:18:29 2008 +0000 +++ b/libpurple/media.c Thu Jun 12 03:59:26 2008 +0000 @@ -83,6 +83,7 @@ ACCEPTED, HANGUP, REJECT, + GOT_REQUEST, GOT_HANGUP, GOT_ACCEPT, NEW_CANDIDATE, @@ -172,6 +173,10 @@ G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); + purple_media_signals[GOT_REQUEST] = g_signal_new("got-request", G_TYPE_FROM_CLASS(klass), + G_SIGNAL_RUN_LAST, 0, NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); purple_media_signals[GOT_HANGUP] = g_signal_new("got-hangup", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__VOID, @@ -321,6 +326,21 @@ return result; } +PurpleMediaStreamType +purple_media_get_overall_type(PurpleMedia *media) +{ + GList *values = g_hash_table_get_values(media->priv->sessions); + PurpleMediaStreamType type = PURPLE_MEDIA_NONE; + + for (; values; values = values->next) { + PurpleMediaSession *session = values->data; + type |= session->type; + } + + g_list_free(values); + return type; +} + static PurpleMediaSession* purple_media_get_session(PurpleMedia *media, const gchar *sess_id) { @@ -528,6 +548,12 @@ } void +purple_media_got_request(PurpleMedia *media) +{ + g_signal_emit(media, purple_media_signals[GOT_REQUEST], 0); +} + +void purple_media_got_hangup(PurpleMedia *media) { g_signal_emit(media, purple_media_signals[GOT_HANGUP], 0); diff -r 3bf9748fdef0 -r ddbea813862e libpurple/media.h --- a/libpurple/media.h Tue Jun 10 05:18:29 2008 +0000 +++ b/libpurple/media.h Thu Jun 12 03:59:26 2008 +0000 @@ -77,6 +77,8 @@ FsStreamDirection purple_media_to_fs_stream_direction(PurpleMediaStreamType type); PurpleMediaStreamType purple_media_from_fs(FsMediaType type, FsStreamDirection direction); +PurpleMediaStreamType purple_media_get_overall_type(PurpleMedia *media); + GList *purple_media_get_session_names(PurpleMedia *media); void purple_media_get_elements(PurpleMedia *media, GstElement **audio_src, GstElement **audio_sink, @@ -97,6 +99,7 @@ void purple_media_accept(PurpleMedia *media); void purple_media_reject(PurpleMedia *media); void purple_media_hangup(PurpleMedia *media); +void purple_media_got_request(PurpleMedia *media); void purple_media_got_hangup(PurpleMedia *media); void purple_media_got_accept(PurpleMedia *media); diff -r 3bf9748fdef0 -r ddbea813862e libpurple/protocols/jabber/jingle.c --- a/libpurple/protocols/jabber/jingle.c Tue Jun 10 05:18:29 2008 +0000 +++ b/libpurple/protocols/jabber/jingle.c Thu Jun 12 03:59:26 2008 +0000 @@ -1335,6 +1335,8 @@ } jabber_iq_send(jabber_jingle_session_create_ack(js, packet)); jabber_iq_send(jabber_jingle_session_create_session_info(session, "ringing")); + + purple_media_got_request(jabber_jingle_session_get_media(session)); } void diff -r 3bf9748fdef0 -r ddbea813862e pidgin/gtkmedia.c --- a/pidgin/gtkmedia.c Tue Jun 10 05:18:29 2008 +0000 +++ b/pidgin/gtkmedia.c Thu Jun 12 03:59:26 2008 +0000 @@ -427,6 +427,29 @@ } static void +pidgin_media_got_request_cb(PurpleMedia *media, PidginMedia *gtkmedia) +{ + PurpleMediaStreamType type = purple_media_get_overall_type(media); + gchar *message; + + if (type & PURPLE_MEDIA_AUDIO && type & PURPLE_MEDIA_VIDEO) { + message = g_strdup_printf(_("%s wishes to start an audio/video session with you."), + purple_media_get_screenname(media)); + } else if (type & PURPLE_MEDIA_AUDIO) { + message = g_strdup_printf(_("%s wishes to start an audio session with you."), + purple_media_get_screenname(media)); + } else if (type & PURPLE_MEDIA_VIDEO) { + message = g_strdup_printf(_("%s wishes to start a video session with you."), + purple_media_get_screenname(media)); + } else { + return; + } + + pidgin_media_emit_message(gtkmedia, message); + g_free(message); +} + +static void pidgin_media_got_hangup_cb(PurpleMedia *media, PidginMedia *gtkmedia) { pidgin_media_emit_message(gtkmedia, _("The call has been terminated.")); @@ -470,6 +493,8 @@ G_CALLBACK(pidgin_media_hangup_cb), media); g_signal_connect(G_OBJECT(media->priv->media), "reject", G_CALLBACK(pidgin_media_reject_cb), media); + g_signal_connect(G_OBJECT(media->priv->media), "got-request", + G_CALLBACK(pidgin_media_got_request_cb), media); g_signal_connect(G_OBJECT(media->priv->media), "got-hangup", G_CALLBACK(pidgin_media_got_hangup_cb), media); g_signal_connect(G_OBJECT(media->priv->media), "got-accept",