X-Git-Url: http://git.maemo.org/git/?a=blobdiff_plain;ds=sidebyside;f=src%2Fcapabilities.py;h=a64c38bb0456deff522d99714f1d4def464acc74;hb=8894c48314aa35230635af3f4ae8814234ae3fa1;hp=11a7f0cf93f8e73c0fc2cd846b17b02be70b0d44;hpb=e2364323eb7a509c815f6d022b70b37d9cea999d;p=theonering diff --git a/src/capabilities.py b/src/capabilities.py index 11a7f0c..a64c38b 100644 --- a/src/capabilities.py +++ b/src/capabilities.py @@ -1,29 +1,72 @@ import logging +import dbus import telepathy import tp -import gtk_toolbox - - -_moduleLogger = logging.getLogger('capabilities') - - -class CapabilitiesMixin(tp.ConnectionInterfaceCapabilities): +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): tp.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") + Connection_Interface_Contact_Capabilities.ConnectionInterfaceContactCapabilities.__init__(self) def get_handle_by_id(self, handleType, handleId): """ @@ -31,64 +74,32 @@ class CapabilitiesMixin(tp.ConnectionInterfaceCapabilities): """ raise NotImplementedError("Abstract function called") - def GetSelfHandle(self): - """ - @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.get_handle_by_id(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")