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

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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': \

View File

@ -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)