use NEC to handle archiving stanza.

This commit is contained in:
Yann Leboulanger 2010-11-05 20:36:45 +01:00
parent d957a590f7
commit 344181fc01
5 changed files with 131 additions and 97 deletions

View File

@ -1102,6 +1102,9 @@ ConnectionJingle, ConnectionIBBytestream):
gajim.nec.register_incoming_event(StreamConflictReceivedEvent)
gajim.nec.register_incoming_event(PresenceReceivedEvent)
gajim.nec.register_incoming_event(MessageReceivedEvent)
gajim.nec.register_incoming_event(ArchivingErrorReceivedEvent)
gajim.nec.register_incoming_event(
ArchivingPreferencesChangedReceivedEvent)
gajim.ged.register_event_handler('http-auth-received', ged.CORE,
self._nec_http_auth_received)

View File

@ -1152,4 +1152,79 @@ class JingleErrorReceivedEvent(nec.NetworkIncomingEvent):
self.fjid = self.jingle_session.peerjid
self.jid, self.resource = gajim.get_room_and_nick_from_fjid(self.fjid)
self.sid = self.jingle_session.sid
return True
class ArchivingReceivedEvent(nec.NetworkIncomingEvent):
name = 'archiving-received'
base_network_events = []
def generate(self):
self.type_ = self.stanza.getType()
if self.type_ not in ('result', 'set', 'error'):
return
return True
class ArchivingErrorReceivedEvent(nec.NetworkIncomingEvent):
name = 'archiving-error-received'
base_network_events = ['archiving-received']
def generate(self):
self.conn = self.base_event.conn
self.stanza = self.base_event.stanza
self.type_ = self.base_event.conn
if self.type_ == 'error':
self.error_msg = self.stanza.getErrorMsg()
return True
class ArchivingPreferencesChangedReceivedEvent(nec.NetworkIncomingEvent):
name = 'archiving-preferences-changed-received'
base_network_events = ['archiving-received']
def generate(self):
self.conn = self.base_event.conn
self.stanza = self.base_event.stanza
self.type_ = self.base_event.type_
if self.type_ not in ('result', 'set'):
return
self.conf = {}
self.new_items = {}
self.removed_items = []
if self.stanza.getTag('pref'):
pref = self.stanza.getTag('pref')
if pref.getTag('auto'):
self.conf['auto'] = pref.getTagAttr('auto', 'save')
method_auto = pref.getTag('method', attrs={'type': 'auto'})
if method_auto:
self.conf['method_auto'] = method_auto.getAttr('use')
method_local = pref.getTag('method', attrs={'type': 'local'})
if method_local:
self.conf['method_local'] = method_local.getAttr('use')
method_manual = pref.getTag('method', attrs={'type': 'manual'})
if method_manual:
self.conf['method_manual'] = method_manual.getAttr('use')
default = pref.getTag('default')
if default:
self.conf['default'] = {
'expire': default.getAttr('expire'),
'otr': default.getAttr('otr'),
'save': default.getAttr('save'),
'unset': default.getAttr('unset')}
for item in pref.getTags('item'):
self.new_items[item.getAttr('jid')] = {
'expire': item.getAttr('expire'),
'otr': item.getAttr('otr'),
'save': item.getAttr('save')}
elif self.stanza.getTag('itemremove'):
for item in pref.getTags('item'):
self.removed_items.append(item.getAttr('jid'))
return True

View File

