use NEC to handle PEP / ATOM messages

This commit is contained in:
Yann Leboulanger 2010-11-24 11:41:20 +01:00
parent 3fea030706
commit 352bda2ef5
5 changed files with 85 additions and 55 deletions

View file

@ -1597,6 +1597,9 @@ class ChatControl(ChatControlBase):
self._video_button.set_tooltip_text( self._video_button.set_tooltip_text(
'%s\n%s' % (tooltip_text, _('Requires python-farsight.'))) '%s\n%s' % (tooltip_text, _('Requires python-farsight.')))
gajim.ged.register_event_handler('pep-received', ged.GUI1,
self._nec_pep_received)
# PluginSystem: adding GUI extension point for this ChatControl # PluginSystem: adding GUI extension point for this ChatControl
# instance object # instance object
gajim.plugin_manager.gui_extension_point('chat_control', self) gajim.plugin_manager.gui_extension_point('chat_control', self)
@ -1670,6 +1673,19 @@ class ChatControl(ChatControlBase):
else: else:
img.hide() img.hide()
def _nec_pep_received(self, obj):
if obj.conn.name != self.account:
return
if obj.jid != self.contact.jid:
return
if obj.pep_type == 'nickname':
self.update_ui()
self.parent_win.redraw_tab(self)
self.parent_win.show_title()
else:
self.update_pep(obj.pep_type)
def _update_jingle(self, jingle_type): def _update_jingle(self, jingle_type):
if jingle_type not in ('audio', 'video'): if jingle_type not in ('audio', 'video'):
return return
@ -2567,6 +2583,9 @@ class ChatControl(ChatControlBase):
# instance object # instance object
gajim.plugin_manager.remove_gui_extension_point('chat_control', self) # Send 'gone' chatstate gajim.plugin_manager.remove_gui_extension_point('chat_control', self) # Send 'gone' chatstate
gajim.ged.remove_event_handler('pep-received', ged.GUI1,
self._nec_pep_received)
self.send_chatstate('gone', self.contact) self.send_chatstate('gone', self.contact)
self.contact.chatstate = None self.contact.chatstate = None
self.contact.our_chatstate = None self.contact.our_chatstate = None

View file

@ -24,6 +24,7 @@ from time import (localtime, time as time_time)
from calendar import timegm from calendar import timegm
import hmac import hmac
from common import atom
from common import nec from common import nec
from common import helpers from common import helpers
from common import gajim from common import gajim
@ -31,6 +32,7 @@ from common import xmpp
from common import dataforms from common import dataforms
from common import exceptions from common import exceptions
from common.logger import LOG_DB_PATH from common.logger import LOG_DB_PATH
from common.pep import SUPPORTED_PERSONAL_USER_EVENTS
import logging import logging
log = logging.getLogger('gajim.c.connection_handlers_events') log = logging.getLogger('gajim.c.connection_handlers_events')
@ -1358,11 +1360,11 @@ class CapsPresenceReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
self._extract_caps_from_presence() self._extract_caps_from_presence()
return True return True
class CapsDiscoReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): class CapsDiscoReceivedEvent(nec.NetworkIncomingEvent):
name = 'caps-disco-received' name = 'caps-disco-received'
base_network_events = [] base_network_events = []
class CapsReceivedEvent(nec.NetworkIncomingEvent, HelperEvent): class CapsReceivedEvent(nec.NetworkIncomingEvent):
name = 'caps-received' name = 'caps-received'
base_network_events = ['caps-presence-received', 'caps-disco-received'] base_network_events = ['caps-presence-received', 'caps-disco-received']
@ -1385,3 +1387,46 @@ class GPGPasswordRequiredEvent(nec.NetworkIncomingEvent):
def generate(self): def generate(self):
self.keyid = gajim.config.get_per('accounts', self.conn.name, 'keyid') self.keyid = gajim.config.get_per('accounts', self.conn.name, 'keyid')
return True return True
class PEPReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
name = 'pep-received'
base_network_events = []
def generate(self):
if not self.stanza.getTag('event'):
return
if self.stanza.getTag('error'):
log.debug('PEPReceivedEvent received error stanza. Ignoring')
return
try:
self.get_jid_resource()
except Exception:
return
self.event_tag = self.stanza.getTag('event')
for pep_class in SUPPORTED_PERSONAL_USER_EVENTS:
pep = pep_class.get_tag_as_PEP(self.fjid, self.conn.name,
self.event_tag)
if pep:
self.pep_type = pep.type
return True
items = self.event_tag.getTag('items')
if items:
# for each entry in feed (there shouldn't be more than one, but to
# be sure...
for item in items.getTags('item'):
entry = item.getTag('entry', namespace=xmpp.NS_ATOM)
if entry:
gajim.nec.push_incoming_event(AtomEntryReceived(None,
conn=self.conn, node=entry))
class AtomEntryReceived(nec.NetworkIncomingEvent):
name = 'atom-entry-received'
base_network_events = []
def generate(self):
self.atom_entry = atom.OldEntry(node=entry)
return True

