# HG changeset patch # User Marcus Lundblad # Date 1231854366 0 # Node ID f09107a806085455ccfa3029d7d23b09b27e8a53 # Parent 5d9a97a23d6e0c220702abad2959f00f019380c5# Parent fc921eb8b220aa31dc8a713bebf52d3e72bec28e merge of '1c8357244603e0d86b5df08b5df711f916c01347' and '38031eda38655d87862feafe0580344c910908b1' diff -r fc921eb8b220 -r f09107a80608 finch/gntmedia.c --- a/finch/gntmedia.c Tue Jan 13 12:24:39 2009 +0000 +++ b/finch/gntmedia.c Tue Jan 13 13:46:06 2009 +0000 @@ -47,8 +47,6 @@ struct _FinchMediaPrivate { PurpleMedia *media; - GstElement *send_level; - GstElement *recv_level; GntWidget *accept; GntWidget *reject; @@ -77,8 +75,6 @@ enum { PROP_0, PROP_MEDIA, - PROP_SEND_LEVEL, - PROP_RECV_LEVEL }; GType @@ -121,18 +117,6 @@ "The PurpleMedia associated with this media.", PURPLE_TYPE_MEDIA, G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, PROP_SEND_LEVEL, - g_param_spec_object("send-level", - "Send level", - "The GstElement of this media's send 'level'", - GST_TYPE_ELEMENT, - G_PARAM_READWRITE)); - g_object_class_install_property(gobject_class, PROP_RECV_LEVEL, - g_param_spec_object("recv-level", - "Receive level", - "The GstElement of this media's recv 'level'", - GST_TYPE_ELEMENT, - G_PARAM_READWRITE)); finch_media_signals[MESSAGE] = g_signal_new("message", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, @@ -187,16 +171,13 @@ purple_media_set_src(media, sessions->data, sendbin); } g_list_free(sessions); - - g_object_set(gntmedia, "send-level", sendlevel, - NULL); } static void finch_media_accept_cb(PurpleMedia *media, FinchMedia *gntmedia) { GntWidget *parent; - GstElement *sendbin = NULL, *recvbin = NULL; + GstElement *sendbin = NULL; finch_media_emit_message(gntmedia, _("Call in progress.")); @@ -220,9 +201,8 @@ gnt_box_readjust(GNT_BOX(parent)); gnt_widget_draw(parent); - purple_media_get_elements(media, &sendbin, &recvbin, NULL, NULL); + purple_media_get_elements(media, &sendbin, NULL, NULL, NULL); gst_element_set_state(GST_ELEMENT(sendbin), GST_STATE_PLAYING); - gst_element_set_state(GST_ELEMENT(recvbin), GST_STATE_PLAYING); } static void @@ -246,33 +226,34 @@ } static void -finch_media_hangup_cb(PurpleMedia *media, FinchMedia *gntmedia) -{ - finch_media_emit_message(gntmedia, _("You have ended the call.")); - finch_conversation_set_info_widget(gntmedia->priv->conv, NULL); - gnt_widget_destroy(GNT_WIDGET(gntmedia)); - /* XXX: This shouldn't have to be here to free the FinchMedia widget */ - g_object_unref(gntmedia); -} - -static void -finch_media_got_hangup_cb(PurpleMedia *media, FinchMedia *gntmedia) +finch_media_state_changed_cb(PurpleMedia *media, + PurpleMediaStateChangedType type, + gchar *sid, gchar *name, FinchMedia *gntmedia) { - finch_media_emit_message(gntmedia, _("The call has been terminated.")); - finch_conversation_set_info_widget(gntmedia->priv->conv, NULL); - gnt_widget_destroy(GNT_WIDGET(gntmedia)); - /* XXX: This shouldn't have to be here to free the FinchMedia widget */ - g_object_unref(gntmedia); -} - -static void -finch_media_reject_cb(PurpleMedia *media, FinchMedia *gntmedia) -{ - finch_media_emit_message(gntmedia, _("You have rejected the call.")); - finch_conversation_set_info_widget(gntmedia->priv->conv, NULL); - gnt_widget_destroy(GNT_WIDGET(gntmedia)); - /* XXX: This shouldn't have to be here to free the FinchMedia widget */ - g_object_unref(gntmedia); + purple_debug_info("gntmedia", "type: %d sid: %s name: %s\n", + type, sid, name); + if (sid == NULL && name == NULL) { + if (type == PURPLE_MEDIA_STATE_CHANGED_END) { + finch_media_emit_message(gntmedia, + _("The call has been terminated.")); + finch_conversation_set_info_widget( + gntmedia->priv->conv, NULL); + gnt_widget_destroy(GNT_WIDGET(gntmedia)); + /* + * XXX: This shouldn't have to be here + * to free the FinchMedia widget. + */ + g_object_unref(gntmedia); + } else if (type == PURPLE_MEDIA_STATE_CHANGED_REJECTED) { + finch_media_emit_message(gntmedia, + _("You have rejected the call.")); + } + } else if (type == PURPLE_MEDIA_STATE_CHANGED_NEW + && sid != NULL && name != NULL) { + finch_media_ready_cb(media, gntmedia); + } else if (type == PURPLE_MEDIA_STATE_CHANGED_CONNECTED) { + finch_media_accept_cb(media, gntmedia); + } } static void @@ -284,6 +265,8 @@ media = FINCH_MEDIA(object); switch (prop_id) { case PROP_MEDIA: + { + gboolean is_initiator; if (media->priv->media) g_object_unref(media->priv->media); media->priv->media = g_value_get_object(value); @@ -295,33 +278,15 @@ g_signal_connect_swapped(G_OBJECT(media->priv->hangup), "activate", G_CALLBACK(purple_media_hangup), media->priv->media); - g_signal_connect(G_OBJECT(media->priv->media), "accepted", - G_CALLBACK(finch_media_accept_cb), media); - g_signal_connect(G_OBJECT(media->priv->media) ,"ready", - G_CALLBACK(finch_media_ready_cb), media); - g_signal_connect(G_OBJECT(media->priv->media), "wait", - G_CALLBACK(finch_media_wait_cb), media); - g_signal_connect(G_OBJECT(media->priv->media), "hangup", - G_CALLBACK(finch_media_hangup_cb), media); - g_signal_connect(G_OBJECT(media->priv->media), "reject", - G_CALLBACK(finch_media_reject_cb), media); - g_signal_connect(G_OBJECT(media->priv->media), "got-hangup", - G_CALLBACK(finch_media_got_hangup_cb), media); - g_signal_connect(G_OBJECT(media->priv->media), "got-accept", - G_CALLBACK(finch_media_accept_cb), media); + g_object_get(G_OBJECT(media->priv->media), "initiator", + &is_initiator, NULL); + if (is_initiator == TRUE) { + finch_media_wait_cb(media->priv->media, media); + } + g_signal_connect(G_OBJECT(media->priv->media), "state-changed", + G_CALLBACK(finch_media_state_changed_cb), media); break; - case PROP_SEND_LEVEL: - if (media->priv->send_level) - gst_object_unref(media->priv->send_level); - media->priv->send_level = g_value_get_object(value); - g_object_ref(media->priv->send_level); - break; - case PROP_RECV_LEVEL: - if (media->priv->recv_level) - gst_object_unref(media->priv->recv_level); - media->priv->recv_level = g_value_get_object(value); - g_object_ref(media->priv->recv_level); - break; + } default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -340,12 +305,6 @@ case PROP_MEDIA: g_value_set_object(value, media->priv->media); break; - case PROP_SEND_LEVEL: - g_value_set_object(value, media->priv->send_level); - break; - case PROP_RECV_LEVEL: - g_value_set_object(value, media->priv->recv_level); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; @@ -400,7 +359,6 @@ if (!media) return PURPLE_CMD_STATUS_FAILED; - purple_media_wait(media); return PURPLE_CMD_STATUS_OK; } diff -r fc921eb8b220 -r f09107a80608 libpurple/media.c --- a/libpurple/media.c Tue Jan 13 12:24:39 2009 +0000 +++ b/libpurple/media.c Tue Jan 13 13:46:06 2009 +0000 @@ -111,18 +111,7 @@ enum { ERROR, - READY, - WAIT, - ACCEPTED, - HANGUP, - REJECT, - GOT_REQUEST, - GOT_HANGUP, - GOT_ACCEPT, NEW_CANDIDATE, - CANDIDATES_PREPARED, - CANDIDATE_PAIR, - CODECS_READY, READY_NEW, STATE_CHANGED, LAST_SIGNAL @@ -203,56 +192,11 @@ G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_VOID__STRING, G_TYPE_NONE, 1, G_TYPE_STRING); - purple_media_signals[READY] = g_signal_new("ready", G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - purple_media_signals[WAIT] = g_signal_new("wait", G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - purple_media_signals[ACCEPTED] = g_signal_new("accepted", G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - purple_media_signals[HANGUP] = g_signal_new("hangup", G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); - purple_media_signals[REJECT] = g_signal_new("reject", 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_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, - G_TYPE_NONE, 0); - purple_media_signals[GOT_ACCEPT] = g_signal_new("got-accept", G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, 0, NULL, NULL, - g_cclosure_marshal_VOID__VOID, - G_TYPE_NONE, 0); purple_media_signals[NEW_CANDIDATE] = g_signal_new("new-candidate", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, purple_smarshal_VOID__POINTER_POINTER_OBJECT, G_TYPE_NONE, 3, G_TYPE_POINTER, G_TYPE_POINTER, PURPLE_TYPE_MEDIA_CANDIDATE); - purple_media_signals[CANDIDATES_PREPARED] = g_signal_new("candidates-prepared", G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, 0, NULL, NULL, - purple_smarshal_VOID__STRING_STRING, - G_TYPE_NONE, 2, G_TYPE_STRING, G_TYPE_STRING); - purple_media_signals[CANDIDATE_PAIR] = g_signal_new("candidate-pair", G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, 0, NULL, NULL, - purple_smarshal_VOID__BOXED_BOXED, - G_TYPE_NONE, 2, PURPLE_TYPE_MEDIA_CANDIDATE, - PURPLE_TYPE_MEDIA_CANDIDATE); - purple_media_signals[CODECS_READY] = g_signal_new("codecs-ready", G_TYPE_FROM_CLASS(klass), - G_SIGNAL_RUN_LAST, 0, NULL, NULL, - g_cclosure_marshal_VOID__STRING, - G_TYPE_NONE, 1, G_TYPE_STRING); purple_media_signals[READY_NEW] = g_signal_new("ready-new", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST, 0, NULL, NULL, purple_smarshal_VOID__STRING_STRING, @@ -1203,9 +1147,6 @@ g_object_get(session->session, "codecs-ready", &ready, NULL); if (session->codecs_ready == FALSE && ready == TRUE) { session->codecs_ready = ready; - g_signal_emit(session->media, - purple_media_signals[CODECS_READY], - 0, session->id); purple_media_emit_ready(media, session, NULL); } @@ -1274,32 +1215,19 @@ } void -purple_media_ready(PurpleMedia *media) -{ - g_signal_emit(media, purple_media_signals[READY], 0); -} - -void -purple_media_wait(PurpleMedia *media) -{ - g_signal_emit(media, purple_media_signals[WAIT], 0); -} - -void purple_media_accept(PurpleMedia *media) { GList *sessions; GList *streams; - g_signal_emit(media, purple_media_signals[ACCEPTED], 0); - sessions = g_hash_table_get_values(media->priv->sessions); for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { PurpleMediaSession *session = sessions->data; session->accepted = TRUE; - purple_media_emit_ready(media, session, NULL); + if (media->priv->initiator == FALSE) + purple_media_emit_ready(media, session, NULL); } streams = media->priv->streams; @@ -1332,12 +1260,6 @@ } 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[STATE_CHANGED], @@ -1345,28 +1267,6 @@ NULL, NULL); } -void -purple_media_got_accept(PurpleMedia *media) -{ - GList *sessions; - GList *streams; - - g_signal_emit(media, purple_media_signals[GOT_ACCEPT], 0); - - sessions = g_hash_table_get_values(media->priv->sessions); - - for (; sessions; sessions = g_list_delete_link(sessions, sessions)) { - PurpleMediaSession *session = sessions->data; - session->accepted = TRUE; - } - - streams = media->priv->streams; - - for (; streams; streams = g_list_next(streams)) { - purple_media_set_remote_candidates(streams->data); - } -} - GList* purple_media_get_devices(const gchar *plugin) { @@ -1592,9 +1492,6 @@ stream_data = purple_media_get_stream(session->media, session->id, name); stream_data->candidates_prepared = TRUE; - g_signal_emit(session->media, purple_media_signals[CANDIDATES_PREPARED], - 0, session->id, name); - purple_media_emit_ready(session->media, session, name); g_free(name); } @@ -1609,10 +1506,6 @@ { gchar *name; FsParticipant *participant; - PurpleMediaCandidate *local = - purple_media_candidate_from_fs(native_candidate); - PurpleMediaCandidate *remote = - purple_media_candidate_from_fs(remote_candidate); PurpleMediaStream *stream; g_object_get(fsstream, "participant", &participant, NULL); @@ -1625,11 +1518,6 @@ stream->remote_candidate = fs_candidate_copy(remote_candidate); purple_debug_info("media", "candidate pair established\n"); - g_signal_emit(session->media, purple_media_signals[CANDIDATE_PAIR], 0, - local, remote); - - purple_media_candidate_free(local); - purple_media_candidate_free(remote); } static gboolean diff -r fc921eb8b220 -r f09107a80608 libpurple/media.h --- a/libpurple/media.h Tue Jan 13 12:24:39 2009 +0000 +++ b/libpurple/media.h Tue Jan 13 13:46:06 2009 +0000 @@ -380,20 +380,6 @@ void purple_media_error(PurpleMedia *media, const gchar *error, ...); /** - * Set the media session to the ready state. - * - * @param media The media object to set the state on. - */ -void purple_media_ready(PurpleMedia *media); - -/** - * Set the media session to the wait state. - * - * @param media The media object to set the state on. - */ -void purple_media_wait(PurpleMedia *media); - -/** * Set the media session to the accepted state. * * @param media The media object to set the state on. @@ -415,13 +401,6 @@ void purple_media_hangup(PurpleMedia *media); /** - * Set the media session to the got_request state. - * - * @param media The media object to set the state on. - */ -void purple_media_got_request(PurpleMedia *media); - -/** * Set the media session to the got_hangup state. * * @param media The media object to set the state on. @@ -429,13 +408,6 @@ void purple_media_got_hangup(PurpleMedia *media); /** - * Set the media session to the got_accept state. - * - * @param media The media object to set the state on. - */ -void purple_media_got_accept(PurpleMedia *media); - -/** * Enumerates a list of devices. * * @param plugin The name of the GStreamer plugin from which to enumerate devices. diff -r fc921eb8b220 -r f09107a80608 libpurple/protocols/jabber/google.c --- a/libpurple/protocols/jabber/google.c Tue Jan 13 12:24:39 2009 +0000 +++ b/libpurple/protocols/jabber/google.c Tue Jan 13 13:46:06 2009 +0000 @@ -305,7 +305,6 @@ G_CALLBACK(google_session_ready), session); g_signal_connect(G_OBJECT(session->media), "state-changed", G_CALLBACK(google_session_state_changed_cb), session); - purple_media_ready(session->media); if (sessions == NULL) sessions = g_hash_table_new(google_session_id_hash, @@ -367,7 +366,6 @@ G_CALLBACK(google_session_ready), session); g_signal_connect(G_OBJECT(session->media), "state-changed", G_CALLBACK(google_session_state_changed_cb), session); - purple_media_ready(session->media); purple_media_codec_list_free(codecs); @@ -442,7 +440,7 @@ purple_media_set_remote_codecs(session->media, "google-voice", session->remote_jid, codecs); - purple_media_got_accept(session->media); + purple_media_accept(session->media); } static void diff -r fc921eb8b220 -r f09107a80608 libpurple/protocols/jabber/jingle/rtp.c --- a/libpurple/protocols/jabber/jingle/rtp.c Tue Jan 13 12:24:39 2009 +0000 +++ b/libpurple/protocols/jabber/jingle/rtp.c Tue Jan 13 13:46:06 2009 +0000 @@ -553,7 +553,7 @@ /* This needs to be for the entire session, not a single content */ /* very hacky */ if (xmlnode_get_next_twin(xmlcontent) == NULL) - purple_media_got_accept(jingle_rtp_get_media(session)); + purple_media_accept(jingle_rtp_get_media(session)); g_object_unref(session); break; @@ -585,10 +585,6 @@ candidates); } - /* very hacky */ - if (xmlnode_get_next_twin(xmlcontent) == NULL) - purple_media_ready(jingle_rtp_get_media(session)); - g_object_unref(session); break; } @@ -696,9 +692,6 @@ return NULL; } - purple_media_ready(media); - purple_media_wait(media); - g_free(jid); g_free(me); diff -r fc921eb8b220 -r f09107a80608 pidgin/gtkblist.c --- a/pidgin/gtkblist.c Tue Jan 13 12:24:39 2009 +0000 +++ b/pidgin/gtkblist.c Tue Jan 13 13:46:06 2009 +0000 @@ -340,32 +340,22 @@ #ifdef USE_VV static void gtk_blist_menu_audio_call_cb(GtkWidget *w, PurpleBuddy *b) { - PurpleMedia *media = purple_prpl_initiate_media(purple_buddy_get_account(b), + purple_prpl_initiate_media(purple_buddy_get_account(b), purple_buddy_get_name(b), PURPLE_MEDIA_AUDIO); - - if (media) { - purple_media_wait(media); - } } static void gtk_blist_menu_video_call_cb(GtkWidget *w, PurpleBuddy *b) { - PurpleMedia *media = NULL; - /* if the buddy supports both audio and video, start a combined call, otherwise start a pure video session */ if (purple_prpl_can_do_media(purple_buddy_get_account(b), purple_buddy_get_name(b), PURPLE_MEDIA_AUDIO)) { - media = purple_prpl_initiate_media(purple_buddy_get_account(b), + purple_prpl_initiate_media(purple_buddy_get_account(b), purple_buddy_get_name(b), PURPLE_MEDIA_AUDIO | PURPLE_MEDIA_VIDEO); } else { - media = purple_prpl_initiate_media(purple_buddy_get_account(b), + purple_prpl_initiate_media(purple_buddy_get_account(b), purple_buddy_get_name(b), PURPLE_MEDIA_VIDEO); } - - if (media) { - purple_media_wait(media); - } } #endif diff -r fc921eb8b220 -r f09107a80608 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Tue Jan 13 12:24:39 2009 +0000 +++ b/pidgin/gtkconv.c Tue Jan 13 13:46:06 2009 +0000 @@ -7765,13 +7765,9 @@ PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); PurpleAccount *account = purple_conversation_get_account(conv); - PurpleMedia *media = - purple_prpl_initiate_media(account, - purple_conversation_get_name(conv), - PURPLE_MEDIA_AUDIO); - - if (media) - purple_media_wait(media); + purple_prpl_initiate_media(account, + purple_conversation_get_name(conv), + PURPLE_MEDIA_AUDIO); } static void @@ -7781,13 +7777,9 @@ PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); PurpleAccount *account = purple_conversation_get_account(conv); - PurpleMedia *media = - purple_prpl_initiate_media(account, - purple_conversation_get_name(conv), - PURPLE_MEDIA_VIDEO); - - if (media) - purple_media_wait(media); + purple_prpl_initiate_media(account, + purple_conversation_get_name(conv), + PURPLE_MEDIA_VIDEO); } static void @@ -7797,13 +7789,9 @@ PurpleConversation *conv = pidgin_conv_window_get_active_conversation(win); PurpleAccount *account = purple_conversation_get_account(conv); - PurpleMedia *media = - purple_prpl_initiate_media(account, - purple_conversation_get_name(conv), - PURPLE_MEDIA_AUDIO | PURPLE_MEDIA_VIDEO); - - if (media) - purple_media_wait(media); + purple_prpl_initiate_media(account, + purple_conversation_get_name(conv), + PURPLE_MEDIA_AUDIO | PURPLE_MEDIA_VIDEO); } static void