From 493dbce89d4b94e3b5f20d2d4dde9846921593ce Mon Sep 17 00:00:00 2001
From: Yann Leboulanger <asterix@lagaule.org>
Date: Thu, 20 May 2010 18:45:09 +0200
Subject: [PATCH] don't show more than one error dialog for a given groupchat.
 Fixes #5753

---
 src/common/connection_handlers.py | 36 ++++++++++++++++++-------------
 src/dialogs.py                    | 17 +++++++++------
 src/groupchat_control.py          |  7 ++++--
 src/gui_interface.py              | 15 +++++++++++++
 4 files changed, 51 insertions(+), 24 deletions(-)

diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py
index db0d3a5902..d60e14b5ef 100644
--- a/src/common/connection_handlers.py
+++ b/src/common/connection_handlers.py
@@ -1784,33 +1784,39 @@ ConnectionCaps, ConnectionHandlersBase, ConnectionJingle):
                 elif (errcode == '503'):
                     if gc_control is None or gc_control.autorejoin is None:
                         # maximum user number reached
-                        self.dispatch('ERROR', (_('Unable to join group chat'),
-                                _('Maximum number of users for %s has been reached') % \
-                                room_jid))
+                        self.dispatch('GC_ERROR', (gc_control,
+                            _('Unable to join group chat'),
+                            _('Maximum number of users for %s has been '
+                            'reached') % room_jid))
                 elif (errcode == '401') or (errcon == 'not-authorized'):
                     # password required to join
                     self.dispatch('GC_PASSWORD_REQUIRED', (room_jid, nick))
                 elif (errcode == '403') or (errcon == 'forbidden'):
                     # we are banned
-                    self.dispatch('ERROR', (_('Unable to join group chat'),
-                            _('You are banned from group chat %s.') % room_jid))
+                    self.dispatch('GC_ERROR', (gc_control,
+                        _('Unable to join group chat'),
+                        _('You are banned from group chat %s.') % room_jid))
                 elif (errcode == '404') or (errcon in ('item-not-found',
                 'remote-server-not-found')):
                     if gc_control is None or gc_control.autorejoin is None:
                         # group chat does not exist
-                        self.dispatch('ERROR', (_('Unable to join group chat'),
-                                _('Group chat %s does not exist.') % room_jid))
+                        self.dispatch('GC_ERROR', (gc_control,
+                            _('Unable to join group chat'),
+                            _('Group chat %s does not exist.') % room_jid))
                 elif (errcode == '405') or (errcon == 'not-allowed'):
-                    self.dispatch('ERROR', (_('Unable to join group chat'),
-                            _('Group chat creation is restricted.')))
+                    self.dispatch('GC_ERROR', (gc_control,
+                        _('Unable to join group chat'),
+                        _('Group chat creation is restricted.')))
                 elif (errcode == '406') or (errcon == 'not-acceptable'):
-                    self.dispatch('ERROR', (_('Unable to join group chat'),
-                            _('Your registered nickname must be used in group chat %s.') \
-                            % room_jid))
+                    self.dispatch('GC_ERROR', (gc_control,
+                        _('Unable to join group chat'),
+                        _('Your registered nickname must be used in group chat '
+                        '%s.') % room_jid))
                 elif (errcode == '407') or (errcon == 'registration-required'):
-                    self.dispatch('ERROR', (_('Unable to join group chat'),
-                            _('You are not in the members list in groupchat %s.') % \
-                            room_jid))
+                    self.dispatch('GC_ERROR', (gc_control,
+                        _('Unable to join group chat'),
+                        _('You are not in the members list in groupchat %s.') %\
+                        room_jid))
                 elif (errcode == '409') or (errcon == 'conflict'):
                     # nick conflict
                     room_jid = gajim.get_room_from_fjid(who)
diff --git a/src/dialogs.py b/src/dialogs.py
index 8a7ec79f2e..a1adc58bb5 100644
--- a/src/dialogs.py
+++ b/src/dialogs.py
@@ -1242,8 +1242,9 @@ class AboutDialog:
 
 class Dialog(gtk.Dialog):
     def __init__(self, parent, title, buttons, default=None,
-                             on_response_ok=None, on_response_cancel=None):
-        gtk.Dialog.__init__(self, title, parent, gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR)
+    on_response_ok=None, on_response_cancel=None):
+        gtk.Dialog.__init__(self, title, parent,
+            gtk.DIALOG_DESTROY_WITH_PARENT | gtk.DIALOG_NO_SEPARATOR)
 
         self.user_response_ok = on_response_ok
         self.user_response_cancel = on_response_cancel