View file

@ -203,7 +203,6 @@ import logging
log = logging.getLogger('gajim.c.pep') log = logging.getLogger('gajim.c.pep')
from common import helpers from common import helpers
from common import atom
from common import xmpp from common import xmpp
from common import gajim from common import gajim
@ -492,7 +491,9 @@ class UserLocationPEP(AbstractPEP):
SUPPORTED_PERSONAL_USER_EVENTS = [UserMoodPEP, UserTunePEP, UserActivityPEP, SUPPORTED_PERSONAL_USER_EVENTS = [UserMoodPEP, UserTunePEP, UserActivityPEP,
UserNicknamePEP, UserLocationPEP] UserNicknamePEP, UserLocationPEP]
from common.connection_handlers_events import PEPReceivedEvent
class ConnectionPEP(object): class ConnectionPEP(object):
@ -530,30 +531,8 @@ class ConnectionPEP(object):
def _pubsubEventCB(self, xmpp_dispatcher, msg): def _pubsubEventCB(self, xmpp_dispatcher, msg):
''' Called when we receive <message /> with pubsub event. ''' ''' Called when we receive <message /> with pubsub event. '''
if not msg.getTag('event'): gajim.nec.push_incoming_event(PEPReceivedEvent(None, conn=self,
return stanza=msg))
if msg.getTag('error'):
log.debug('PubsubEventCB received error stanza. Ignoring')
raise xmpp.NodeProcessed
jid = helpers.get_full_jid_from_iq(msg)
event_tag = msg.getTag('event')
for pep_class in SUPPORTED_PERSONAL_USER_EVENTS:
pep = pep_class.get_tag_as_PEP(jid, self._account, event_tag)
if pep:
self._dispatcher.dispatch('PEP_RECEIVED', (jid, pep.type))
items = event_tag.getTag('items')
if items:
for item in items.getTags('item'):
entry = item.getTag('entry', namespace=xmpp.NS_ATOM)
if entry:
# for each entry in feed (there shouldn't be more than one,
# but to be sure...
self._dispatcher.dispatch('ATOM_ENTRY',
(atom.OldEntry(node=entry),))
raise xmpp.NodeProcessed raise xmpp.NodeProcessed
def send_activity(self, activity, subactivity=None, message=None): def send_activity(self, activity, subactivity=None, message=None):

View file

