X-Git-Url: http://git.maemo.org/git/?p=theonering;a=blobdiff_plain;f=src%2Fchannel_manager.py;h=592a59c5d48d2e138201dbc099356bdd7ee4b2f8;hp=1f017269bd583c39c2dbe6c41a6ce46aa69eb8b1;hb=cb4581c10a9da20fd08c48f57f051ba37b7e1e19;hpb=f289412744a4bc95f9b06beb2ed3a1fa5df4bfb1 diff --git a/src/channel_manager.py b/src/channel_manager.py index 1f01726..592a59c 100644 --- a/src/channel_manager.py +++ b/src/channel_manager.py @@ -3,101 +3,28 @@ import logging import dbus import telepathy +import tp import channel -import util.misc as util_misc +import util.misc as misc_utils -_moduleLogger = logging.getLogger("channel_manager") +_moduleLogger = logging.getLogger(__name__) -class TelepathyChannelManager(object): +class ChannelManager(tp.ChannelManager): def __init__(self, connection): - self._conn = connection + tp.ChannelManager.__init__(self, connection) - self._requestable_channel_classes = dict() - self._channels = dict() - self._fixed_properties = dict() - self._available_properties = dict() - - def close(self): - for channel_type in self._requestable_channel_classes: - for chan in self._channels[channel_type].values(): - try: - _moduleLogger.debug("Closing %s %s" % (channel_type, chan._object_path)) - chan.Close() - except Exception: - _moduleLogger.exception("Shutting down %r" % (chan, )) - - def remove_channel(self, chan): - for channel_type in self._requestable_channel_classes: - for handle, ichan in self._channels[channel_type].items(): - if chan == ichan: - del self._channels[channel_type][handle] - - def _get_type_requested_handle(self, props): - type = props[telepathy.interfaces.CHANNEL_INTERFACE + '.ChannelType'] - requested = props[telepathy.interfaces.CHANNEL_INTERFACE + '.Requested'] - target_handle = props[telepathy.interfaces.CHANNEL_INTERFACE + '.TargetHandle'] - target_handle_type = props[telepathy.interfaces.CHANNEL_INTERFACE + '.TargetHandleType'] - - handle = self._conn._handles[target_handle_type, target_handle] - - return (type, requested, handle) - - def channel_exists(self, props): - type, _, handle = self._get_type_requested_handle(props) - - if type in self._channels: - if handle in self._channels[type]: - return True - - return False - - def channel_for_props(self, props, signal=True, **args): - type, suppress_handler, handle = self._get_type_requested_handle(props) - - if type not in self._requestable_channel_classes: - raise NotImplemented('Unknown channel type "%s"' % type) - - if self.channel_exists(props): - return self._channels[type][handle] - - chan = self._requestable_channel_classes[type](props, **args) - - if hasattr(self._conn, "add_channels"): - # HACK Newer python-telepathy - self._conn.add_channels([chan], signal=signal) - elif hasattr(self._conn, "add_channel"): - # HACK Older python-telepathy - self._conn.add_channel(chan, handle, suppress_handler) - else: - raise RuntimeError("Uhh, what just happened with the connection") - self._channels[type][handle] = chan - - return chan - - def _implement_channel_class(self, type, make_channel, fixed, available): - self._requestable_channel_classes[type] = make_channel - self._channels.setdefault(type, {}) - - self._fixed_properties[type] = fixed - self._available_properties[type] = available - - def get_requestable_channel_classes(self): - retval = [] - - for channel_type in self._requestable_channel_classes: - retval.append((self._fixed_properties[channel_type], - self._available_properties[channel_type])) - - return retval - - -class ChannelManager(TelepathyChannelManager): - - def __init__(self, connection): - TelepathyChannelManager.__init__(self, connection) + fixed = { + telepathy.CHANNEL_INTERFACE + '.ChannelType': telepathy.CHANNEL_TYPE_CONTACT_LIST + } + self._implement_channel_class( + telepathy.CHANNEL_TYPE_CONTACT_LIST, + self._get_list_channel, + fixed, + [] + ) fixed = { telepathy.CHANNEL_INTERFACE + '.ChannelType': telepathy.CHANNEL_TYPE_TEXT, @@ -111,11 +38,12 @@ class ChannelManager(TelepathyChannelManager): ) fixed = { - telepathy.CHANNEL_INTERFACE + '.ChannelType': telepathy.CHANNEL_TYPE_CONTACT_LIST + telepathy.CHANNEL_INTERFACE + '.ChannelType': telepathy.CHANNEL_TYPE_FILE_TRANSFER, + telepathy.CHANNEL_INTERFACE + '.TargetHandleType': dbus.UInt32(telepathy.HANDLE_TYPE_CONTACT) } self._implement_channel_class( - telepathy.CHANNEL_TYPE_CONTACT_LIST, - self._get_list_channel, + telepathy.CHANNEL_TYPE_FILE_TRANSFER, + self._get_file_transfer_channel, fixed, [] ) @@ -141,7 +69,7 @@ class ChannelManager(TelepathyChannelManager): def _get_text_channel(self, props): _, surpress_handler, h = self._get_type_requested_handle(props) - accountNumber = util_misc.strip_number(self._conn.session.backend.get_account_number()) + 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) @@ -150,6 +78,13 @@ class ChannelManager(TelepathyChannelManager): chan = channel.text.TextChannel(self._conn, self, props, h) return chan + 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)