use NEC to handle search form request / result

This commit is contained in:
Yann Leboulanger 2010-08-30 21:42:36 +02:00
parent fea877e154
commit 4500641054
5 changed files with 82 additions and 68 deletions

View file

@ -2311,28 +2311,13 @@ class Connection(CommonConnection, ConnectionHandlers):
common.xmpp.NS_SEARCH) common.xmpp.NS_SEARCH)
item = iq.getTag('query') item = iq.getTag('query')
if is_form: if is_form:
item.addChild(node = form) item.addChild(node=form)
else: else:
for i in form.keys(): for i in form.keys():
item.setTagData(i, form[i]) item.setTagData(i, form[i])
def _on_response(resp): def _on_response(resp):
jid = jid = helpers.get_jid_from_iq(resp) gajim.nec.push_incoming_event(SearchResultReceivedEvent(None,
tag = resp.getTag('query', namespace = common.xmpp.NS_SEARCH) conn=self, iq_obj=resp))
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))
self.connection.SendAndCallForResponse(iq, _on_response) self.connection.SendAndCallForResponse(iq, _on_response)

View file

@ -2244,20 +2244,10 @@ ConnectionJingle, ConnectionIBBytestream):
self.connection.send(iq) self.connection.send(iq)
def _search_fields_received(self, con, iq_obj): def _SearchCB(self, con, iq_obj):
jid = jid = helpers.get_jid_from_iq(iq_obj) log.debug('SearchCB')
tag = iq_obj.getTag('query', namespace = common.xmpp.NS_SEARCH) gajim.nec.push_incoming_event(SearchFormReceivedEvent(None,
if not tag: conn=self, iq_obj=iq_obj))
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 _StreamCB(self, con, obj): def _StreamCB(self, con, obj):
if obj.getTag('conflict'): if obj.getTag('conflict'):
@ -2343,7 +2333,7 @@ ConnectionJingle, ConnectionIBBytestream):
common.xmpp.NS_DISCO_ITEMS) common.xmpp.NS_DISCO_ITEMS)
con.RegisterHandler('iq', self._IqPingCB, 'get', con.RegisterHandler('iq', self._IqPingCB, 'get',
common.xmpp.NS_PING) common.xmpp.NS_PING)
con.RegisterHandler('iq', self._search_fields_received, 'result', con.RegisterHandler('iq', self._SearchCB, 'result',
common.xmpp.NS_SEARCH) common.xmpp.NS_SEARCH)
con.RegisterHandler('iq', self._PrivacySetCB, 'set', con.RegisterHandler('iq', self._PrivacySetCB, 'set',
common.xmpp.NS_PRIVACY) common.xmpp.NS_PRIVACY)

View file

@ -501,3 +501,48 @@ class PubsubBookmarksReceivedEvent(nec.NetworkIncomingEvent, BookmarksHelper):
return return
self.parse_bookmarks() self.parse_bookmarks()
return True 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

View file

@ -1704,20 +1704,6 @@ class Interface:
if ctrl: if ctrl:
ctrl.print_conversation(_('Error.'), 'status') 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): def handle_event_resource_conflict(self, account, data):
# ('RESOURCE_CONFLICT', account, ()) # ('RESOURCE_CONFLICT', account, ())
# First we go offline, but we don't overwrite status message # 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_SENT': [self.handle_event_ping_sent],
'PING_REPLY': [self.handle_event_ping_reply], 'PING_REPLY': [self.handle_event_ping_reply],
'PING_ERROR': [self.handle_event_ping_error], '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], 'RESOURCE_CONFLICT': [self.handle_event_resource_conflict],
'PEP_CONFIG': [self.handle_event_pep_config], 'PEP_CONFIG': [self.handle_event_pep_config],
'UNIQUE_ROOM_ID_UNSUPPORTED': \ 'UNIQUE_ROOM_ID_UNSUPPORTED': \

View file