@ -19,6 +19,9 @@
##
import common.xmpp
from common import gajim
from common import ged
from common.connection_handlers_events import ArchivingReceivedEvent
import logging
log = logging.getLogger('gajim.c.message_archiving')
@ -39,6 +42,9 @@ class ConnectionArchive:
self.method_manual = None
self.default = None
self.items = {}
gajim.ged.register_event_handler(
'archiving-preferences-changed-received', ged.CORE,
self._nec_archiving_changed_received)
def request_message_archiving_preferences(self):
iq_ = common.xmpp.Iq('get')
@ -129,73 +135,24 @@ class ConnectionArchive:
def _ArchiveCB(self, con, iq_obj):
log.debug('_ArchiveCB %s' % iq_obj.getType())
if iq_obj.getType() == 'error':
self.dispatch('ARCHIVING_ERROR', iq_obj.getErrorMsg())
return
elif iq_obj.getType() not in ('result', 'set'):
return
if iq_obj.getTag('pref'):
pref = iq_obj.getTag('pref')
if pref.getTag('auto'):
self.auto = pref.getTagAttr('auto', 'save')
log.debug('archiving preference: auto: %s' % self.auto)
self.dispatch('ARCHIVING_CHANGED', ('auto',
self.auto))
method_auto = pref.getTag('method', attrs={'type': 'auto'})
if method_auto:
self.method_auto = method_auto.getAttr('use')
self.dispatch('ARCHIVING_CHANGED', ('method_auto',
self.method_auto))
method_local = pref.getTag('method', attrs={'type': 'local'})
if method_local:
self.method_local = method_local.getAttr('use')
self.dispatch('ARCHIVING_CHANGED', ('method_local',
self.method_local))
method_manual = pref.getTag('method', attrs={'type': 'manual'})
if method_manual:
self.method_manual = method_manual.getAttr('use')
self.dispatch('ARCHIVING_CHANGED', ('method_manual',
self.method_manual))
log.debug('archiving preferences: method auto: %s, local: %s, '
'manual: %s' % (self.method_auto, self.method_local,
self.method_manual))
if pref.getTag('default'):
default = pref.getTag('default')
log.debug('archiving preferences: default otr: %s, save: %s, '
'expire: %s, unset: %s' % (default.getAttr('otr'),
default.getAttr('save'), default.getAttr('expire'),
default.getAttr('unset')))
self.default = {
'expire': default.getAttr('expire'),
'otr': default.getAttr('otr'),
'save': default.getAttr('save'),
'unset': default.getAttr('unset')}
self.dispatch('ARCHIVING_CHANGED', ('default',
self.default))
for item in pref.getTags('item'):
log.debug('archiving preferences for jid %s: otr: %s, save: %s, '
'expire: %s' % (item.getAttr('jid'), item.getAttr('otr'),
item.getAttr('save'), item.getAttr('expire')))
self.items[item.getAttr('jid')] = {
'expire': item.getAttr('expire'),
'otr': item.getAttr('otr'), 'save': item.getAttr('save')}
self.dispatch('ARCHIVING_CHANGED', ('item',
item.getAttr('jid'), self.items[item.getAttr('jid')]))
elif iq_obj.getTag('itemremove'):
for item in pref.getTags('item'):
del self.items[item.getAttr('jid')]
self.dispatch('ARCHIVING_CHANGED', ('itemremove',
item.getAttr('jid')))
gajim.nec.push_incoming_event(ArchivingReceivedEvent(None, conn=self,
stanza=iq_obj))
raise common.xmpp.NodeProcessed
def _nec_archiving_changed_received(self, obj):
if obj.conn.name != self.name:
return
for key in ('auto', 'method_auto', 'method_local', 'method_manual',
'default'):
if key in obj.conf:
self.__dict__[key] = obj.conf[key]
for jid, pref in obj.new_items.items():
self.items[jid] = pref
for jid in obj.removed_items:
del self.items[jid]
def request_collections_list_page(self, with_='', start=None, end=None,
after=None, max=30, exact_match=False):
iq_ = common.xmpp.Iq('get')

View File

