use NEC to handle metacontacts events

This commit is contained in:
Yann Leboulanger 2010-11-28 10:37:05 +01:00
parent 92ef8bfec7
commit 5cb8def28b
4 changed files with 42 additions and 30 deletions

View File

@ -651,31 +651,8 @@ class ConnectionVcard:
if not self.connection:
return
if iq_obj.getType() == 'result':
# Metacontact tags
# http://www.xmpp.org/extensions/xep-0209.html
meta_list = {}
query = iq_obj.getTag('query')
storage = query.getTag('storage')
metas = storage.getTags('meta')
for meta in metas:
try:
jid = helpers.parse_jid(meta.getAttr('jid'))
except common.helpers.InvalidFormat:
continue
tag = meta.getAttr('tag')
data = {'jid': jid}
order = meta.getAttr('order')
try:
order = int(order)
except Exception:
order = 0
if order is not None:
data['order'] = order
if tag in meta_list:
meta_list[tag].append(data)
else:
meta_list[tag] = [data]
self.dispatch('METACONTACTS', meta_list)
gajim.nec.push_incoming_event(MetacontactsReceivedEvent(None,
conn=self, stanza=iq_obj))
else:
if iq_obj.getErrorCode() not in ('403', '406', '404'):
self.private_storage_supported = False

View File

@ -1522,4 +1522,35 @@ class VcardReceivedEvent(nec.NetworkIncomingEvent):
class PEPConfigReceivedEvent(nec.NetworkIncomingEvent):
name = 'pep-config-received'
base_network_events = []
base_network_events = []
class MetacontactsReceivedEvent(nec.NetworkIncomingEvent):
name = 'metacontacts-received'
base_network_events = []
def generate(self):
# Metacontact tags
# http://www.xmpp.org/extensions/xep-0209.html
self.meta_list = {}
query = self.stanza.getTag('query')
storage = self.stanza.getTag('storage')
metas = self.stanza.getTags('meta')
for meta in metas:
try:
jid = helpers.parse_jid(meta.getAttr('jid'))
except common.helpers.InvalidFormat:
continue
tag = meta.getAttr('tag')
data = {'jid': jid}
order = meta.getAttr('order')
try:
order = int(order)
except Exception:
order = 0
if order is not None:
data['order'] = order
if tag in self.meta_list:
self.meta_list[tag].append(data)
else:
self.meta_list[tag] = [data]
return True

View File

@ -1056,9 +1056,8 @@ class Interface:
gajim.config.set_per('accounts', account, 'last_archiving_time',
time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime()))
def handle_event_metacontacts(self, account, tags_list):
gajim.contacts.define_metacontacts(account, tags_list)
self.roster.redraw_metacontacts(account)
def handle_event_metacontacts(self, obj):
gajim.contacts.define_metacontacts(obj.conn.name, obj.meta_list)
def handle_atom_entry(self, obj):
AtomWindow.newAtomEntry(obj.atom_entry)
@ -1420,7 +1419,6 @@ class Interface:
'FILE_REQUEST_ERROR': [self.handle_event_file_request_error],
'FILE_SEND_ERROR': [self.handle_event_file_send_error],
'SIGNED_IN': [self.handle_event_signed_in],
'METACONTACTS': [self.handle_event_metacontacts],
'FAILED_DECRYPT': [self.handle_event_failed_decrypt],
'ZC_NAME_CONFLICT': [self.handle_event_zc_name_conflict],
'PASSWORD_REQUIRED': [self.handle_event_password_required],
@ -1447,6 +1445,7 @@ class Interface:
'last-result-received': [self.handle_event_last_status_time],
'message-not-sent': [self.handle_event_msgnotsent],
'message-sent': [self.handle_event_msgsent],
'metacontacts-received': [self.handle_event_metacontacts],
'muc-admin-received': [self.handle_event_gc_affiliation],
'muc-owner-received': [self.handle_event_gc_config],
'our-show': [self.handle_event_status],

View File

@ -2514,6 +2514,9 @@ class RosterWindow:
contact.status = obj.subject
self.draw_contact(obj.room_jid, obj.conn.name)
def _nec_metacontacts_received(self, obj):
self.redraw_metacontacts(obj.conn.name)
################################################################################
### Menu and GUI callbacks
### FIXME: order callbacks in itself...
@ -6266,3 +6269,5 @@ class RosterWindow:
self._nec_vcard_received)
gajim.ged.register_event_handler('gc-subject-received', ged.GUI1,
self._nec_gc_subject_received)
gajim.ged.register_event_handler('metacontacts-received', ged.GUI2,
self._nec_metacontacts_received)