@ -22,7 +22,9 @@
import gobject import gobject
import gtk import gtk
from common import gajim, dataforms from common import gajim
from common import dataforms
from common import ged
import gtkgui_helpers import gtkgui_helpers
import dialogs import dialogs
@ -57,6 +59,11 @@ class SearchWindow:
# Is there a jid column in results ? if -1: no, else column number # Is there a jid column in results ? if -1: no, else column number
self.jid_column = -1 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): def request_form(self):
gajim.connections[self.account].request_search_fields(self.jid) gajim.connections[self.account].request_search_fields(self.jid)
@ -72,6 +79,10 @@ class SearchWindow:
if self.pulse_id: if self.pulse_id:
gobject.source_remove(self.pulse_id) gobject.source_remove(self.pulse_id)
del gajim.interface.instances[self.account]['search'][self.jid] 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): def on_close_button_clicked(self, button):
self.window.destroy() self.window.destroy()
@ -115,16 +126,16 @@ class SearchWindow:
gajim.interface.instances[self.account]['infos'][jid] = \ gajim.interface.instances[self.account]['infos'][jid] = \
vcard.VcardWindow(contact, self.account) vcard.VcardWindow(contact, self.account)
def on_form_arrived(self, form, is_form): def _nec_search_form_received(self, obj):
if self.pulse_id: if self.pulse_id:
gobject.source_remove(self.pulse_id) gobject.source_remove(self.pulse_id)
self.progressbar.hide() self.progressbar.hide()
self.label.hide() self.label.hide()
if is_form: if obj.is_dataform:
self.is_form = True self.is_form = True
self.data_form_widget = dataforms_widget.DataFormWidget() 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) self.data_form_widget.set_sensitive(True)
try: try:
self.data_form_widget.data_form = self.dataform self.data_form_widget.data_form = self.dataform
@ -137,7 +148,7 @@ class SearchWindow:
self.data_form_widget.title) self.data_form_widget.title)
else: else:
self.is_form = False 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.data_form_widget.show_all()
self.search_vbox.pack_start(self.data_form_widget) self.search_vbox.pack_start(self.data_form_widget)
@ -155,14 +166,14 @@ class SearchWindow:
self.add_contact_button.set_sensitive(False) self.add_contact_button.set_sensitive(False)
self.information_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: if self.pulse_id:
gobject.source_remove(self.pulse_id) gobject.source_remove(self.pulse_id)
self.progressbar.hide() self.progressbar.hide()
self.label.hide() self.label.hide()
if not is_form: if not obj.is_dataform:
if not form: if not obj.data:
self.label.set_text(_('No result')) self.label.set_text(_('No result'))
self.label.show() self.label.show()
return return
@ -174,17 +185,16 @@ class SearchWindow:
self.on_result_treeview_cursor_changed) self.on_result_treeview_cursor_changed)
sw.add(self.result_treeview) sw.add(self.result_treeview)
# Create model # Create model
fieldtypes = [str]*len(form[0]) fieldtypes = [str]*len(obj.data[0])
model = gtk.ListStore(*fieldtypes) model = gtk.ListStore(*fieldtypes)
# Copy data to model # Copy data to model
for item in form: for item in obj.data:
model.append(item.values()) model.append(item.values())
# Create columns # Create columns
counter = 0 counter = 0
for field in form[0].keys(): for field in obj.data[0].keys():
self.result_treeview.append_column( self.result_treeview.append_column(gtk.TreeViewColumn(field,
gtk.TreeViewColumn(field, gtk.CellRendererText(), gtk.CellRendererText(), text=counter))
text = counter))
if field == 'jid': if field == 'jid':
self.jid_column = counter self.jid_column = counter
counter += 1 counter += 1
@ -196,7 +206,7 @@ class SearchWindow:
self.information_button.show() self.information_button.show()
return return
self.dataform = dataforms.ExtendForm(node = form) self.dataform = dataforms.ExtendForm(node=obj.data)
if len(self.dataform.items) == 0: if len(self.dataform.items) == 0:
# No result # No result
self.label.set_text(_('No result')) self.label.set_text(_('No result'))