From 47f875a4bc5817f103e166bef6d3d1740a41030a Mon Sep 17 00:00:00 2001 From: Stephan Erb Date: Fri, 30 Oct 2009 23:01:25 +0100 Subject: [PATCH] Move CapsCache global from gajim.capscache to caps.capscache. --- src/common/caps.py | 28 ++++++++++++++-------------- src/common/contacts.py | 35 +++++++++++++++-------------------- src/common/gajim.py | 3 +++ src/gajim.py | 7 +++++++ test/test_caps.py | 19 ++++++++----------- test/test_contacts.py | 9 +++++---- 6 files changed, 52 insertions(+), 49 deletions(-) diff --git a/src/common/caps.py b/src/common/caps.py index 454359df2..9177c77c8 100644 --- a/src/common/caps.py +++ b/src/common/caps.py @@ -39,6 +39,13 @@ from common.xmpp import NS_XHTML_IM, NS_RECEIPTS, NS_ESESSION, NS_CHATSTATES FEATURE_BLACKLIST = [NS_CHATSTATES, NS_XHTML_IM, NS_RECEIPTS, NS_ESESSION] +capscache = None +def initialize(logger): + ''' Initializes the capscache global ''' + global capscache + capscache = CapsCache(logger) + + class AbstractClientCaps(object): ''' Base class representing a client and its capabilities as advertised by @@ -66,6 +73,7 @@ class AbstractClientCaps(object): return self._is_hash_valid def _is_hash_valid(self, identities, features, dataforms): + ''' To be implemented by subclassess ''' raise NotImplementedError() @@ -117,7 +125,10 @@ class NullClientCaps(AbstractClientCaps): AbstractClientCaps.__init__(self, None, None) def _lookup_in_cache(self, caps_cache): - return caps_cache[('old', '')] + # lookup something which does not exist to get a new CacheItem created + cache_item = caps_cache[('old', '')] + assert cache_item.queried == 0 + return cache_item def _discover(self, connection, jid): pass @@ -202,15 +213,6 @@ class CapsCache(object): identities, features) self.__CacheItem = CacheItem - - # prepopulate data which we are sure of; note: we do not log these info - for account in gajim.connections: - gajimcaps = self[('sha-1', gajim.caps_hash[account])] - gajimcaps.identities = [gajim.gajim_identity] - gajimcaps.features = gajim.gajim_common_features + \ - gajim.gajim_optional_features[account] - - # start logging data from the net self.logger = logger def initialize_from_db(self): @@ -248,8 +250,6 @@ class CapsCache(object): discover = client_caps.get_discover_strategy() discover(connection, jid) -gajim.capscache = CapsCache(gajim.logger) - class ConnectionCaps(object): ''' @@ -295,7 +295,7 @@ class ConnectionCaps(object): else: client_caps = ClientCaps(caps_hash, node, hash_method) - gajim.capscache.query_client_of_jid_if_unknown(self, jid, client_caps) + capscache.query_client_of_jid_if_unknown(self, jid, client_caps) contact.client_caps = client_caps if pm_ctrl: @@ -310,7 +310,7 @@ class ConnectionCaps(object): return lookup = contact.client_caps.get_cache_lookup_strategy() - cache_item = lookup(gajim.capscache) + cache_item = lookup(capscache) if cache_item.queried == 2: return diff --git a/src/common/contacts.py b/src/common/contacts.py index 7b50626e6..b50f80d70 100644 --- a/src/common/contacts.py +++ b/src/common/contacts.py @@ -30,13 +30,14 @@ import common.gajim -from common.caps import NullClientCaps, FEATURE_BLACKLIST + +from common import caps class CommonContact(object): def __init__(self, jid, resource, show, status, name, our_chatstate, - composing_xep, chatstate, client_caps=None, caps_cache=None): + composing_xep, chatstate, client_caps=None): self.jid = jid self.resource = resource @@ -44,8 +45,7 @@ class CommonContact(object): self.status = status self.name = name - self.client_caps = client_caps or NullClientCaps() - self._caps_cache = caps_cache or common.gajim.capscache + self.client_caps = client_caps or caps.NullClientCaps() # please read xep-85 http://www.xmpp.org/extensions/xep-0085.html # we keep track of xep85 support with the peer by three extra states: @@ -84,7 +84,7 @@ class CommonContact(object): def _client_supports(self, requested_feature): lookup_item = self.client_caps.get_cache_lookup_strategy() - cache_item = lookup_item(self._caps_cache) + cache_item = lookup_item(caps.capscache) supported_features = cache_item.features if requested_feature in supported_features: @@ -92,7 +92,7 @@ class CommonContact(object): elif supported_features == [] and cache_item.queried in (0, 1): # assume feature is supported, if we don't know yet, what the client # is capable of - return requested_feature not in FEATURE_BLACKLIST + return requested_feature not in caps.FEATURE_BLACKLIST else: return False @@ -100,13 +100,12 @@ class CommonContact(object): class Contact(CommonContact): '''Information concerning each contact''' def __init__(self, jid='', name='', groups=[], show='', status='', sub='', - ask='', resource='', priority=0, keyID='', client_caps=None, caps_cache=None, + ask='', resource='', priority=0, keyID='', client_caps=None, our_chatstate=None, chatstate=None, last_status_time=None, msg_id = None, composing_xep=None, mood={}, tune={}, activity={}): CommonContact.__init__(self, jid, resource, show, status, name, - our_chatstate, composing_xep, chatstate, client_caps=client_caps, - caps_cache=caps_cache) + our_chatstate, composing_xep, chatstate, client_caps=client_caps) self.contact_name = '' # nick choosen by contact self.groups = groups @@ -236,9 +235,8 @@ class Contacts: def create_contact(self, jid='', name='', groups=[], show='', status='', sub='', ask='', resource='', priority=0, keyID='', client_caps=None, - caps_cache=None, our_chatstate=None, - chatstate=None, last_status_time=None, composing_xep=None, - mood={}, tune={}, activity={}): + our_chatstate=None, chatstate=None, last_status_time=None, + composing_xep=None, mood={}, tune={}, activity={}): # We don't want duplicated group values groups_unique = [] @@ -248,18 +246,16 @@ class Contacts: return Contact(jid=jid, name=name, groups=groups_unique, show=show, status=status, sub=sub, ask=ask, resource=resource, priority=priority, - keyID=keyID, client_caps=client_caps, caps_cache=caps_cache, - our_chatstate=our_chatstate, chatstate=chatstate, - last_status_time=last_status_time, composing_xep=composing_xep, - mood=mood, tune=tune, activity=activity) + keyID=keyID, client_caps=client_caps, our_chatstate=our_chatstate, + chatstate=chatstate, last_status_time=last_status_time, + composing_xep=composing_xep, mood=mood, tune=tune, activity=activity) def copy_contact(self, contact): return self.create_contact(jid=contact.jid, name=contact.name, groups=contact.groups, show=contact.show, status=contact.status, sub=contact.sub, ask=contact.ask, resource=contact.resource, priority=contact.priority, keyID=contact.keyID, - client_caps=contact.client_caps, caps_cache=contact._caps_cache, - our_chatstate=contact.our_chatstate, + client_caps=contact.client_caps, our_chatstate=contact.our_chatstate, chatstate=contact.chatstate, last_status_time=contact.last_status_time) def add_contact(self, account, contact): @@ -629,8 +625,7 @@ class Contacts: jid = gc_contact.get_full_jid() return Contact(jid=jid, resource=gc_contact.resource, name=gc_contact.name, groups=[], show=gc_contact.show, - status=gc_contact.status, sub='none', client_caps=gc_contact.client_caps, - caps_cache=gc_contact._caps_cache) + status=gc_contact.status, sub='none', client_caps=gc_contact.client_caps) def create_gc_contact(self, room_jid='', name='', show='', status='', role='', affiliation='', jid='', resource=''): diff --git a/src/common/gajim.py b/src/common/gajim.py index d0f6c1d49..1d1f9cb9e 100644 --- a/src/common/gajim.py +++ b/src/common/gajim.py @@ -205,6 +205,9 @@ gajim_optional_features = {} # Capabilities hash per account caps_hash = {} +import caps +caps.initialize(logger) + def get_nick_from_jid(jid): pos = jid.find('@') return jid[:pos] diff --git a/src/gajim.py b/src/gajim.py index 5eb571592..31702b8eb 100644 --- a/src/gajim.py +++ b/src/gajim.py @@ -255,6 +255,7 @@ from common import optparser from common import dataforms from common import passwords from common import pep +from common import caps gajimpaths = common.configpaths.gajimpaths @@ -3536,6 +3537,12 @@ class Interface: gajim.caps_hash[a] = '' helpers.update_optional_features() + # prepopulate data which we are sure of; note: we do not log these info + for account in gajim.connections: + gajimcaps = caps.capscache[('sha-1', gajim.caps_hash[account])] + gajimcaps.identities = [gajim.gajim_identity] + gajimcaps.features = gajim.gajim_common_features + \ + gajim.gajim_optional_features[account] self.remote_ctrl = None diff --git a/test/test_caps.py b/test/test_caps.py index 35c4678de..4eeaf8711 100644 --- a/test/test_caps.py +++ b/test/test_caps.py @@ -9,7 +9,7 @@ lib.setup_env() from common import gajim from common import helpers from common.xmpp import NS_MUC, NS_PING, NS_XHTML_IM -from common.caps import CapsCache, ClientCaps, OldClientCaps +from common import caps from common.contacts import Contact from mock import Mock @@ -34,11 +34,8 @@ class CommonCapsTest(unittest.TestCase): ('old', self.node + '#' + self.caps_hash, self.identities, self.features)] self.logger = Mock(returnValues={"iter_caps_data":db_caps_cache}) - self.cc = CapsCache(self.logger) - # This is a temporary hack required by the way contacts rely on the - # existance of a cache. Hopefully this can be refactored to work via - # dependency injection - gajim.capscache = self.cc + self.cc = caps.CapsCache(self.logger) + caps.capscache = self.cc class TestCapsCache(CommonCapsTest): @@ -78,7 +75,7 @@ class TestCapsCache(CommonCapsTest): def test_preload_triggering_query(self): ''' Make sure that preload issues a disco ''' connection = Mock() - client_caps = ClientCaps(self.caps_hash, self.node, self.caps_method) + client_caps = caps.ClientCaps(self.caps_hash, self.node, self.caps_method) self.cc.query_client_of_jid_if_unknown(connection, "test@gajim.org", client_caps) @@ -88,7 +85,7 @@ class TestCapsCache(CommonCapsTest): def test_no_preload_query_if_cashed(self): ''' Preload must not send a query if the data is already cached ''' connection = Mock() - client_caps = ClientCaps(self.caps_hash, self.node, self.caps_method) + client_caps = caps.ClientCaps(self.caps_hash, self.node, self.caps_method) self.cc.initialize_from_db() self.cc.query_client_of_jid_if_unknown(connection, "test@gajim.org", @@ -106,7 +103,7 @@ class TestClientCaps(CommonCapsTest): def setUp(self): CommonCapsTest.setUp(self) - self.client_caps = ClientCaps(self.caps_hash, self.node, self.caps_method) + self.client_caps = caps.ClientCaps(self.caps_hash, self.node, self.caps_method) def test_query_by_get_discover_strategy(self): ''' Client must be queried if the data is unkown ''' @@ -118,7 +115,7 @@ class TestClientCaps(CommonCapsTest): "http://gajim.org#m3P2WeXPMGVH2tZPe7yITnfY0Dw=") def test_client_supports(self): - contact = Contact(caps_cache=self.cc, client_caps=self.client_caps) + contact = Contact(client_caps=self.client_caps) self.assertTrue(contact.supports(NS_PING), msg="Assume supported, if we don't have caps") @@ -142,7 +139,7 @@ class TestOldClientCaps(TestClientCaps): def setUp(self): TestClientCaps.setUp(self) - self.client_caps = OldClientCaps(self.caps_hash, self.node) + self.client_caps = caps.OldClientCaps(self.caps_hash, self.node) def test_query_by_get_discover_strategy(self): ''' Client must be queried if the data is unknown ''' diff --git a/test/test_contacts.py b/test/test_contacts.py index f75917cfb..401f35620 100644 --- a/test/test_contacts.py +++ b/test/test_contacts.py @@ -7,26 +7,27 @@ import lib lib.setup_env() from common.contacts import CommonContact, Contact, GC_Contact -from common.caps import NullClientCaps from common.xmpp import NS_MUC +from common import caps + class TestCommonContact(unittest.TestCase): def setUp(self): self.contact = CommonContact(jid='', resource='', show='', status='', name='', our_chatstate=None, composing_xep=None, chatstate=None, - client_caps=None, caps_cache=None) + client_caps=None) def test_default_client_supports(self): ''' Test the caps support method of contacts. See test_caps for more enhanced tests. ''' - + caps.capscache = caps.CapsCache() self.assertTrue(self.contact.supports(NS_MUC), msg="Must not backtrace on simple check for supported feature") - self.contact.client_caps = NullClientCaps() + self.contact.client_caps = caps.NullClientCaps() self.assertTrue(self.contact.supports(NS_MUC), msg="Must not backtrace on simple check for supported feature")