@ -1186,9 +1186,8 @@ class Interface:
gajim.contacts.define_metacontacts(account, tags_list) gajim.contacts.define_metacontacts(account, tags_list)
self.roster.redraw_metacontacts(account) self.roster.redraw_metacontacts(account)
def handle_atom_entry(self, account, data): def handle_atom_entry(self, obj):
atom_entry, = data AtomWindow.newAtomEntry(obj.atom_entry)
AtomWindow.newAtomEntry(atom_entry)
def handle_event_failed_decrypt(self, account, data): def handle_event_failed_decrypt(self, account, data):
jid, tim, session = data jid, tim, session = data
@ -1597,27 +1596,6 @@ class Interface:
checktext2, on_response_ok=on_ok, on_response_cancel=on_cancel, checktext2, on_response_ok=on_ok, on_response_cancel=on_cancel,
is_modal=False) is_modal=False)
def handle_event_pep_received(self, account, data):
# ('PEP_RECEIVED', account, (jid, pep_type))
jid = data[0]
pep_type = data[1]
ctrl = common.gajim.interface.msg_win_mgr.get_control(jid, account)
if jid == common.gajim.get_jid_from_account(account):
self.roster.draw_account(account)
if pep_type == 'nickname':
self.roster.draw_contact(jid, account)
if ctrl:
ctrl.update_ui()
win = ctrl.parent_win
win.redraw_tab(ctrl)
win.show_title()
else:
self.roster.draw_pep(jid, account, pep_type)
if ctrl:
ctrl.update_pep(pep_type)
def create_core_handlers_list(self): def create_core_handlers_list(self):
self.handlers = { self.handlers = {
'WARNING': [self.handle_event_warning], 'WARNING': [self.handle_event_warning],
@ -1636,7 +1614,6 @@ class Interface:
'FILE_SEND_ERROR': [self.handle_event_file_send_error], 'FILE_SEND_ERROR': [self.handle_event_file_send_error],
'SIGNED_IN': [self.handle_event_signed_in], 'SIGNED_IN': [self.handle_event_signed_in],
'METACONTACTS': [self.handle_event_metacontacts], 'METACONTACTS': [self.handle_event_metacontacts],
'ATOM_ENTRY': [self.handle_atom_entry],
'FAILED_DECRYPT': [self.handle_event_failed_decrypt], 'FAILED_DECRYPT': [self.handle_event_failed_decrypt],
'PRIVACY_LISTS_RECEIVED': \ 'PRIVACY_LISTS_RECEIVED': \
[self.handle_event_privacy_lists_received], [self.handle_event_privacy_lists_received],
@ -1657,7 +1634,7 @@ class Interface:
'INSECURE_SSL_CONNECTION': \ 'INSECURE_SSL_CONNECTION': \
[self.handle_event_insecure_ssl_connection], [self.handle_event_insecure_ssl_connection],
'INSECURE_PASSWORD': [self.handle_event_insecure_password], 'INSECURE_PASSWORD': [self.handle_event_insecure_password],
'PEP_RECEIVED': [self.handle_event_pep_received], 'atom-entry-received': [self.handle_atom_entry],
'bad-gpg-passphrase': [self.handle_event_bad_gpg_passphrase], 'bad-gpg-passphrase': [self.handle_event_bad_gpg_passphrase],
'bookmarks-received': [self.handle_event_bookmarks], 'bookmarks-received': [self.handle_event_bookmarks],
'connection-lost': [self.handle_event_connection_lost], 'connection-lost': [self.handle_event_connection_lost],

View file

@ -1287,7 +1287,6 @@ class RosterWindow:
iters = self._get_contact_iter(jid, account, model=self.model) iters = self._get_contact_iter(jid, account, model=self.model)
if not iters: if not iters:
return return
jid = self.model[iters[0]][C_JID].decode('utf-8')
contact = gajim.contacts.get_contact(account, jid) contact = gajim.contacts.get_contact(account, jid)
if pep_type in contact.pep: if pep_type in contact.pep:
pixbuf = contact.pep[pep_type].asPixbufIcon() pixbuf = contact.pep[pep_type].asPixbufIcon()
@ -2493,6 +2492,15 @@ class RosterWindow:
for jid in obj.jid_list: for jid in obj.jid_list:
self.remove_contact(jid, obj.conn.name, backend=True) self.remove_contact(jid, obj.conn.name, backend=True)
def _nec_pep_received(self, obj):
if obj.jid == common.gajim.get_jid_from_account(obj.conn.name):
self.draw_account(obj.conn.name)
if obj.pep_type == 'nickname':
self.draw_contact(obj.jid, obj.conn.name)
else:
self.draw_pep(obj.jid, obj.conn.name, obj.pep_type)
################################################################################ ################################################################################
### Menu and GUI callbacks ### Menu and GUI callbacks
### FIXME: order callbacks in itself... ### FIXME: order callbacks in itself...
@ -6245,3 +6253,5 @@ class RosterWindow:
self._nec_connection_type) self._nec_connection_type)
gajim.ged.register_event_handler('agent-removed', ged.GUI1, gajim.ged.register_event_handler('agent-removed', ged.GUI1,
self._nec_agent_removed) self._nec_agent_removed)
gajim.ged.register_event_handler('pep-received', ged.GUI1,
self._nec_pep_received)