# HG changeset patch # User Mike Ruprecht # Date 1218755696 0 # Node ID aaf11cffe2b267c5553be88dc122659d1f421881 # Parent 551a462b346a81b38bcf4bdb49a22f2d4ea5f432 Prevent multiple voice and video sessions within the same conversation. Properly update the menu when starting or stopping a media session. diff -r 551a462b346a -r aaf11cffe2b2 libpurple/protocols/jabber/jingle.c --- a/libpurple/protocols/jabber/jingle.c Sat Aug 09 03:51:42 2008 +0000 +++ b/libpurple/protocols/jabber/jingle.c Thu Aug 14 23:14:56 2008 +0000 @@ -1414,6 +1414,13 @@ purple_debug_error("jingle", "Jingle session with " "id={%s} already exists\n", sid); /* send iq error */ + } else if ((session = jabber_jingle_session_find_by_jid(js, + xmlnode_get_attrib(packet, "from")))) { + purple_debug_fatal("jingle", "Jingle session with " + "jid={%s} already exists\n", + xmlnode_get_attrib(packet, "from")); + /* send jingle redirect packet */ + return; } else { session = jabber_jingle_session_create_by_id(js, sid); jabber_jingle_session_handle_session_initiate(session, jingle); diff -r 551a462b346a -r aaf11cffe2b2 pidgin/gtkconv.c --- a/pidgin/gtkconv.c Sat Aug 09 03:51:42 2008 +0000 +++ b/pidgin/gtkconv.c Thu Aug 14 23:14:56 2008 +0000 @@ -6381,7 +6381,8 @@ /* check if account support voice calls, and if the current buddy supports it */ if (account != NULL && purple_conversation_get_type(conv) - == PURPLE_CONV_TYPE_IM) { + == PURPLE_CONV_TYPE_IM + && gtkconv->gtkmedia == NULL) { gboolean audio = purple_prpl_can_do_media(account, purple_conversation_get_name(conv), PURPLE_MEDIA_AUDIO); @@ -7732,6 +7733,13 @@ } static void +pidgin_conv_gtkmedia_destroyed(GtkWidget *widget, PidginConversation *gtkconv) +{ + gtk_widget_destroyed(widget, &(gtkconv->gtkmedia)); + gray_stuff_out(gtkconv); +} + +static void pidgin_conv_new_media_cb(PurpleMediaManager *manager, PurpleMedia *media, gpointer nul) { GtkWidget *gtkmedia; @@ -7751,10 +7759,13 @@ g_signal_connect(G_OBJECT(gtkmedia), "message", G_CALLBACK(pidgin_gtkmedia_message_cb), conv); gtkconv->gtkmedia = gtkmedia; - g_signal_connect(G_OBJECT(gtkmedia), "destroy", G_CALLBACK(gtk_widget_destroyed), &(gtkconv->gtkmedia)); + g_signal_connect(G_OBJECT(gtkmedia), "destroy", G_CALLBACK( + pidgin_conv_gtkmedia_destroyed), gtkconv); gtk_paned_pack2(GTK_PANED(gtkconv->middle_hpaned), pidgin_media_get_display_widget(gtkmedia), FALSE, TRUE); + + gray_stuff_out(gtkconv); } #endif