use NEC to handle caps events

This commit is contained in:
Yann Leboulanger 2010-11-17 17:27:36 +01:00
parent 1ed5de8f44
commit d94a85f5a2
5 changed files with 70 additions and 38 deletions

View File

@ -2108,7 +2108,6 @@ ConnectionJingle, ConnectionIBBytestream):
# that defines handlers
con.RegisterHandler('message', self._messageCB)
con.RegisterHandler('presence', self._presenceCB)
con.RegisterHandler('presence', self._capsPresenceCB)
# We use makefirst so that this handler is called before _messageCB, and
# can prevent calling it when it's not needed.
# We also don't check for namespace, else it cannot stop _messageCB to

View File

@ -1334,3 +1334,42 @@ class PingReplyEvent(nec.NetworkIncomingEvent):
class PingErrorEvent(nec.NetworkIncomingEvent):
name = 'ping-error'
base_network_events = []
class CapsPresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
name = 'caps-presence-received'
base_network_events = ['raw-pres-received']
def _extract_caps_from_presence(self):
caps_tag = self.stanza.getTag('c', namespace=xmpp.NS_CAPS)
if caps_tag:
self.hash_method = caps_tag['hash']
self.node = caps_tag['node']
self.caps_hash = caps_tag['ver']
else:
self.hash_method = self.node = self.caps_hash = None
def generate(self):
self.conn = self.base_event.conn
self.stanza = self.base_event.stanza
try:
self.get_jid_resource()
except Exception:
return
self._extract_caps_from_presence()
return True
class CapsDiscoReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
name = 'caps-disco-received'
base_network_events = []
class CapsReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
name = 'caps-received'
base_network_events = ['caps-presence-received', 'caps-disco-received']
def generate(self):
self.conn = self.base_event.conn
self.fjid = self.base_event.fjid
self.jid = self.base_event.jid
self.resource = self.base_event.resource
self.client_caps = self.base_event.client_caps
return True

View File

@ -25,9 +25,11 @@ Module containing the network portion of XEP-115 (Entity Capabilities)
import logging
log = logging.getLogger('gajim.c.p.caps')
from common.xmpp import NS_CAPS
from common import gajim
from common import ged
from common import helpers
from common.connection_handlers_events import CapsPresenceReceivedEvent, \
CapsDiscoReceivedEvent, CapsReceivedEvent
class ConnectionCaps(object):
@ -37,40 +39,27 @@ class ConnectionCaps(object):
self._dispatch_event = dispatch_event
self._capscache = capscache
self._create_suitable_client_caps = client_caps_factory
gajim.nec.register_incoming_event(CapsPresenceReceivedEvent)
gajim.nec.register_incoming_event(CapsReceivedEvent)
gajim.ged.register_event_handler('caps-presence-received', ged.GUI1,
self._nec_caps_presence_received)
def caps_change_account_name(self, new_name):
self._account = new_name
def _capsPresenceCB(self, con, presence):
"""
XMMPPY callback method to handle retrieved caps info
"""
try:
jid = helpers.get_full_jid_from_iq(presence)
except:
log.info("Ignoring invalid JID in caps presenceCB")
return
def _nec_caps_presence_received(self, obj):
obj.client_caps = self._create_suitable_client_caps(obj.node,
obj.caps_hash, obj.hash_method)
self._capscache.query_client_of_jid_if_unknown(self, obj.fjid,
obj.client_caps)
self._update_client_caps_of_contact(obj)
client_caps = self._extract_client_caps_from_presence(presence)
self._capscache.query_client_of_jid_if_unknown(self, jid, client_caps)
self._update_client_caps_of_contact(jid, client_caps)
self._dispatch_event('CAPS_RECEIVED', (jid,))
def _extract_client_caps_from_presence(self, presence):
caps_tag = presence.getTag('c', namespace=NS_CAPS)
if caps_tag:
hash_method, node, caps_hash = caps_tag['hash'], caps_tag['node'], caps_tag['ver']
else:
hash_method = node = caps_hash = None
return self._create_suitable_client_caps(node, caps_hash, hash_method)
def _update_client_caps_of_contact(self, jid, client_caps):
contact = self._get_contact_or_gc_contact_for_jid(jid)
def _update_client_caps_of_contact(self, obj):
contact = self._get_contact_or_gc_contact_for_jid(obj.fjid)
if contact:
contact.client_caps = client_caps
contact.client_caps = obj.client_caps
else:
log.info("Received Caps from unknown contact %s" % jid)
log.info('Received Caps from unknown contact %s' % obj.fjid)
def _get_contact_or_gc_contact_for_jid(self, jid):
contact = gajim.contacts.get_contact_from_full_jid(self._account, jid)
@ -109,4 +98,7 @@ class ConnectionCaps(object):
log.info("Computed and retrieved caps hash differ." +
"Ignoring caps of contact %s" % contact.get_full_jid())
self._dispatch_event('CAPS_RECEIVED', (jid,))
j, r = gajim.get_room_and_nick_from_fjid(jid)
gajim.nec.push_incoming_event(CapsDiscoReceivedEvent(None,
conn=self, fjid=jid, jid=j, resource=r,
client_caps=contact.client_caps))

View File

@ -149,6 +149,16 @@ class PrivateChatControl(ChatControl):
ChatControl.__init__(self, parent_win, contact, account, session)
self.TYPE_ID = 'pm'
def shutdown(self):
gajim.ged.remove_event_handler('caps-received', ged.GUI1,
self._nec_caps_received)
def _nec_caps_received(self, obj):
if obj.conn.name != self.account or \
obj.fjid != self.gc_contact.get_full_jid():
return
self.update_contact()
def send_message(self, message, xhtml=None, process_commands=True):
"""
Call this method to send the message

View File

@ -1698,13 +1698,6 @@ class Interface:
if ctrl:
ctrl.update_pep(pep_type)
def handle_event_caps_received(self, account, data):
# ('CAPS_RECEIVED', account, (full_jid))
full_jid = data[0]
pm_ctrl = gajim.interface.msg_win_mgr.get_control(full_jid, account)
if pm_ctrl and hasattr(pm_ctrl, "update_contact"):
pm_ctrl.update_contact()
def create_core_handlers_list(self):
self.handlers = {
'WARNING': [self.handle_event_warning],
@ -1748,7 +1741,6 @@ class Interface:
[self.handle_event_insecure_ssl_connection],
'INSECURE_PASSWORD': [self.handle_event_insecure_password],
'PEP_RECEIVED': [self.handle_event_pep_received],
'CAPS_RECEIVED': [self.handle_event_caps_received],
'bad-gpg-passphrase': [self.handle_event_bad_gpg_passphrase],
'bookmarks-received': [self.handle_event_bookmarks],
'connection-lost': [self.handle_event_connection_lost],