Imitiating buttfly in being explicitly typed
[theonering] / src / handle.py
index 022a093..0db35fe 100644 (file)
@@ -3,40 +3,20 @@ import weakref
 
 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):
@@ -44,14 +24,12 @@ class TheOneRingHandle(telepathy.server.Handle):
                        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
@@ -61,35 +39,18 @@ class SelfHandle(TheOneRingHandle):
                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):
@@ -100,23 +61,35 @@ 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()