From 450064105405d77c3f9c2b0b07e3a19ed6255db2 Mon Sep 17 00:00:00 2001 From: Yann Leboulanger Date: Mon, 30 Aug 2010 21:42:36 +0200 Subject: [PATCH] use NEC to handle search form request / result --- src/common/connection.py | 23 +++--------- src/common/connection_handlers.py | 20 +++-------- src/common/connection_handlers_events.py | 45 +++++++++++++++++++++++ src/gui_interface.py | 16 --------- src/search_window.py | 46 ++++++++++++++---------- 5 files changed, 82 insertions(+), 68 deletions(-) diff --git a/src/common/connection.py b/src/common/connection.py index 39c83edf1..e3850909b 100644 --- a/src/common/connection.py +++ b/src/common/connection.py @@ -2308,31 +2308,16 @@ class Connection(CommonConnection, ConnectionHandlers): def send_search_form(self, jid, form, is_form): iq = common.xmpp.Iq(typ = 'set', to = jid, queryNS = \ - common.xmpp.NS_SEARCH) + common.xmpp.NS_SEARCH) item = iq.getTag('query') if is_form: - item.addChild(node = form) + item.addChild(node=form) else: for i in form.keys(): item.setTagData(i, form[i]) def _on_response(resp): - jid = jid = helpers.get_jid_from_iq(resp) - tag = resp.getTag('query', namespace = common.xmpp.NS_SEARCH) - if not tag: - self.dispatch('SEARCH_RESULT', (jid, None, False)) - return - df = tag.getTag('x', namespace = common.xmpp.NS_DATA) - if df: - self.dispatch('SEARCH_RESULT', (jid, df, True)) - return - df = [] - for item in tag.getTags('item'): - # We also show attributes. jid is there - f = item.attrs - for i in item.getPayload(): - f[i.getName()] = i.getData() - df.append(f) - self.dispatch('SEARCH_RESULT', (jid, df, False)) + gajim.nec.push_incoming_event(SearchResultReceivedEvent(None, + conn=self, iq_obj=resp)) self.connection.SendAndCallForResponse(iq, _on_response) diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py index 80bc5ff45..7b85b9a85 100644 --- a/src/common/connection_handlers.py +++ b/src/common/connection_handlers.py @@ -2244,20 +2244,10 @@ ConnectionJingle, ConnectionIBBytestream): self.connection.send(iq) - def _search_fields_received(self, con, iq_obj): - jid = jid = helpers.get_jid_from_iq(iq_obj) - tag = iq_obj.getTag('query', namespace = common.xmpp.NS_SEARCH) - if not tag: - self.dispatch('SEARCH_FORM', (jid, None, False)) - return - df = tag.getTag('x', namespace = common.xmpp.NS_DATA) - if df: - self.dispatch('SEARCH_FORM', (jid, df, True)) - return - df = {} - for i in iq_obj.getQueryPayload(): - df[i.getName()] = i.getData() - self.dispatch('SEARCH_FORM', (jid, df, False)) + def _SearchCB(self, con, iq_obj): + log.debug('SearchCB') + gajim.nec.push_incoming_event(SearchFormReceivedEvent(None, + conn=self, iq_obj=iq_obj)) def _StreamCB(self, con, obj): if obj.getTag('conflict'): @@ -2343,7 +2333,7 @@ ConnectionJingle, ConnectionIBBytestream): common.xmpp.NS_DISCO_ITEMS) con.RegisterHandler('iq', self._IqPingCB, 'get', common.xmpp.NS_PING) - con.RegisterHandler('iq', self._search_fields_received, 'result', + con.RegisterHandler('iq', self._SearchCB, 'result', common.xmpp.NS_SEARCH) con.RegisterHandler('iq', self._PrivacySetCB, 'set', common.xmpp.NS_PRIVACY) diff --git a/src/common/connection_handlers_events.py b/src/common/connection_handlers_events.py index f88a8fba8..6134d6df7 100644 --- a/src/common/connection_handlers_events.py +++ b/src/common/connection_handlers_events.py @@ -500,4 +500,49 @@ class PubsubBookmarksReceivedEvent(nec.NetworkIncomingEvent, BookmarksHelper): if ns != 'storage:bookmarks': return self.parse_bookmarks() + return True + +class SearchFormReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): + name = 'search-form-received' + base_network_events = [] + + def generate(self): + self.get_jid_resource() + self.data = None + self.is_dataform = False + tag = self.iq_obj.getTag('query', namespace=xmpp.NS_SEARCH) + if not tag: + return True + self.data = tag.getTag('x', namespace=xmpp.NS_DATA) + if self.data: + self.is_dataform = True + return True + self.data = {} + for i in self.iq_obj.getQueryPayload(): + self.data[i.getName()] = i.getData() + return True + + +class SearchResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): + name = 'search-result-received' + base_network_events = [] + + def generate(self): + self.get_jid_resource() + self.data = None + self.is_dataform = False + tag = self.iq_obj.getTag('query', namespace=xmpp.NS_SEARCH) + if not tag: + return True + self.data = tag.getTag('x', namespace=xmpp.NS_DATA) + if self.data: + self.is_dataform = True + return True + self.data = [] + for item in tag.getTags('item'): + # We also show attributes. jid is there + f = item.attrs + for i in item.getPayload(): + f[i.getName()] = i.getData() + self.data.append(f) return True \ No newline at end of file diff --git a/src/gui_interface.py b/src/gui_interface.py index 60e729b25..f2deaf677 100644 --- a/src/gui_interface.py +++ b/src/gui_interface.py @@ -1704,20 +1704,6 @@ class Interface: if ctrl: ctrl.print_conversation(_('Error.'), 'status') - def handle_event_search_form(self, account, data): - # ('SEARCH_FORM', account, (jid, dataform, is_dataform)) - if data[0] not in self.instances[account]['search']: - return - self.instances[account]['search'][data[0]].on_form_arrived(data[1], - data[2]) - - def handle_event_search_result(self, account, data): - # ('SEARCH_RESULT', account, (jid, dataform, is_dataform)) - if data[0] not in self.instances[account]['search']: - return - self.instances[account]['search'][data[0]].on_result_arrived(data[1], - data[2]) - def handle_event_resource_conflict(self, account, data): # ('RESOURCE_CONFLICT', account, ()) # First we go offline, but we don't overwrite status message @@ -2132,8 +2118,6 @@ class Interface: 'PING_SENT': [self.handle_event_ping_sent], 'PING_REPLY': [self.handle_event_ping_reply], 'PING_ERROR': [self.handle_event_ping_error], - 'SEARCH_FORM': [self.handle_event_search_form], - 'SEARCH_RESULT': [self.handle_event_search_result], 'RESOURCE_CONFLICT': [self.handle_event_resource_conflict], 'PEP_CONFIG': [self.handle_event_pep_config], 'UNIQUE_ROOM_ID_UNSUPPORTED': \ diff --git a/src/search_window.py b/src/search_window.py index 7dc92dbb2..1bc2c8a46 100644 --- a/src/search_window.py +++ b/src/search_window.py @@ -22,7 +22,9 @@ import gobject import gtk -from common import gajim, dataforms +from common import gajim +from common import dataforms +from common import ged import gtkgui_helpers import dialogs @@ -57,6 +59,11 @@ class SearchWindow: # Is there a jid column in results ? if -1: no, else column number self.jid_column = -1 + gajim.ged.register_event_handler('search-form-received', ged.GUI1, + self._nec_search_form_received) + gajim.ged.register_event_handler('search-result-received', ged.GUI1, + self._nec_search_result_received) + def request_form(self): gajim.connections[self.account].request_search_fields(self.jid) @@ -72,6 +79,10 @@ class SearchWindow: if self.pulse_id: gobject.source_remove(self.pulse_id) del gajim.interface.instances[self.account]['search'][self.jid] + gajim.ged.remove_event_handler('search-form-received', ged.GUI1, + self._nec_search_form_received) + gajim.ged.remove_event_handler('search-result-received', ged.GUI1, + self._nec_search_result_received) def on_close_button_clicked(self, button): self.window.destroy() @@ -115,16 +126,16 @@ class SearchWindow: gajim.interface.instances[self.account]['infos'][jid] = \ vcard.VcardWindow(contact, self.account) - def on_form_arrived(self, form, is_form): + def _nec_search_form_received(self, obj): if self.pulse_id: gobject.source_remove(self.pulse_id) self.progressbar.hide() self.label.hide() - if is_form: + if obj.is_dataform: self.is_form = True self.data_form_widget = dataforms_widget.DataFormWidget() - self.dataform = dataforms.ExtendForm(node = form) + self.dataform = dataforms.ExtendForm(node=obj.data) self.data_form_widget.set_sensitive(True) try: self.data_form_widget.data_form = self.dataform @@ -137,7 +148,7 @@ class SearchWindow: self.data_form_widget.title) else: self.is_form = False - self.data_form_widget = config.FakeDataForm(form) + self.data_form_widget = config.FakeDataForm(obj.data) self.data_form_widget.show_all() self.search_vbox.pack_start(self.data_form_widget) @@ -155,14 +166,14 @@ class SearchWindow: self.add_contact_button.set_sensitive(False) self.information_button.set_sensitive(False) - def on_result_arrived(self, form, is_form): + def _nec_search_result_received(self, obj): if self.pulse_id: gobject.source_remove(self.pulse_id) self.progressbar.hide() self.label.hide() - if not is_form: - if not form: + if not obj.is_dataform: + if not obj.data: self.label.set_text(_('No result')) self.label.show() return @@ -171,20 +182,19 @@ class SearchWindow: sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.result_treeview = gtk.TreeView() self.result_treeview.connect('cursor-changed', - self.on_result_treeview_cursor_changed) + self.on_result_treeview_cursor_changed) sw.add(self.result_treeview) # Create model - fieldtypes = [str]*len(form[0]) + fieldtypes = [str]*len(obj.data[0]) model = gtk.ListStore(*fieldtypes) # Copy data to model - for item in form: + for item in obj.data: model.append(item.values()) # Create columns counter = 0 - for field in form[0].keys(): - self.result_treeview.append_column( - gtk.TreeViewColumn(field, gtk.CellRendererText(), - text = counter)) + for field in obj.data[0].keys(): + self.result_treeview.append_column(gtk.TreeViewColumn(field, + gtk.CellRendererText(), text=counter)) if field == 'jid': self.jid_column = counter counter += 1 @@ -196,7 +206,7 @@ class SearchWindow: self.information_button.show() return - self.dataform = dataforms.ExtendForm(node = form) + self.dataform = dataforms.ExtendForm(node=obj.data) if len(self.dataform.items) == 0: # No result self.label.set_text(_('No result')) @@ -215,7 +225,7 @@ class SearchWindow: selection = self.result_treeview.get_selection() selection.set_mode(gtk.SELECTION_SINGLE) self.result_treeview.connect('cursor-changed', - self.on_result_treeview_cursor_changed) + self.on_result_treeview_cursor_changed) counter = 0 for field in self.dataform.items[0].fields: @@ -230,4 +240,4 @@ class SearchWindow: self.information_button.show() if self.data_form_widget.title: self.window.set_title('%s - Search - Gajim' % \ - self.data_form_widget.title) + self.data_form_widget.title)