Fixing a bug where telepathy-theonering wasn't included in packages
[theonering] / src / connection_manager.py
1 """
2 Empathy Experience:
3         Can't call
4         When first started, reports all read conversations when some might have been read
5         When first started, reports all of an SMS conversation even though some has been reported previously
6         Still leaking one of two contact lists
7 """
8
9 import logging
10
11 import gobject
12 import telepathy
13
14 import constants
15 import gtk_toolbox
16 import connection
17
18
19 _moduleLogger = logging.getLogger("connection_manager")
20
21
22 class TheOneRingConnectionManager(telepathy.server.ConnectionManager):
23
24         def __init__(self, shutdown_func=None):
25                 telepathy.server.ConnectionManager.__init__(self, constants._telepathy_implementation_name_)
26
27                 # self._protos is from super
28                 self._protos[constants._telepathy_protocol_name_] = connection.TheOneRingConnection
29                 self._on_shutdown = shutdown_func
30                 _moduleLogger.info("Connection manager created")
31
32         @gtk_toolbox.log_exception(_moduleLogger)
33         def GetParameters(self, proto):
34                 """
35                 For org.freedesktop.telepathy.ConnectionManager
36
37                 @returns the mandatory and optional parameters for creating a connection
38                 """
39                 if proto not in self._protos:
40                         raise telepathy.errors.NotImplemented('unknown protocol %s' % proto)
41
42                 result = []
43                 ConnectionClass = self._protos[proto]
44                 mandatoryParameters = ConnectionClass._mandatory_parameters
45                 optionalParameters = ConnectionClass._optional_parameters
46                 defaultParameters = ConnectionClass._parameter_defaults
47
48                 for parameterName, parameterType in mandatoryParameters.iteritems():
49                         flags = telepathy.CONN_MGR_PARAM_FLAG_REQUIRED
50                         if parameterName == "password":
51                                 flags |= telepathy.CONN_MGR_PARAM_FLAG_SECRET
52                         param = (
53                                 parameterName,
54                                 flags,
55                                 parameterType,
56                                 '',
57                         )
58                         result.append(param)
59
60                 for parameterName, parameterType in optionalParameters.iteritems():
61                         if parameterName in defaultParameters:
62                                 flags = telepathy.CONN_MGR_PARAM_FLAG_HAS_DEFAULT
63                                 if parameterName == "password":
64                                         flags |= telepathy.CONN_MGR_PARAM_FLAG_SECRET
65                                 default = defaultParameters[parameterName]
66                         else:
67                                 flags = 0
68                                 default = ""
69                         param = (
70                                 parameterName,
71                                 flags,
72                                 parameterName,
73                                 default,
74                         )
75                         result.append(param)
76
77                 return result
78
79         def disconnected(self, conn):
80                 """
81                 Overrides telepathy.server.ConnectionManager
82                 """
83                 result = telepathy.server.ConnectionManager.disconnected(self, conn)
84                 gobject.timeout_add(5000, self._shutdown)
85
86         def quit(self):
87                 """
88                 Terminates all connections. Must be called upon quit
89                 """
90                 for connection in self._connections:
91                         connection.Disconnect()
92                 _moduleLogger.info("Connection manager quitting")
93
94         @gtk_toolbox.log_exception(_moduleLogger)
95         def _shutdown(self):
96                 if (
97                         self._on_shutdown is not None and
98                         len(self._connections) == 0
99                 ):
100                         self._on_shutdown()
101                 return False