Welcome to mirror list, hosted at ThFree Co, Russian Federation.

dev.gajim.org/gajim/gajim.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYann Leboulanger <asterix@lagaule.org>2010-07-20 18:53:07 +0400
committerYann Leboulanger <asterix@lagaule.org>2010-07-20 18:53:07 +0400
commit8595638cb47764abca9dd37e35a5f3dd071edcf5 (patch)
tree7b25075ddfdf5c91d3ded775ee91f4e17cc08c72
parent01d486ec601259abcc96d632677419eb11b43800 (diff)
use nec / ged to handle time, version and last received event
-rw-r--r--src/common/connection_handlers.py238
-rw-r--r--src/gui_interface.py55
-rw-r--r--src/remote_control.py20
-rw-r--r--src/vcard.py30
4 files changed, 198 insertions, 145 deletions
diff --git a/src/common/connection_handlers.py b/src/common/connection_handlers.py
index 7347b454b..d6ae20dbd 100644
--- a/src/common/connection_handlers.py
+++ b/src/common/connection_handlers.py
@@ -815,33 +815,16 @@ class ConnectionHandlersBase:
def _ErrorCB(self, con, iq_obj):
log.debug('ErrorCB')
- jid_from = helpers.get_full_jid_from_iq(iq_obj)
- jid_stripped, resource = gajim.get_room_and_nick_from_fjid(jid_from)
id_ = unicode(iq_obj.getID())
if id_ in self.last_ids:
- self.dispatch('LAST_STATUS_TIME', (jid_stripped, resource, -1, ''))
- self.last_ids.remove(id_)
- return
+ gajim.nec.push_incoming_event(LastResultReceivedEvent(None,
+ conn=self, iq_obj=iq_obj))
+ return True
def _LastResultCB(self, con, iq_obj):
log.debug('LastResultCB')
- qp = iq_obj.getTag('query')
- seconds = qp.getAttr('seconds')
- status = qp.getData()
- try:
- seconds = int(seconds)
- except Exception:
- return
- id_ = iq_obj.getID()
- if id_ in self.groupchat_jids:
- who = self.groupchat_jids[id_]
- del self.groupchat_jids[id_]
- else:
- who = helpers.get_full_jid_from_iq(iq_obj)
- if id_ in self.last_ids:
- self.last_ids.remove(id_)
- jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who)
- self.dispatch('LAST_STATUS_TIME', (jid_stripped, resource, seconds, status))
+ gajim.nec.push_incoming_event(LastResultReceivedEvent(None, conn=self,
+ iq_obj=iq_obj))
def get_sessions(self, jid):
"""
@@ -1043,18 +1026,18 @@ ConnectionCaps, ConnectionHandlersBase, ConnectionJingle):
def _ErrorCB(self, con, iq_obj):
log.debug('ErrorCB')
- ConnectionHandlersBase._ErrorCB(self, con, iq_obj)
- jid_from = helpers.get_full_jid_from_iq(iq_obj)
- jid_stripped, resource = gajim.get_room_and_nick_from_fjid(jid_from)
+ if ConnectionHandlersBase._ErrorCB(self, con, iq_obj):
+ return
id_ = unicode(iq_obj.getID())
if id_ in self.version_ids:
- self.dispatch('OS_INFO', (jid_stripped, resource, '', ''))
- self.version_ids.remove(id_)
+ gajim.nec.push_incoming_event(VersionResultReceivedEvent(None,
+ conn=self, iq_obj=iq_obj))
return
if id_ in self.entity_time_ids:
- self.dispatch('ENTITY_TIME', (jid_stripped, resource, ''))
- self.entity_time_ids.remove(id_)
+ gajim.nec.push_incoming_event(LastResultReceivedEvent(None,
+ conn=self, iq_obj=iq_obj))
return
+ jid_from = helpers.get_full_jid_from_iq(iq_obj)
errmsg = iq_obj.getErrorMsg()
errcode = iq_obj.getErrorCode()
self.dispatch('ERROR_ANSWER', (id_, jid_from, errmsg, errcode))
@@ -1220,25 +1203,8 @@ ConnectionCaps, ConnectionHandlersBase, ConnectionJingle):
def _VersionResultCB(self, con, iq_obj):
log.debug('VersionResultCB')
- client_info = ''
- os_info = ''
- qp = iq_obj.getTag('query')
- if qp.getTag('name'):
- client_info += qp.getTag('name').getData()
- if qp.getTag('version'):
- client_info += ' ' + qp.getTag('version').getData()
- if qp.getTag('os'):
- os_info += qp.getTag('os').getData()
- id_ = iq_obj.getID()
- if id_ in self.groupchat_jids:
- who = self.groupchat_jids[id_]
- del self.groupchat_jids[id_]
- else:
- who = helpers.get_full_jid_from_iq(iq_obj)
- jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who)
- if id_ in self.version_ids:
- self.version_ids.remove(id_)
- self.dispatch('OS_INFO', (jid_stripped, resource, client_info, os_info))
+ gajim.nec.push_incoming_event(VersionResultReceivedEvent(None,
+ conn=self, iq_obj=iq_obj))
def _TimeCB(self, con, iq_obj):
log.debug('TimeCB')
@@ -1270,50 +1236,8 @@ ConnectionCaps, ConnectionHandlersBase, ConnectionJingle):
def _TimeRevisedResultCB(self, con, iq_obj):
log.debug('TimeRevisedResultCB')
- time_info = ''
- qp = iq_obj.getTag('time')
- if not qp:
- # wrong answer
- return
- tzo = qp.getTag('tzo').getData()
- if tzo.lower() == 'z':
- tzo = '0:0'
- tzoh, tzom = tzo.split(':')
- utc_time = qp.getTag('utc').getData()
- ZERO = datetime.timedelta(0)
- class UTC(datetime.tzinfo):
- def utcoffset(self, dt):
- return ZERO
- def tzname(self, dt):
- return "UTC"
- def dst(self, dt):
- return ZERO
-
- class contact_tz(datetime.tzinfo):
- def utcoffset(self, dt):
- return datetime.timedelta(hours=int(tzoh), minutes=int(tzom))
- def tzname(self, dt):
- return "remote timezone"
- def dst(self, dt):
- return ZERO
-
- try:
- t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%SZ')
- t = t.replace(tzinfo=UTC())
- time_info = t.astimezone(contact_tz()).strftime('%c')
- except ValueError, e:
- log.info('Wrong time format: %s' % str(e))
-
- id_ = iq_obj.getID()
- if id_ in self.groupchat_jids:
- who = self.groupchat_jids[id_]
- del self.groupchat_jids[id_]
- else:
- who = helpers.get_full_jid_from_iq(iq_obj)
- jid_stripped, resource = gajim.get_room_and_nick_from_fjid(who)
- if id_ in self.entity_time_ids:
- self.entity_time_ids.remove(id_)
- self.dispatch('ENTITY_TIME', (jid_stripped, resource, time_info))
+ gajim.nec.push_incoming_event(TimeResultReceivedEvent(None,
+ conn=self, iq_obj=iq_obj))
def _gMailNewMailCB(self, con, gm):
"""
@@ -2466,6 +2390,18 @@ ConnectionCaps, ConnectionHandlersBase, ConnectionJingle):
con.RegisterHandler('message', self._StanzaArrivedCB)
con.RegisterHandler('unknown', self._StreamCB, 'urn:ietf:params:xml:ns:xmpp-streams', xmlns='http://etherx.jabber.org/streams')
+class HelperEvent:
+ def get_jid_resource(self):
+ if self.id_ in self.conn.groupchat_jids:
+ who = self.conn.groupchat_jids[self.id_]
+ del self.conn.groupchat_jids[self.id_]
+ else:
+ who = helpers.get_full_jid_from_iq(self.iq_obj)
+ self.jid, self.resource = gajim.get_room_and_nick_from_fjid(who)
+
+ def get_id(self):
+ self.id_ = self.iq_obj.getID()
+
class HttpAuthReceivedEvent(nec.NetworkIncomingEvent):
name = 'http-auth-received'
base_network_events = []
@@ -2483,3 +2419,121 @@ class HttpAuthReceivedEvent(nec.NetworkIncomingEvent):
# In case it's a message with a body
self.msg = self.iq_obj.getTagData('body')
return True
+
+class LastResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
+ name = 'last-result-received'
+ base_network_events = []
+
+ def generate(self):
+ if not self.conn:
+ self.conn = self.base_event.conn
+ if not self.iq_obj:
+ self.iq_obj = self.base_event.xmpp_iq
+
+ self.get_id()
+ self.get_jid_resource()
+ if self.id_ in self.conn.last_ids:
+ self.conn.last_ids.remove(self.id_)
+
+ self.status = ''
+ self.seconds = -1
+
+ if self.iq_obj.getType() == 'error':
+ return True
+
+ qp = self.iq_obj.getTag('query')
+ sec = qp.getAttr('seconds')
+ self.status = qp.getData()
+ try:
+ self.seconds = int(sec)
+ except Exception:
+ return
+
+ return True
+
+class VersionResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
+ name = 'version-result-received'
+ base_network_events = []
+
+ def generate(self):
+ if not self.conn:
+ self.conn = self.base_event.conn
+ if not self.iq_obj:
+ self.iq_obj = self.base_event.xmpp_iq
+
+ self.get_id()
+ self.get_jid_resource()
+ if self.id_ in self.conn.version_ids:
+ self.conn.version_ids.remove(self.id_)
+
+ self.client_info = ''
+ self.os_info = ''
+
+ if self.iq_obj.getType() == 'error':
+ return True
+
+ qp = self.iq_obj.getTag('query')
+ if qp.getTag('name'):
+ self.client_info += qp.getTag('name').getData()
+ if qp.getTag('version'):
+ self.client_info += ' ' + qp.getTag('version').getData()
+ if qp.getTag('os'):
+ self.os_info += qp.getTag('os').getData()
+
+ return True
+
+class TimeResultReceivedEvent(nec.NetworkIncomingEvent, HelperEvent):
+ name = 'version-result-received'
+ base_network_events = []
+
+ def generate(self):
+ if not self.conn:
+ self.conn = self.base_event.conn
+ if not self.iq_obj:
+ self.iq_obj = self.base_event.xmpp_iq
+
+ self.get_id()
+ self.get_jid_resource()
+ if self.id_ in self.conn.entity_time_ids:
+ self.conn.entity_time_ids.remove(self.id_)
+
+ self.time_info = ''
+
+ if self.iq_obj.getType() == 'error':
+ return True
+
+ qp = self.iq_obj.getTag('time')
+ if not qp:
+ # wrong answer
+ return
+ tzo = qp.getTag('tzo').getData()
+ if tzo.lower() == 'z':
+ tzo = '0:0'
+ tzoh, tzom = tzo.split(':')
+ utc_time = qp.getTag('utc').getData()
+ ZERO = datetime.timedelta(0)
+ class UTC(datetime.tzinfo):
+ def utcoffset(self, dt):
+ return ZERO
+ def tzname(self, dt):
+ return "UTC"
+ def dst(self, dt):
+ return ZERO
+
+ class contact_tz(datetime.tzinfo):
+ def utcoffset(self, dt):
+ return datetime.timedelta(hours=int(tzoh), minutes=int(tzom))
+ def tzname(self, dt):
+ return "remote timezone"
+ def dst(self, dt):
+ return ZERO
+
+ try:
+ t = datetime.datetime.strptime(utc_time, '%Y-%m-%dT%H:%M:%SZ')
+ t = t.replace(tzinfo=UTC())
+ self.time_info = t.astimezone(contact_tz()).strftime('%c')
+ except ValueError, e:
+ log.info('Wrong time format: %s' % str(e))
+ return
+
+ return True
diff --git a/src/gui_interface.py b/src/gui_interface.py
index a758ce14a..d7512dc9c 100644
--- a/src/gui_interface.py
+++ b/src/gui_interface.py
@@ -825,57 +825,24 @@ class Interface:
if self.remote_ctrl:
self.remote_ctrl.raise_signal('VcardInfo', (account, vcard))
- def handle_event_last_status_time(self, account, array):
+ def handle_event_last_status_time(self, obj):
# ('LAST_STATUS_TIME', account, (jid, resource, seconds, status))
- tim = array[2]
- if tim < 0:
+ if obj.seconds < 0:
# Ann error occured
return
- win = None
- if array[0] in self.instances[account]['infos']:
- win = self.instances[account]['infos'][array[0]]
- elif array[0] + '/' + array[1] in self.instances[account]['infos']:
- win = self.instances[account]['infos'][array[0] + '/' + array[1]]
- c = gajim.contacts.get_contact(account, array[0], array[1])
+ account = obj.conn.name
+ c = gajim.contacts.get_contact(account, obj.jid, obj.resource)
if c: # c can be none if it's a gc contact
- if array[3]:
- c.status = array[3]
+ if obj.status:
+ c.status = obj.status
self.roster.draw_contact(c.jid, account) # draw offline status
- last_time = time.localtime(time.time() - tim)
+ last_time = time.localtime(time.time() - obj.seconds)
if c.show == 'offline':
c.last_status_time = last_time
else:
c.last_activity_time = last_time
- if win:
- win.set_last_status_time()
- if self.roster.tooltip.id and self.roster.tooltip.win:
- self.roster.tooltip.update_last_time(last_time)
- if self.remote_ctrl:
- self.remote_ctrl.raise_signal('LastStatusTime', (account, array))
-
- def handle_event_os_info(self, account, array):
- #'OS_INFO' (account, (jid, resource, client_info, os_info))
- win = None
- if array[0] in self.instances[account]['infos']:
- win = self.instances[account]['infos'][array[0]]
- elif array[0] + '/' + array[1] in self.instances[account]['infos']:
- win = self.instances[account]['infos'][array[0] + '/' + array[1]]
- if win:
- win.set_os_info(array[1], array[2], array[3])
- if self.remote_ctrl:
- self.remote_ctrl.raise_signal('OsInfo', (account, array))
-
- def handle_event_entity_time(self, account, array):
- #'ENTITY_TIME' (account, (jid, resource, time_info))
- win = None
- if array[0] in self.instances[account]['infos']:
- win = self.instances[account]['infos'][array[0]]
- elif array[0] + '/' + array[1] in self.instances[account]['infos']:
- win = self.instances[account]['infos'][array[0] + '/' + array[1]]
- if win:
- win.set_entity_time(array[1], array[2])
- if self.remote_ctrl:
- self.remote_ctrl.raise_signal('EntityTime', (account, array))
+ if self.roster.tooltip.id and self.roster.tooltip.win:
+ self.roster.tooltip.update_last_time(last_time)
def handle_event_gc_notify(self, account, array):
#'GC_NOTIFY' (account, (room_jid, show, status, nick,
@@ -2118,9 +2085,6 @@ class Interface:
'ACC_OK': [self.handle_event_acc_ok],
'MYVCARD': [self.handle_event_myvcard],
'VCARD': [self.handle_event_vcard],
- 'LAST_STATUS_TIME': [self.handle_event_last_status_time],
- 'OS_INFO': [self.handle_event_os_info],
- 'ENTITY_TIME': [self.handle_event_entity_time],
'GC_NOTIFY': [self.handle_event_gc_notify],
'GC_MSG': [self.handle_event_gc_msg],
'GC_SUBJECT': [self.handle_event_gc_subject],
@@ -2183,6 +2147,7 @@ class Interface:
'PEP_RECEIVED': [self.handle_event_pep_received],
'CAPS_RECEIVED': [self.handle_event_caps_received],
'http-auth-received': [self.handle_event_http_auth],
+ 'last-result-received': [self.handle_event_last_status_time],
}
def register_core_handlers(self):
diff --git a/src/remote_control.py b/src/remote_control.py
index 95411a653..1df760713 100644
--- a/src/remote_control.py
+++ b/src/remote_control.py
@@ -36,6 +36,7 @@ from common import gajim
from common import helpers
from time import time
from dialogs import AddNewContactWindow, NewChatDialog, JoinGroupchatWindow
+from common import ged
from common import dbus_support
if dbus_support.supported:
@@ -103,6 +104,25 @@ class Remote:
bus_name = dbus.service.BusName(SERVICE, bus=session_bus)
self.signal_object = SignalObject(bus_name)
+
+ gajim.ged.register_event_handler('last-result-received', ged.POSTGUI,
+ self.on_last_status_time)
+ gajim.ged.register_event_handler('version-result-received', ged.POSTGUI,
+ self.on_os_info)
+ gajim.ged.register_event_handler('time-result-received', ged.POSTGUI,
+ self.on_time)
+
+ def on_last_status_time(self, obj):
+ self.raise_signal('LastStatusTime', (obj.conn.name, [
+ obj.jid, obj.resource, obj.seconds, obj.status]))
+
+ def on_os_info(self, obj):
+ self.raise_signal('OsInfo', (obj.conn.name, [obj.jid, obj.resource,
+ obj.client_info, obj.os_info]))
+
+ def on_time(self, obj):
+ self.raise_signal('EntityTime', (obj.conn.name, [obj.jid, obj.resource,
+ obj.time_info]))
def raise_signal(self, signal, arg):
if self.signal_object:
diff --git a/src/vcard.py b/src/vcard.py
index fa2f96936..d33770c3e 100644
--- a/src/vcard.py
+++ b/src/vcard.py
@@ -42,6 +42,7 @@ import gtkgui_helpers
from common import helpers
from common import gajim
+from common import ged
from common.i18n import Q_
def get_avatar_pixbuf_encoded_mime(photo):
@@ -125,6 +126,13 @@ class VcardWindow:
self.update_progressbar_timeout_id = gobject.timeout_add(100,
self.update_progressbar)
+ gajim.ged.register_event_handler('version-result-received', ged.GUI1,
+ self.set_os_info)
+ gajim.ged.register_event_handler('last-result-received', ged.GUI2,
+ self.set_last_status_time)
+ gajim.ged.register_event_handler('time-result-received', ged.GUI1,
+ self.set_entity_time)
+
self.fill_jabber_page()
annotations = gajim.connections[self.account].annotations
if self.contact.jid in annotations:
@@ -150,6 +158,12 @@ class VcardWindow:
if annotation != connection.annotations.get(self.contact.jid, ''):
connection.annotations[self.contact.jid] = annotation
connection.store_annotations()
+ gajim.ged.remove_event_handler('version-result-received', ged.GUI1,
+ self.set_os_info)
+ gajim.ged.remove_event_handler('last-result-received', ged.GUI2,
+ self.set_last_status_time)
+ gajim.ged.remove_event_handler('time-result-received', ged.GUI1,
+ self.set_entity_time)
def on_vcard_information_window_key_press_event(self, widget, event):
if event.keyval == gtk.keysyms.Escape:
@@ -226,10 +240,10 @@ class VcardWindow:
self.progressbar.hide()
self.update_progressbar_timeout_id = None
- def set_last_status_time(self):
+ def set_last_status_time(self, obj):
self.fill_status_label()
- def set_os_info(self, resource, client_info, os_info):
+ def set_os_info(self, obj):
if self.xml.get_object('information_notebook').get_n_pages() < 5:
return
i = 0
@@ -237,9 +251,9 @@ class VcardWindow:
os = ''
while i in self.os_info:
if not self.os_info[i]['resource'] or \
- self.os_info[i]['resource'] == resource:
- self.os_info[i]['client'] = client_info
- self.os_info[i]['os'] = os_info
+ self.os_info[i]['resource'] == obj.resource:
+ self.os_info[i]['client'] = obj.client_info
+ self.os_info[i]['os'] = obj.os_info
if i > 0:
client += '\n'
os += '\n'
@@ -256,15 +270,15 @@ class VcardWindow:
self.os_info_arrived = True
self.test_remove_progressbar()
- def set_entity_time(self, resource, time_info):
+ def set_entity_time(self, obj):
if self.xml.get_object('information_notebook').get_n_pages() < 5:
return
i = 0
time_s = ''
while i in self.time_info:
if not self.time_info[i]['resource'] or \
- self.time_info[i]['resource'] == resource:
- self.time_info[i]['time'] = time_info
+ self.time_info[i]['resource'] == obj.resource:
+ self.time_info[i]['time'] = obj.time_info
if i > 0:
time_s += '\n'
time_s += self.time_info[i]['time']