From d1b8b63cec7450040b2799e192aeab7ada5afaa8 Mon Sep 17 00:00:00 2001 From: Florian Zeitz Date: Mon, 10 Jun 2013 18:14:19 +0200 Subject: [PATCH] Close subscription dialogs, when answered on another client --- src/core/JubAvatarManager.m | 2 +- src/gui/gtk/JubGtkRosterUI.h | 1 + src/gui/gtk/JubGtkRosterUI.m | 37 ++++++++++++++++++++++++++++++++---- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/core/JubAvatarManager.m b/src/core/JubAvatarManager.m index 7d2fe8f..048af0e 100644 --- a/src/core/JubAvatarManager.m +++ b/src/core/JubAvatarManager.m @@ -52,7 +52,7 @@ } - (void)connection: (XMPPConnection*)connection - didReceiveMessage: (XMPPMessage*)message + didReceiveMessage: (XMPPMessage*)message { OFXMLElement *event = [message elementForName: @"event" namespace: JUB_NS_PUBSUB_EVENT]; diff --git a/src/gui/gtk/JubGtkRosterUI.h b/src/gui/gtk/JubGtkRosterUI.h index 9769c76..0fc8e2d 100644 --- a/src/gui/gtk/JubGtkRosterUI.h +++ b/src/gui/gtk/JubGtkRosterUI.h @@ -16,6 +16,7 @@ GtkComboBox *_presence_combo; gulong _presence_combo_changed_handler_id; OFMapTable *_groupMap; + OFMapTable *_subDialogMap; OFMutableDictionary *_contactMap; JubChatClient *_client; } diff --git a/src/gui/gtk/JubGtkRosterUI.m b/src/gui/gtk/JubGtkRosterUI.m index dcd6f7d..e7e36f7 100644 --- a/src/gui/gtk/JubGtkRosterUI.m +++ b/src/gui/gtk/JubGtkRosterUI.m @@ -69,7 +69,6 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, void (^block)(gint) = user_data; block(response_id); [block release]; - gtk_widget_destroy(GTK_WIDGET(dialog)); } @implementation JubGtkRosterUI @@ -84,6 +83,9 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, _groupMap = [[OFMapTable alloc] initWithKeyFunctions: keyFunctions valueFunctions: rowRefFunctions]; + _subDialogMap = [[OFMapTable alloc] + initWithKeyFunctions: keyFunctions + valueFunctions: gObjectFunctions]; _contactMap = [[OFMutableDictionary alloc] init]; _client = [client retain]; @@ -134,6 +136,7 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, { [_client.avatarManager setDelegate: nil]; [_client.contactManager removeDelegate: self]; + [_subDialogMap release]; [_groupMap release]; [_contactMap release]; [_client release]; @@ -143,6 +146,19 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, [super dealloc]; } +- (void)Jub_closeSubscribeDialogForRosterItem: (XMPPRosterItem*)rosterItem +{ + // Close subscripton dialogs, answered on another client + GtkDialog *dialog; + OFString *subscription = rosterItem.subscription; + OFString *bareJID = [rosterItem.JID bareJID]; + + if (([subscription isEqual: @"from"] || + [subscription isEqual: @"both"]) && + (dialog = [_subDialogMap valueForKey: bareJID]) != NULL) + gtk_dialog_response(dialog, GTK_RESPONSE_NONE); +} + /* Roster Delegate methods */ - (void)Jub_addRosterItem: (XMPPRosterItem*)item group: (OFString*)group @@ -266,6 +282,8 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, Jub_addRosterItem:group:) withObject: rosterItem withObject: group]; + + [self Jub_closeSubscribeDialogForRosterItem: rosterItem]; } - (void)contactManager: (XMPPContactManager*)manager @@ -288,11 +306,15 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, didReceiveSubscriptionRequest: (XMPPPresence*)presence { XMPPJID *JID = presence.from; + OFString *bareJID = [JID bareJID]; OFString *message = [OFString stringWithFormat: @"%@ would like " - @"to subscribe to your presence.", JID]; - of_log(@"%@", message); + @"to subscribe to your presence.", bareJID]; g_idle_add_block(^{ GtkWidget *dialog, *content_area, *label; + + if ([_subDialogMap valueForKey: JID] != NULL) + return; + dialog = gtk_dialog_new_with_buttons("Subscription Request", GTK_WINDOW(_roster_window), GTK_DIALOG_DESTROY_WITH_PARENT, "Accept", GTK_RESPONSE_ACCEPT, @@ -301,6 +323,7 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog)); label = gtk_label_new(NULL); gtk_label_set_markup(GTK_LABEL(label), [message UTF8String]); + gtk_container_add(GTK_CONTAINER(content_area), label); g_signal_connect(dialog, "response", G_CALLBACK(dialog_response_callback), @@ -309,9 +332,13 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, [manager sendSubscribedToJID: JID]; else if (response_id == GTK_RESPONSE_REJECT) [manager sendUnsubscribedToJID: JID]; + [_subDialogMap removeValueForKey: bareJID]; + gtk_widget_destroy(GTK_WIDGET(dialog)); } copy]); - gtk_container_add(GTK_CONTAINER(content_area), label); + [_subDialogMap setValue: dialog + forKey: bareJID]; + gtk_widget_show_all(dialog); }); } @@ -319,6 +346,8 @@ static void dialog_response_callback(GtkDialog *dialog, gint response_id, - (void)contact: (XMPPContact*)contact willUpdateWithRosterItem: (XMPPRosterItem*)rosterItem; { + [self Jub_closeSubscribeDialogForRosterItem: rosterItem]; + // Remove contact from old set of groups XMPPRosterItem *oldItem = contact.rosterItem; OFArray *groups = oldItem.groups; -- 2.39.2