Lengthening the auto disconnect
[theonering] / src / capabilities.py
1 import logging
2
3 import dbus
4 import telepathy
5
6 import tp
7 from tp._generated import Connection_Interface_Contact_Capabilities
8 import util.misc as misc_utils
9
10
11 _moduleLogger = logging.getLogger(__name__)
12
13
14 class CapabilitiesMixin(
15         tp.ConnectionInterfaceCapabilities,
16         Connection_Interface_Contact_Capabilities.ConnectionInterfaceContactCapabilities,
17 ):
18
19         _CAPABILITIES = {
20                 telepathy.CHANNEL_TYPE_TEXT: (
21                         telepathy.CONNECTION_CAPABILITY_FLAG_CREATE,
22                         0,
23                 ),
24                 telepathy.CHANNEL_TYPE_STREAMED_MEDIA: (
25                         telepathy.CONNECTION_CAPABILITY_FLAG_CREATE |
26                                 telepathy.CONNECTION_CAPABILITY_FLAG_INVITE,
27                         telepathy.CHANNEL_MEDIA_CAPABILITY_AUDIO,
28                 ),
29         }
30
31         text_chat_class = (
32                 {
33                         telepathy.CHANNEL_INTERFACE + '.ChannelType': telepathy.CHANNEL_TYPE_TEXT,
34                         telepathy.CHANNEL_INTERFACE + '.TargetHandleType': dbus.UInt32(telepathy.HANDLE_TYPE_CONTACT),
35                 },
36                 [
37                         telepathy.CHANNEL_INTERFACE + '.TargetHandle',
38                         telepathy.CHANNEL_INTERFACE + '.TargetID',
39                 ],
40         )
41
42         audio_chat_class = (
43                 {
44                         telepathy.CHANNEL_INTERFACE + '.ChannelType': telepathy.CHANNEL_TYPE_STREAMED_MEDIA,
45                         telepathy.CHANNEL_INTERFACE + '.TargetHandleType': dbus.UInt32(telepathy.HANDLE_TYPE_CONTACT),
46                 },
47                 [
48                         telepathy.CHANNEL_INTERFACE + '.TargetHandle',
49                         telepathy.CHANNEL_INTERFACE + '.TargetID',
50                         telepathy.CHANNEL_TYPE_STREAMED_MEDIA + '.InitialAudio',
51                 ],
52         )
53
54         av_chat_class = (
55                 {
56                         telepathy.CHANNEL_INTERFACE + '.ChannelType': telepathy.CHANNEL_TYPE_STREAMED_MEDIA,
57                         telepathy.CHANNEL_INTERFACE + '.TargetHandleType': dbus.UInt32(telepathy.HANDLE_TYPE_CONTACT),
58                 },
59                 [
60                         telepathy.CHANNEL_INTERFACE + '.TargetHandle',
61                         telepathy.CHANNEL_INTERFACE + '.TargetID',
62                         telepathy.CHANNEL_TYPE_STREAMED_MEDIA + '.InitialAudio',
63                         telepathy.CHANNEL_TYPE_STREAMED_MEDIA + '.InitialVideo',
64                 ],
65         )
66
67         def __init__(self):
68                 tp.ConnectionInterfaceCapabilities.__init__(self)
69                 Connection_Interface_Contact_Capabilities.ConnectionInterfaceContactCapabilities.__init__(self)
70
71         def get_handle_by_id(self, handleType, handleId):
72                 """
73                 @abstract
74                 """
75                 raise NotImplementedError("Abstract function called")
76
77         @misc_utils.log_exception(_moduleLogger)
78         def GetCapabilities(self, handleIds):
79                 ret = []
80                 for handleId in handleIds:
81                         if handleId != 0 and (telepathy.HANDLE_TYPE_CONTACT, handleId) not in self._handles:
82                                 raise telepathy.errors.InvalidHandle
83
84                         h = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, handleId)
85                         for type, (gen, spec) in self._CAPABILITIES.iteritems():
86                                 ret.append([handleId, type, gen, spec])
87                 return ret
88
89         def GetContactCapabilities(self, handles):
90                 if 0 in handles:
91                         raise telepathy.InvalidHandle('Contact handle list contains zero')
92
93                 ret = dbus.Dictionary({}, signature='ua(a{sv}as)')
94                 for i in handles:
95                         handle = self.get_handle_by_id(telepathy.HANDLE_TYPE_CONTACT, i)
96                         contactCapabilities = dbus.Dictionary(
97                                 (self.text_chat_class, self.audio_chat_class),
98                                 signature="sv",
99                         )
100                         ret[handle] = dbus.Array(contactCapabilities, signature='(a{sv}as)')
101
102                 return ret
103
104         def UpdateCapabilities(self, caps):
105                 _moduleLogger.info("Ignoring updating contact capabilities")