From da524c94fde9ce2c41ff1ff7e1077a63b3771ae6 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Wed, 8 Sep 2010 19:55:19 +0200 Subject: [PATCH] use NEC to handle error messages --- src/common/connection_handlers.py | 40 +++++++++++--------- src/common/connection_handlers_events.py | 11 ++++++ src/gui_interface.py | 47 +++++++++++------------- 3 files changed, 55 insertions(+), 43 deletions(-) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 6b6f4ebac..6916f4bde 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -896,12 +896,15 @@ class ConnectionHandlersBase: # keep track of sessions this connection has with other JIDs self.sessions = {} - def _ErrorCB(self, con, iq_obj): - log.debug('ErrorCB') - id_ = unicode(iq_obj.getID()) - if id_ in self.last_ids: + gajim.ged.register_event_handler('error-received', ged.CORE, + self._nec_error_received) + + def _nec_error_received(self, obj): + if obj.conn.name != self.name: + return + if obj.id_ in self.last_ids: gajim.nec.push_incoming_event(LastResultReceivedEvent(None, - conn=self, iq_obj=iq_obj)) + conn=self, iq_obj=obj.iq_obj)) return True def _LastResultCB(self, con, iq_obj): @@ -1103,6 +1106,8 @@ ConnectionJingle, ConnectionIBBytestream): gajim.nec.register_incoming_event(RosternotesReceivedEvent) gajim.ged.register_event_handler('roster-received', ged.CORE, self._nec_roster_received) + gajim.ged.register_event_handler('error-received', ged.CORE, + self._nec_error_received) def build_http_auth_answer(self, iq_obj, answer): if not self.connection or self.connected < 2: @@ -1133,21 +1138,20 @@ ConnectionJingle, ConnectionIBBytestream): def _ErrorCB(self, con, iq_obj): log.debug('ErrorCB') - if ConnectionHandlersBase._ErrorCB(self, con, iq_obj): + gajim.nec.push_incoming_event(ErrorReceivedEvent(None, conn=self, + iq_obj=iq_obj)) + + def _nec_error_received(self, obj): + if obj.conn.name != self.name: return - id_ = unicode(iq_obj.getID()) - if id_ in self.version_ids: + if obj.id_ in self.version_ids: gajim.nec.push_incoming_event(VersionResultReceivedEvent(None, - conn=self, iq_obj=iq_obj)) - return - if id_ in self.entity_time_ids: - gajim.nec.push_incoming_event(LastResultReceivedEvent(None, - conn=self, iq_obj=iq_obj)) - return - jid_from = helpers.get_full_jid_from_iq(iq_obj) - errmsg = iq_obj.getErrorMsg() - errcode = iq_obj.getErrorCode() - self.dispatch('ERROR_ANSWER', (id_, jid_from, errmsg, errcode)) + conn=self, iq_obj=obj.iq_obj)) + return True + if obj.id_ in self.entity_time_ids: + gajim.nec.push_incoming_event(TimeResultReceivedEvent(None, + conn=self, iq_obj=obj.iq_obj)) + return True def _nec_private_storate_bookmarks_received(self, obj): if obj.conn.name != self.name: diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index 009f8df59..d1853e512 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -547,3 +547,14 @@ class SearchResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): f[i.getName()] = i.getData() self.data.append(f) return True + +class ErrorReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): + name = 'error-received' + base_network_events = [] + + def generate(self): + self.get_id() + self.get_jid_resource() + self.errmsg = self.iq_obj.getErrorMsg() + self.errcode = self.iq_obj.getErrorCode() + return True \ No newline at end of file diff --git a/src/gui_interface.py b/src/gui_interface.py index f2deaf677..dfa401cbc 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -167,41 +167,38 @@ class Interface: 'id': obj.iq_id}, sec_msg, on_response_yes=(on_yes, obj), on_response_no=(response, obj, 'no')) - def handle_event_error_answer(self, account, array): - #('ERROR_ANSWER', account, (id, jid_from, errmsg, errcode)) - id_, jid_from, errmsg, errcode = array - if unicode(errcode) in ('400', '403', '406') and id_: + def handle_event_error_answer(self, obj): + #('ERROR_ANSWER', account, (id_, fjid, errmsg, errcode)) + if unicode(obj.errcode) in ('400', '403', '406') and obj.id_: # show the error dialog ft = self.instances['file_transfers'] - sid = id_ - if len(id_) > 3 and id_[2] == '_': - sid = id_[3:] + sid = obj.id_ + if len(obj.id_) > 3 and obj.id_[2] == '_': + sid = obj.id_[3:] if sid in ft.files_props['s']: file_props = ft.files_props['s'][sid] - if unicode(errcode) == '400': + if unicode(obj.errcode) == '400': file_props['error'] = -3 else: file_props['error'] = -4 - self.handle_event_file_request_error(account, - (jid_from, file_props, errmsg)) - conn = gajim.connections[account] - conn.disconnect_transfer(file_props) + self.handle_event_file_request_error(obj.conn.name, (obj.fjid, + file_props, obj.errmsg)) + obj.conn.disconnect_transfer(file_props) return - elif unicode(errcode) == '404': - conn = gajim.connections[account] - sid = id_ - if len(id_) > 3 and id_[2] == '_': - sid = id_[3:] - if sid in conn.files_props: - file_props = conn.files_props[sid] - self.handle_event_file_send_error(account, - (jid_from, file_props)) - conn.disconnect_transfer(file_props) + elif unicode(obj.errcode) == '404': + sid = obj.id_ + if len(obj.id_) > 3 and obj.id_[2] == '_': + sid = obj.id_[3:] + if sid in obj.conn.files_props: + file_props = obj.conn.files_props[sid] + self.handle_event_file_send_error(obj.conn.name, (obj.fjid, + file_props)) + obj.conn.disconnect_transfer(file_props) return - ctrl = self.msg_win_mgr.get_control(jid_from, account) + ctrl = self.msg_win_mgr.get_control(obj.fjid, obj.conn.name) if ctrl and ctrl.type_id == message_control.TYPE_GC: - ctrl.print_conversation('Error %s: %s' % (array[2], array[1])) + ctrl.print_conversation('Error %s: %s' % (obj.errcode, obj.errmsg)) def handle_event_con_type(self, account, con_type): # ('CON_TYPE', account, con_type) which can be 'ssl', 'tls', 'plain' @@ -2069,7 +2066,6 @@ class Interface: 'ERROR': [self.handle_event_error], 'DB_ERROR': [self.handle_event_db_error], 'INFORMATION': [self.handle_event_information], - 'ERROR_ANSWER': [self.handle_event_error_answer], 'STATUS': [self.handle_event_status], 'NEW_JID': [self.handle_event_new_jid], 'NOTIFY': [self.handle_event_notify], @@ -2142,6 +2138,7 @@ class Interface: 'ARCHIVING_CHANGED': [self.handle_event_archiving_changed], 'ARCHIVING_ERROR': [self.handle_event_archiving_error], 'bookmarks-received': [self.handle_event_bookmarks], + 'error-received': [self.handle_event_error_answer], 'gmail-notify': [self.handle_event_gmail_notify], 'http-auth-received': [self.handle_event_http_auth], 'last-result-received': [self.handle_event_last_status_time],