@@ -1480,8 +1481,8 @@ class InformationDialog(HigDialog):
     """
 
     def __init__(self, pritext, sectext=''):
-        HigDialog.__init__(self, None,
-                                           gtk.MESSAGE_INFO, gtk.BUTTONS_OK, pritext, sectext)
+        HigDialog.__init__(self, None, gtk.MESSAGE_INFO, gtk.BUTTONS_OK,
+            pritext, sectext)
         self.set_modal(False)
         self.set_transient_for(gajim.interface.roster.window)
         self.popup()
@@ -1491,9 +1492,11 @@ class ErrorDialog(HigDialog):
     HIG compliant error dialog
     """
 
-    def __init__(self, pritext, sectext=''):
-        HigDialog.__init__( self, None,
-                                                gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, pritext, sectext)
+    def __init__(self, pritext, sectext='', on_response_ok=None,
+    on_response_cancel=None):
+        HigDialog.__init__( self, None, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK,
+            pritext, sectext, on_response_ok=on_response_ok,
+            on_response_cancel=on_response_cancel)
         self.popup()
 
 class YesNoDialog(HigDialog):
diff --git a/src/groupchat_control.py b/src/groupchat_control.py
index 1a37911f0f..82acb9581d 100644
--- a/src/groupchat_control.py
+++ b/src/groupchat_control.py
@@ -216,6 +216,9 @@ class GroupchatControl(ChatControlBase):
         #       state in got_connected()).
         self.autorejoin = None
 
+        # Keep error dialog instance to be sure to have only once at a time
+        self.error_dialog = None
+
         self.actions_button = self.xml.get_object('muc_window_actions_button')
         id_ = self.actions_button.connect('clicked',
             self.on_actions_button_clicked)
@@ -1263,8 +1266,8 @@ class GroupchatControl(ChatControlBase):
                             '%(reason)s') % { 'nick': nick, 'who': actor,
                             'reason': reason }
                     self.print_conversation(s, 'info', tim=tim, graphics=False)
-                    if nick == self.nick:
-                        self.autorejoin = False
+#                    if nick == self.nick:
+#                        self.autorejoin = False
                 elif '303' in statusCode: # Someone changed his or her nick
                     if new_nick == self.new_nick or nick == self.nick:
                         # We changed our nick
diff --git a/src/gui_interface.py b/src/gui_interface.py
index 7a3c943d56..25b15bbecf 100644
--- a/src/gui_interface.py
+++ b/src/gui_interface.py
@@ -1151,6 +1151,20 @@ class Interface:
             notify.popup(event_type, jid, account, 'gc-invitation', path,
                     event_type, room_jid)
 
+    def handle_event_gc_error(self, account, data):
+        #('ERROR', account, (gc_control, title_text, section_text))
+        gc_control, pritext, sectext = data
+        if gc_control:
+            if gc_control.error_dialog:
+                gc_control.error_dialog.destroy()
+            def on_close(dummy):
+                gc_control.error_dialog.destroy()
+                gc_control.error_dialog = None
+            gc_control.error_dialog = dialogs.ErrorDialog(pritext, sectext,
+                on_response_ok=on_close, on_response_cancel=on_close)
+        else:
+            dialogs.ErrorDialog(pritext, sectext)
+
     def forget_gpg_passphrase(self, keyid):
         if keyid in self.gpg_passphrase:
             del self.gpg_passphrase[keyid]
@@ -2126,6 +2140,7 @@ class Interface:
             'GC_INVITATION': [self.handle_event_gc_invitation],
             'GC_AFFILIATION': [self.handle_event_gc_affiliation],
             'GC_PASSWORD_REQUIRED': [self.handle_event_gc_password_required],
+            'GC_ERROR': [self.handle_event_gc_error],
             'BAD_PASSPHRASE': [self.handle_event_bad_passphrase],
             'ROSTER_INFO': [self.handle_event_roster_info],
             'BOOKMARKS': [self.handle_event_bookmarks],
-- 
GitLab