X-Git-Url: http://git.maemo.org/git/?p=theonering;a=blobdiff_plain;f=src%2Fchannel_manager.py;h=1f732e177b8efe76010300c189276e2ed60b27fc;hp=906744ae3a45d90f5a63cfe97365ce17cb9ec4b2;hb=422b35adb869e943ee019e1d45d24100dfa0d7e4;hpb=0b0ee151c524532cb0cbd7d1905e517c61f50d63 diff --git a/src/channel_manager.py b/src/channel_manager.py index 906744a..1f732e1 100644 --- a/src/channel_manager.py +++ b/src/channel_manager.py @@ -1,66 +1,124 @@ -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.Close() - 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.errors.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.errors.NotImplemented("Only Contacts are allowed") - _moduleLogger.debug("Requesting new text channel") - - chan = channel.text.TextChannel(self._connRef(), handle) - 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_CONTACT: - _moduleLogger.warning("Using deprecated means to create a call") - raise telepathy.errors.NotImplemented("Not implementing depcrecated means") - _moduleLogger.debug("Requesting new call channel") - - chan = channel.call.CallChannel(self._connRef(), handle) - 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