@ -3610,6 +3610,12 @@ class ArchivingPreferencesWindow:
self.window.set_title(_('Archiving Preferences for %s') % self.account)
gajim.ged.register_event_handler(
'archiving-preferences-changed-received', ged.GUI1,
self._nec_archiving_changed_received)
gajim.ged.register_event_handler('archiving-error-received', ged.GUI1,
self._nec_archiving_error)
self.window.show_all()
self.xml.connect_signals(self)
@ -3687,31 +3693,32 @@ class ArchivingPreferencesWindow:
if new_key_name in gajim.interface.instances[self.account]:
return gajim.interface.instances[self.account][new_key_name]
def archiving_changed(self, data):
if data[0] in ('auto', 'method_auto', 'method_local', 'method_manual'):
if data[0] in self.waiting:
self.waiting.remove(data[0])
elif data[0] == 'default':
def _nec_archiving_changed_received(self, obj):
if obj.conn.name != self.account:
return
for key in ('auto', 'method_auto', 'method_local', 'method_manual'):
if key in obj.conf and key in self.waiting:
self.waiting.remove(key)
if 'default' in obj.conf:
key_name = 'edit_item_archiving_preferences_%s' % \
self.current_item
if key_name in gajim.interface.instances[self.account]:
gajim.interface.instances[self.account][key_name].\
response_arrived(data[1:])
response_arrived(obj.conf['default'])
self.fill_items(True)
elif data[0] == 'item':
for jid, pref in obj.new_items.items():
child = self.get_child_window()
if child:
is_new = not child.item
child.response_arrived(data[1:])
child.response_arrived(pref)
if is_new:
model = self.item_treeview.get_model()
model.append((data[1], data[2]['expire'], data[2]['otr'],
data[2]['save']))
return
model.append((jid, pref['expire'], pref['otr'],
pref['save']))
continue
self.fill_items(True)
elif data[0] == 'itemremove' == self.waiting:
if data[0] in self.waiting:
self.waiting.remove(data[0])
if 'itemremove' in self.waiting and obj.removed_items:
self.waiting.remove('itemremove')
self.fill_items(True)
def fill_items(self, clear=False):
@ -3728,22 +3735,28 @@ class ArchivingPreferencesWindow:
model.append((item, expire_value, item_config['otr'],
item_config['save']))
def archiving_error(self, error):
def _nec_archiving_error(self, obj):
if obj.conn.name != self.account:
return
if self.waiting:
pritext = _('There is an error')
sectext = error
sectext = obj.error_msg
ErrorDialog(pritext, sectext)
self.waiting.pop()
else:
child = self.get_child_window()
if child:
child.error_arrived(error)
print error
child.error_arrived(obj.error_msg)
def on_close_button_clicked(self, widget):
self.window.destroy()
def on_archiving_preferences_window_destroy(self, widget):
gajim.ged.remove_event_handler(
'archiving-preferences-changed-received', ged.GUI1,
self._nec_archiving_changed_received)
gajim.ged.remove_event_handler('archiving-error-received', ged.GUI1,
self._nec_archiving_error)
if 'archiving_preferences' in gajim.interface.instances[self.account]:
del gajim.interface.instances[self.account]['archiving_preferences']

View File

@ -1827,18 +1827,6 @@ class Interface:
if pm_ctrl and hasattr(pm_ctrl, "update_contact"):
pm_ctrl.update_contact()
def handle_event_archiving_changed(self, account, data):
# ('ARCHIVING_CHANGED', account, (type, value)
if 'archiving_preferences' in self.instances[account]:
self.instances[account]['archiving_preferences'].archiving_changed(
data)
def handle_event_archiving_error(self, account, data):
# ('ARCHIVING_CHANGED', account, (error_msg,))
if 'archiving_preferences' in self.instances[account]:
self.instances[account]['archiving_preferences'].archiving_error(
data)
def create_core_handlers_list(self):
self.handlers = {
'WARNING': [self.handle_event_warning],
@ -1899,8 +1887,6 @@ class Interface:
'INSECURE_PASSWORD': [self.handle_event_insecure_password],
'PEP_RECEIVED': [self.handle_event_pep_received],
'CAPS_RECEIVED': [self.handle_event_caps_received],
'ARCHIVING_CHANGED': [self.handle_event_archiving_changed],
'ARCHIVING_ERROR': [self.handle_event_archiving_error],
'bookmarks-received': [self.handle_event_bookmarks],
'gc-invitation-received': [self.handle_event_gc_invitation],
'gc-presence-received': [self.handle_event_gc_presence],