diff --git a/src/common/connection.py b/src/common/connection.py index f23b217bf..195ac89cb 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -117,19 +117,6 @@ def get_os_info(): class Connection: """Connection class""" def __init__(self, name): - # dict of function to be called for each event - self.handlers = {'ROSTER': [], 'WARNING': [], 'ERROR': [], - 'INFORMATION': [], 'STATUS': [], 'NOTIFY': [], 'MSG': [], - 'MSGERROR': [], 'MSGSENT': [] , 'SUBSCRIBED': [], 'UNSUBSCRIBED': [], - 'SUBSCRIBE': [], 'AGENT_INFO': [], 'REGISTER_AGENT_INFO': [], - 'AGENT_INFO_ITEMS': [], 'AGENT_INFO_INFO': [], 'QUIT': [], - 'ACC_OK': [], 'MYVCARD': [], 'OS_INFO': [], 'VCARD': [], 'GC_MSG': [], - 'GC_SUBJECT': [], 'GC_CONFIG': [], 'BAD_PASSPHRASE': [], - 'ROSTER_INFO': [], 'ERROR_ANSWER': [], 'BOOKMARKS': [], 'CON_TYPE': [], - 'FILE_REQUEST': [], 'FILE_RCV_COMPLETED': [], 'FILE_PROGRESS': [], - 'FILE_REQUEST_ERROR': [], 'FILE_SEND_ERROR': [], - 'STANZA_ARRIVED': [], 'STANZA_SENT': [], 'HTTP_AUTH': [] - } self.name = name self.connected = 0 # offline self.connection = None # xmpppy instance @@ -142,7 +129,6 @@ class Connection: self.last_incoming = time.time() self.keep_alive_sent = False self.to_be_sent = [] - self.for_gui = [] self.last_sent = [] self.files_props = {} self.password = gajim.config.get_per('accounts', name, 'password') @@ -156,11 +142,7 @@ class Connection: def dispatch(self, event, data): '''always passes account name as first param''' - if not event in self.handlers: - print event, 'is not in:', self.handlers - return - for handler in self.handlers[event]: - handler(self.name, data) + gajim.events_for_ui[self.name].append([event, data]) def add_sha(self, p): c = p.setTag('x', namespace = common.xmpp.NS_VCARD_UPDATE) @@ -1204,7 +1186,8 @@ class Connection: gajim.log.debug(_('Connected to server with %s'), con_type) - self.for_gui.append(['CON_TYPE', con_type]) # notify the gui about con_type + # notify the gui about con_type + self.dispatch('CON_TYPE', con_type) con.RegisterHandler('message', self._messageCB) con.RegisterHandler('presence', self._presenceCB) @@ -1273,15 +1256,6 @@ class Connection: return None # END connect - def register_handler(self, event, function): - if event in self.handlers: - self.handlers[event].append(function) - - def unregister_handler(self, event, function): - if event in self.handlers: - if function in self.handlers[event]: - self.handlers[event].remove(function) - def quit(self, kill_core): if kill_core: if self.connected > 1: @@ -1335,7 +1309,7 @@ class Connection: if signed: p.setTag(common.xmpp.NS_SIGNED + ' x').setData(signed) self.connection.send(p) - self.for_gui.append(['STATUS', 'invisible']) + self.dispatch('STATUS', 'invisible') if initial: #ask our VCard self.request_vcard(None) @@ -1364,14 +1338,14 @@ class Connection: if keyID and USE_GPG: if self.connected < 2 and self.gpg.passphrase is None: # We didn't set a passphrase - self.for_gui.append(['ERROR', (_('OpenPGP Key was not given'), - _('You will be connected to %s without OpenPGP.') % self.name)]) + self.dispatch('ERROR', (_('OpenPGP Key was not given'), + _('You will be connected to %s without OpenPGP.') % self.name)) else: signed = self.gpg.sign(msg, keyID) if signed == 'BAD_PASSPHRASE': signed = '' if self.connected < 2: - self.for_gui.append(['BAD_PASSPHRASE', ()]) + self.dispatch('BAD_PASSPHRASE', ()) self.status = msg if show != 'offline' and not self.connected: self.connection = self.connect() @@ -1391,7 +1365,7 @@ class Connection: if self.connection: self.connection.send(p) - self.for_gui.append(['STATUS', show]) + self.dispatch('STATUS', show) #ask our VCard self.request_vcard(None) @@ -1412,7 +1386,7 @@ class Connection: self.connection.disconnect() except: pass - self.for_gui.append(['STATUS', 'offline']) + self.dispatch('STATUS', 'offline') self.connection = None elif show != 'offline' and self.connected: was_invisible = self.connected == STATUS_LIST.index('invisible') @@ -1433,7 +1407,7 @@ class Connection: p.setTag(common.xmpp.NS_SIGNED + ' x').setData(signed) if self.connection: self.connection.send(p) - self.for_gui.append(['STATUS', show]) + self.dispatch('STATUS', show) def send_motd(self, jid, subject = '', msg = ''): if not self.connection: @@ -1861,10 +1835,6 @@ class Connection: self.connection.send(tosend) self.last_sent.append(time.time()) - while time.time() < t_limit and len(self.for_gui): - print len(self.for_gui) - tosend = self.for_gui.pop(0) - self.dispatch(tosend[0], tosend[1]) try: if gajim.config.get_per('accounts', self.name, 'keep_alives_enabled'): # do we want keepalives? diff --git a/src/common/gajim.py b/src/common/gajim.py index 0ce06dd83..b1e7573da 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -63,6 +63,8 @@ sleeper_state = {} # whether we pass auto away / xa or not #'autoaway': autoaway and use sleeper #'autoxa': autoxa and use sleeper status_before_autoaway = {} +#queues of events from connections +events_for_ui = {} socks5quue = None diff --git a/src/config.py b/src/config.py index 8dab426ec..7e64e70b4 100644 --- a/src/config.py +++ b/src/config.py @@ -1286,6 +1286,7 @@ _('To change the account name, you must be disconnected.')).get_response() gajim.last_message_time[self.account] gajim.status_before_autoaway[name] = \ gajim.status_before_autoaway[self.account] + gajim.events_for_ui[name] = gajim.events_for_ui[self.account] #upgrade account variable in opened windows for kind in ['infos', 'chats', 'gc', 'gc_config']: @@ -1312,6 +1313,7 @@ _('To change the account name, you must be disconnected.')).get_response() del gajim.encrypted_chats[self.account] del gajim.last_message_time[self.account] del gajim.status_before_autoaway[self.account] + del gajim.events_for_ui[self.account] gajim.connections[self.account].name = name gajim.connections[name] = gajim.connections[self.account] del gajim.connections[self.account] @@ -1366,6 +1368,7 @@ _('To change the account name, you must be disconnected.')).get_response() gajim.encrypted_chats[name] = [] gajim.last_message_time[name] = {} gajim.status_before_autoaway[name] = '' + gajim.events_for_ui[name] = [] #refresh accounts window if self.plugin.windows.has_key('accounts'): self.plugin.windows['accounts'].init_accounts() @@ -2465,6 +2468,7 @@ class RemoveAccountWindow: del gajim.encrypted_chats[self.account] del gajim.last_message_time[self.account] del gajim.status_before_autoaway[self.account] + del gajim.events_for_ui[self.account] self.plugin.roster.draw_roster() if self.plugin.windows.has_key('accounts'): self.plugin.windows['accounts'].init_accounts() diff --git a/src/gajim.py b/src/gajim.py index 51bf1a9ae..3ca1088c6 100755 --- a/src/gajim.py +++ b/src/gajim.py @@ -610,7 +610,8 @@ class Interface: gajim.sleeper_state[name] = 'off' gajim.encrypted_chats[name] = [] gajim.last_message_time[name] = {} - gajim.status_before_autoaway[name] = {} + gajim.status_before_autoaway[name] = '' + gajim.events_for_ui[name] = [] gajim.connections[name].change_status('offline', None, True) gajim.connections[name].connected = 0 if self.windows.has_key('accounts'): @@ -960,46 +961,43 @@ class Interface: self.make_regexps() def register_handlers(self, con): - con.register_handler('ROSTER', self.handle_event_roster) - con.register_handler('WARNING', self.handle_event_warning) - con.register_handler('ERROR', self.handle_event_error) - con.register_handler('INFORMATION', self.handle_event_information) - con.register_handler('ERROR_ANSWER', self.handle_event_error_answer) - con.register_handler('STATUS', self.handle_event_status) - con.register_handler('NOTIFY', self.handle_event_notify) - con.register_handler('MSG', self.handle_event_msg) - con.register_handler('MSGERROR', self.handle_event_msgerror) - con.register_handler('MSGSENT', self.handle_event_msgsent) - con.register_handler('SUBSCRIBED', self.handle_event_subscribed) - con.register_handler('UNSUBSCRIBED', self.handle_event_unsubscribed) - con.register_handler('SUBSCRIBE', self.handle_event_subscribe) - con.register_handler('AGENT_INFO', self.handle_event_agent_info) - con.register_handler('REGISTER_AGENT_INFO', - self.handle_event_register_agent_info) - con.register_handler('AGENT_INFO_ITEMS', - self.handle_event_agent_info_items) - con.register_handler('AGENT_INFO_INFO', - self.handle_event_agent_info_info) - con.register_handler('QUIT', self.handle_event_quit) - con.register_handler('ACC_OK', self.handle_event_acc_ok) - con.register_handler('MYVCARD', self.handle_event_myvcard) - con.register_handler('VCARD', self.handle_event_vcard) - con.register_handler('OS_INFO', self.handle_event_os_info) - con.register_handler('GC_MSG', self.handle_event_gc_msg) - con.register_handler('GC_SUBJECT', self.handle_event_gc_subject) - con.register_handler('GC_CONFIG', self.handle_event_gc_config) - con.register_handler('BAD_PASSPHRASE', self.handle_event_bad_passphrase) - con.register_handler('ROSTER_INFO', self.handle_event_roster_info) - con.register_handler('BOOKMARKS', self.handle_event_bookmarks) - con.register_handler('CON_TYPE', self.handle_event_con_type) - con.register_handler('FILE_REQUEST', self.handle_event_file_request) - con.register_handler('FILE_REQUEST_ERROR', - self.handle_event_file_request_error) - con.register_handler('FILE_SEND_ERROR', - self.handle_event_file_send_error) - con.register_handler('STANZA_ARRIVED', self.handle_event_stanza_arrived) - con.register_handler('STANZA_SENT', self.handle_event_stanza_sent) - con.register_handler('HTTP_AUTH', self.handle_event_http_auth) + self.handlers = { + 'ROSTER': self.handle_event_roster, + 'WARNING': self.handle_event_warning, + 'ERROR': self.handle_event_error, + 'INFORMATION': self.handle_event_information, + 'ERROR_ANSWER': self.handle_event_error_answer, + 'STATUS': self.handle_event_status, + 'NOTIFY': self.handle_event_notify, + 'MSG': self.handle_event_msg, + 'MSGERROR': self.handle_event_msgerror, + 'MSGSENT': self.handle_event_msgsent, + 'SUBSCRIBED': self.handle_event_subscribed, + 'UNSUBSCRIBED': self.handle_event_unsubscribed, + 'SUBSCRIBE': self.handle_event_subscribe, + 'AGENT_INFO': self.handle_event_agent_info, + 'REGISTER_AGENT_INFO': self.handle_event_register_agent_info, + 'AGENT_INFO_ITEMS': self.handle_event_agent_info_items, + 'AGENT_INFO_INFO': self.handle_event_agent_info_info, + 'QUIT': self.handle_event_quit, + 'ACC_OK': self.handle_event_acc_ok, + 'MYVCARD': self.handle_event_myvcard, + 'VCARD': self.handle_event_vcard, + 'OS_INFO': self.handle_event_os_info, + 'GC_MSG': self.handle_event_gc_msg, + 'GC_SUBJECT': self.handle_event_gc_subject, + 'GC_CONFIG': self.handle_event_gc_config, + 'BAD_PASSPHRASE': self.handle_event_bad_passphrase, + 'ROSTER_INFO': self.handle_event_roster_info, + 'BOOKMARKS': self.handle_event_bookmarks, + 'CON_TYPE': self.handle_event_con_type, + 'FILE_REQUEST': self.handle_event_file_request, + 'FILE_REQUEST_ERROR': self.handle_event_file_request_error, + 'FILE_SEND_ERROR': self.handle_event_file_send_error, + 'STANZA_ARRIVED': self.handle_event_stanza_arrived, + 'STANZA_SENT': self.handle_event_stanza_sent, + 'HTTP_AUTH': self.handle_event_http_auth, + } def process_connections(self): try: @@ -1013,6 +1011,9 @@ class Interface: gajim.connections[account].process(0.01) if gajim.socks5queue.connected: gajim.socks5queue.process(0.01) + while len(gajim.events_for_ui[account]): + ev = gajim.events_for_ui[account].pop(0) + self.handlers[ev[0]](account, ev[1]) time.sleep(0.01) # so threads in connection.py have time to run return True # renew timeout (loop for ever) except KeyboardInterrupt: @@ -1117,6 +1118,7 @@ class Interface: gajim.encrypted_chats[a] = [] gajim.last_message_time[a] = {} gajim.status_before_autoaway[a] = '' + gajim.events_for_ui[a] = [] self.roster = roster_window.RosterWindow(self) if gajim.config.get('use_dbus'):