X-Git-Url: http://git.maemo.org/git/?p=theonering;a=blobdiff_plain;f=src%2Fcapabilities.py;h=a64c38bb0456deff522d99714f1d4def464acc74;hp=c4a94cb3c208e39280ad0fade75ad70af68ea1d3;hb=8b82af9fd3b9e5346282f0d8e66ed16e036bbdfb;hpb=1bd375495719117939fa0ac384835001485eeef7 diff --git a/src/capabilities.py b/src/capabilities.py index c4a94cb..a64c38b 100644 --- a/src/capabilities.py +++ b/src/capabilities.py @@ -1,93 +1,105 @@ import logging +import dbus import telepathy -import gtk_toolbox - - -_moduleLogger = logging.getLogger('capabilities') - - -class CapabilitiesMixin(telepathy.server.ConnectionInterfaceCapabilities): +import tp +from tp._generated import Connection_Interface_Contact_Capabilities +import util.misc as misc_utils + + +_moduleLogger = logging.getLogger(__name__) + + +class CapabilitiesMixin( + tp.ConnectionInterfaceCapabilities, + Connection_Interface_Contact_Capabilities.ConnectionInterfaceContactCapabilities, +): + + _CAPABILITIES = { + telepathy.CHANNEL_TYPE_TEXT: ( + telepathy.CONNECTION_CAPABILITY_FLAG_CREATE, + 0, + ), + telepathy.CHANNEL_TYPE_STREAMED_MEDIA: ( + telepathy.CONNECTION_CAPABILITY_FLAG_CREATE | + telepathy.CONNECTION_CAPABILITY_FLAG_INVITE, + telepathy.CHANNEL_MEDIA_CAPABILITY_AUDIO, + ), + } + + text_chat_class = ( + { + 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', + ], + ) + + audio_chat_class = ( + { + 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', + ], + ) + + av_chat_class = ( + { + 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', + ], + ) def __init__(self): - telepathy.server.ConnectionInterfaceCapabilities.__init__(self) - self._implement_property_get( - telepathy.interfaces.CONN_INTERFACE_CAPABILITIES, - {"caps": self.GetCapabilities}, - ) - - @property - def session(self): - """ - @abstract - """ - raise NotImplementedError("Abstract property called") - - def handle(self, handleType, handleId): - """ - @abstract - """ - raise NotImplementedError("Abstract function called") + tp.ConnectionInterfaceCapabilities.__init__(self) + Connection_Interface_Contact_Capabilities.ConnectionInterfaceContactCapabilities.__init__(self) - def GetSelfHandle(self): + def get_handle_by_id(self, handleType, handleId): """ @abstract """ raise NotImplementedError("Abstract function called") - @gtk_toolbox.log_exception(_moduleLogger) + @misc_utils.log_exception(_moduleLogger) def GetCapabilities(self, handleIds): - """ - @todo HACK Remove this once we are building against a fixed version of python-telepathy - """ ret = [] for handleId in handleIds: - h = self.handle(telepathy.HANDLE_TYPE_CONTACT, handleId) if handleId != 0 and (telepathy.HANDLE_TYPE_CONTACT, handleId) not in self._handles: raise telepathy.errors.InvalidHandle - elif h in self._caps: - types = self._caps[h] - for type in types: - for ctype, specs in types.iteritems(): - ret.append([handleId, type, specs[0], specs[1]]) - else: - # No caps, so just default to the connection's caps - types = self._caps[self.GetSelfHandle()] - for type in types: - for ctype, specs in types.iteritems(): - ret.append([handleId, type, specs[0], specs[1]]) + + h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId) + for type, (gen, spec) in self._CAPABILITIES.iteritems(): + ret.append([handleId, type, gen, spec]) return ret - @gtk_toolbox.log_exception(_moduleLogger) - def AdvertiseCapabilities(self, add, remove): - """ - @todo HACK Remove this once we are building against a fixed version of python-telepathy - """ - my_caps = self._caps.setdefault(self.GetSelfHandle(), {}) - - changed = {} - for ctype, spec_caps in add: - changed[ctype] = spec_caps - for ctype in remove: - changed[ctype] = None - - caps = [] - for ctype, spec_caps in changed.iteritems(): - gen_old, spec_old = my_caps.get(ctype, (0, 0)) - if spec_caps is None: - # channel type no longer supported (provider has gone away) - gen_new, spec_new = 0, 0 - else: - # channel type supports new capabilities - gen_new, spec_new = gen_old, spec_old | spec_caps - if spec_old != spec_new or gen_old != gen_new: - caps.append((self.GetSelfHandle(), ctype, gen_old, gen_new, - spec_old, spec_new)) - - self.CapabilitiesChanged(caps) - _moduleLogger.info("CapsChanged %r" % self._caps) - - # return all my capabilities - ret = [(ctype, caps[1]) for ctype, caps in my_caps.iteritems()] + def GetContactCapabilities(self, handles): + if 0 in handles: + raise telepathy.InvalidHandle('Contact handle list contains zero') + + ret = dbus.Dictionary({}, signature='ua(a{sv}as)') + for i in handles: + handle = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, i) + contactCapabilities = dbus.Dictionary( + (self.text_chat_class, self.audio_chat_class), + signature="sv", + ) + ret[handle] = dbus.Array(contactCapabilities, signature='(a{sv}as)') + return ret + + def UpdateCapabilities(self, caps): + _moduleLogger.info("Ignoring updating contact capabilities")