import telepathy
+import tp
+import util.misc as misc_utils
-class MetaMemoize(type):
- """
- Allows a class to cache off instances for reuse
- """
- def __call__(cls, connection, *args):
- obj, newlyCreated = cls.__new__(cls, connection, *args)
- if newlyCreated:
- obj.__init__(connection, connection.get_handle_id(), *args)
- logging.info("New Handle %r" % obj)
- return obj
+_moduleLogger = logging.getLogger(__name__)
-class TheOneRingHandle(telepathy.server.Handle):
+class TheOneRingHandle(tp.Handle):
"""
Instances are memoized
"""
- __metaclass__ = MetaMemoize
-
- _instances = weakref.WeakValueDictionary()
-
- def __new__(cls, connection, *args):
- key = cls, connection.username, args
- if key in cls._instances.keys():
- return cls._instances[key], False
- else:
- instance = object.__new__(cls, connection, *args)
- cls._instances[key] = instance # TRICKY: instances is a weakdict
- return instance, True
-
def __init__(self, connection, id, handleType, name):
- telepathy.server.Handle.__init__(self, id, handleType, name)
+ tp.Handle.__init__(self, id, handleType, name)
self._conn = weakref.proxy(connection)
def __repr__(self):
type(self).__name__, self.id, self.name
)
- id = property(telepathy.server.Handle.get_id)
- type = property(telepathy.server.Handle.get_type)
- name = property(telepathy.server.Handle.get_name)
-
+ id = property(tp.Handle.get_id)
+ type = property(tp.Handle.get_type)
+ name = property(tp.Handle.get_name)
-class SelfHandle(TheOneRingHandle):
- instance = None
+class ConnectionHandle(TheOneRingHandle):
def __init__(self, connection, id):
handleType = telepathy.HANDLE_TYPE_CONTACT
self.profile = connection.username
-def field_join(fields):
- """
- >>> field_join("1", "First Name")
- '1#First Name'
- """
- return "#".join(fields)
-
-
-def field_split(fields):
- """
- >>> field_split('1#First Name')
- ['1', 'First Name']
- """
- return fields.split("#")
-
-
class ContactHandle(TheOneRingHandle):
- def __init__(self, connection, id, contactId, contactAccount):
+ def __init__(self, connection, id, phoneNumber):
+ self._phoneNumber = misc_utils.normalize_number(phoneNumber)
+
handleType = telepathy.HANDLE_TYPE_CONTACT
- handleName = field_join(contactId, contactAccount)
+ handleName = self._phoneNumber
TheOneRingHandle.__init__(self, connection, id, handleType, handleName)
- self.account = contactAccount
- self._id = contactId
-
@property
- def contact(self):
- return self._conn.gvoice_client.get_contact_details(self._id)
+ def phoneNumber(self):
+ return self._phoneNumber
class ListHandle(TheOneRingHandle):
TheOneRingHandle.__init__(self, connection, id, handleType, handleName)
-class GroupHandle(TheOneRingHandle):
-
- def __init__(self, connection, id, groupName):
- handleType = telepathy.HANDLE_TYPE_GROUP
- handleName = groupName
- TheOneRingHandle.__init__(self, connection, id, handleType, handleName)
-
-
_HANDLE_TYPE_MAPPING = {
- 'self': SelfHandle,
+ 'connection': ConnectionHandle,
'contact': ContactHandle,
'list': ListHandle,
- 'group': GroupHandle,
}
-def create_handle(connection, type, *args):
- handle = _HANDLE_TYPE_MAPPING[type](connection, *args)
- connection._handles[handle.get_type(), handle.get_id()] = handle
- return handle
+def create_handle_factory():
+
+ cache = weakref.WeakValueDictionary()
+
+ def _create_handle(connection, type, *args):
+ Handle = _HANDLE_TYPE_MAPPING[type]
+ key = Handle, connection.username, args
+ try:
+ handle = cache[key]
+ isNewHandle = False
+ except KeyError:
+ # The misnamed get_handle_id requests a new handle id
+ handle = Handle(connection, connection.get_handle_id(), *args)
+ cache[key] = handle
+ isNewHandle = True
+ connection._handles[handle.get_type(), handle.get_id()] = handle
+ if isNewHandle:
+ handleStatus = "Is New!" if isNewHandle else "From Cache"
+ _moduleLogger.debug("Created Handle: %r (%s)" % (handle, handleStatus))
+ return handle
+
+ return _create_handle
+
+
+create_handle = create_handle_factory()