use NEC to handle search form request / result
This commit is contained in:
parent
fea877e154
commit
4500641054
5 changed files with 82 additions and 68 deletions
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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
|
|
@ -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': \
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Add table
Reference in a new issue