Imitiating buttfly in being explicitly typed
[theonering] / src / channel_manager.py
index c513b11..1f732e1 100644 (file)
-import weakref
 import logging
 
+import dbus
 import telepathy
 
+import tp
 import channel
+import util.misc as misc_utils
 
 
-_moduleLogger = logging.getLogger("channel_manager")
+_moduleLogger = logging.getLogger(__name__)
 
 
-class ChannelManager(object):
+class ChannelManager(tp.ChannelManager):
 
        def __init__(self, connection):
-               self._connRef = weakref.ref(connection)
-               self._listChannels = weakref.WeakValueDictionary()
-               self._textChannels = weakref.WeakValueDictionary()
-               self._callChannels = weakref.WeakValueDictionary()
-
-       def close(self):
-               for chan in self._listChannels.values():
-                       chan.remove_from_connection()# so that dbus lets it die.
-               for chan in self._textChannels.values():
-                       chan.Close()
-               for chan in self._callChannels.values():
-                       chan.Close()
-
-       def channel_for_list(self, handle, suppress_handler=False):
-               try:
-                       chan = self._listChannels[handle]
-               except KeyError, e:
-                       if handle.get_type() != telepathy.HANDLE_TYPE_LIST:
-                               raise telepathy.NotImplemented("Only server lists are allowed")
-                       _moduleLogger.debug("Requesting new contact list channel")
-
-                       chan = channel.contact_list.create_contact_list_channel(self._connRef(), handle)
-                       self._listChannels[handle] = chan
-                       self._connRef().add_channel(chan, handle, suppress_handler)
+               tp.ChannelManager.__init__(self, connection)
+
+               classes = [
+                       (
+                               {
+                                       telepathy.CHANNEL_INTERFACE + '.ChannelType': telepathy.CHANNEL_TYPE_CONTACT_LIST,
+                                       telepathy.CHANNEL_INTERFACE + '.TargetHandleType': dbus.UInt32(telepathy.HANDLE_TYPE_LIST),
+                               },
+                               [
+                                       telepathy.CHANNEL_INTERFACE + '.TargetHandle',
+                                       telepathy.CHANNEL_INTERFACE + '.TargetID',
+                               ],
+                       ),
+               ]
+               self.implement_channel_classes(
+                       telepathy.CHANNEL_TYPE_CONTACT_LIST,
+                       self._get_list_channel,
+                       classes,
+               )
+
+               classes = [
+                       (
+                               {
+                                       telepathy.CHANNEL_INTERFACE + '.ChannelType': telepathy.CHANNEL_TYPE_TEXT,
+                                       telepathy.CHANNEL_INTERFACE + '.TargetHandleType': dbus.UInt32(telepathy.HANDLE_TYPE_CONTACT)
+                               },
+                               [
+                                       telepathy.CHANNEL_INTERFACE + '.TargetHandle',
+                                       telepathy.CHANNEL_INTERFACE + '.TargetID',
+                               ],
+                       ),
+               ]
+               self.implement_channel_classes(
+                       telepathy.CHANNEL_TYPE_TEXT,
+                       self._get_text_channel,
+                       classes,
+               )
+
+               classes = [
+                       (
+                               {
+                                       telepathy.CHANNEL_INTERFACE + '.ChannelType': telepathy.CHANNEL_TYPE_FILE_TRANSFER,
+                                       telepathy.CHANNEL_INTERFACE + '.TargetHandleType': dbus.UInt32(telepathy.HANDLE_TYPE_CONTACT)
+                               },
+                               [
+                                       telepathy.CHANNEL_INTERFACE + '.TargetHandle',
+                                       telepathy.CHANNEL_INTERFACE + '.TargetID',
+                               ],
+                       ),
+               ]
+               self.implement_channel_classes(
+                       telepathy.CHANNEL_TYPE_FILE_TRANSFER,
+                       self._get_file_transfer_channel,
+                       classes,
+               )
+
+               classes = [
+                       (
+                               {
+                                       telepathy.CHANNEL_INTERFACE + '.ChannelType': telepathy.CHANNEL_TYPE_STREAMED_MEDIA,
+                                       telepathy.CHANNEL_INTERFACE + '.TargetHandleType': dbus.UInt32(telepathy.HANDLE_TYPE_CONTACT)
+                               },
+                               [
+                                       telepathy.CHANNEL_INTERFACE + '.TargetHandle',
+                                       telepathy.CHANNEL_INTERFACE + '.TargetID',
+                                       telepathy.CHANNEL_TYPE_STREAMED_MEDIA + '.InitialAudio',
+                                       telepathy.CHANNEL_TYPE_STREAMED_MEDIA + '.InitialVideo',
+                               ],
+                       ),
+               ]
+               self.implement_channel_classes(
+                       telepathy.CHANNEL_TYPE_STREAMED_MEDIA,
+                       self._get_media_channel,
+                       classes,
+               )
+
+       def _get_list_channel(self, props):
+               _, surpress_handler, h = self._get_type_requested_handle(props)
+
+               _moduleLogger.debug('New contact list channel')
+               chan = channel.contact_list.create_contact_list_channel(self._conn, self, props, h)
                return chan
 
-       def channel_for_text(self, handle, suppress_handler=False):
-               try:
-                       chan = self._textChannels[handle]
-               except KeyError, e:
-                       if handle.get_type() != telepathy.HANDLE_TYPE_CONTACT:
-                               raise telepathy.NotImplemented("Only Contacts are allowed")
-                       _moduleLogger.debug("Requesting new text channel")
-
-                       chan = channel.text.TextChannel(self._connRef(), None)
-                       self._textChannels[handle] = chan
-                       self._connRef().add_channel(chan, handle, suppress_handler)
+       def _get_text_channel(self, props):
+               _, surpress_handler, h = self._get_type_requested_handle(props)
+
+               accountNumber = misc_utils.normalize_number(self._conn.session.backend.get_account_number())
+               if h.phoneNumber == accountNumber:
+                       _moduleLogger.debug('New Debug channel')
+                       chan = channel.debug_prompt.DebugPromptChannel(self._conn, self, props, h)
+               else:
+                       _moduleLogger.debug('New text channel')
+                       chan = channel.text.TextChannel(self._conn, self, props, h)
                return chan
 
-       def channel_for_call(self, handle, suppress_handler=False):
-               try:
-                       chan = self._callChannels[handle]
-               except KeyError, e:
-                       if handle.get_type() != telepathy.HANDLE_TYPE_NONE:
-                               raise telepathy.NotImplemented("Using deprecated means to create a call")
-                       _moduleLogger.debug("Requesting new call channel")
-
-                       chan = channel.call.CallChannel(self._connRef())
-                       self._callChannels[handle] = chan
-                       self._connRef().add_channel(chan, handle, suppress_handler)
+       def _get_file_transfer_channel(self, props):
+               _, surpress_handler, h = self._get_type_requested_handle(props)
+
+               _moduleLogger.debug('New file transfer channel')
+               chan = channel.debug_log.DebugLogChannel(self._conn, self, props, h)
+               return chan
+
+       def _get_media_channel(self, props):
+               _, surpress_handler, h = self._get_type_requested_handle(props)
+
+               _moduleLogger.debug('New media channel')
+               chan = channel.call.CallChannel(self._conn, self, props, h)
                return chan