Adding support for building .debs
[theonering] / src / handle.py
index 057ddf3..55f36fb 100644 (file)
@@ -7,37 +7,11 @@ import telepathy
 _moduleLogger = logging.getLogger("handle")
 
 
-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)
-                       _moduleLogger.info("New Handle %r" % obj)
-               return obj
-
-
 class TheOneRingHandle(telepathy.server.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)
                self._conn = weakref.proxy(connection)
@@ -54,8 +28,6 @@ class TheOneRingHandle(telepathy.server.Handle):
 
 class ConnectionHandle(TheOneRingHandle):
 
-       instance = None
-
        def __init__(self, connection, id):
                handleType = telepathy.HANDLE_TYPE_CONTACT
                handleName = connection.username
@@ -64,18 +36,54 @@ class ConnectionHandle(TheOneRingHandle):
                self.profile = connection.username
 
 
+def strip_number(prettynumber):
+       """
+       function to take a phone number and strip out all non-numeric
+       characters
+
+       >>> strip_number("+012-(345)-678-90")
+       '01234567890'
+       """
+       import re
+       uglynumber = re.sub('\D', '', prettynumber)
+       return uglynumber
+
+
 class ContactHandle(TheOneRingHandle):
 
-       def __init__(self, connection, id, contactId):
+       def __init__(self, connection, id, contactId, phoneNumber):
                handleType = telepathy.HANDLE_TYPE_CONTACT
-               handleName = contactId
+               handleName = self.to_handle_name(contactId, phoneNumber)
                TheOneRingHandle.__init__(self, connection, id, handleType, handleName)
 
-               self._id = contactId
+               self._contactId = contactId
+               self._phoneNumber = phoneNumber
+
+       @staticmethod
+       def from_handle_name(handleName):
+               parts = handleName.split("#", 1)
+               if len(parts) == 2:
+                       contactId, contactNumber = parts[0:2]
+               elif len(parts) == 1:
+                       contactId, contactNumber = "", handleName
+               else:
+                       raise RuntimeError("Invalid handle: %s" % handleName)
+
+               contactNumber = strip_number(contactNumber)
+               return contactId, contactNumber
+
+       @staticmethod
+       def to_handle_name(contactId, contactNumber):
+               handleName = "#".join((contactId, strip_number(contactNumber)))
+               return handleName
 
        @property
        def contactID(self):
-               return self._id
+               return self._contactId
+
+       @property
+       def phoneNumber(self):
+               return self._phoneNumber
 
        @property
        def contactDetails(self):
@@ -97,7 +105,27 @@ _HANDLE_TYPE_MAPPING = {
 }
 
 
-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
+               handleStatus = "Is New!" if isNewHandle else "From Cache"
+               _moduleLogger.info("Created Handle: %r (%s)" % (handle, handleStatus))
+               return handle
+
+       return create_handle
+
+
+create_handle = create_handle_factory()