6 import dbus.mainloop.glib
7 dbus.mainloop.glib.DBusGMainLoop(set_as_default = True)
12 DBUS_PROPERTIES = 'org.freedesktop.DBus.Properties'
16 reg = telepathy.client.ManagerRegistry()
21 def get_connection_manager(reg):
22 cm = reg.GetManager('theonering')
31 def queue_action(self):
34 def append_action(self, action):
35 assert self._action is None
39 if self._action is None:
41 self._action.queue_action()
43 def _on_error(self, error):
46 def _on_generic_message(self, *args):
50 class DummyAction(Action):
52 def queue_action(self):
53 gobject.idle_add(self._on_done)
56 class QuitLoop(Action):
58 def __init__(self, loop):
59 super(QuitLoop, self).__init__()
62 def queue_action(self):
66 class DisplayParams(Action):
68 def __init__(self, cm):
69 super(DisplayParams, self).__init__()
72 def queue_action(self):
73 self._cm[telepathy.interfaces.CONN_MGR_INTERFACE].GetParameters(
75 reply_handler = self._on_done,
76 error_handler = self._on_error,
79 def _on_done(self, params):
80 print "Connection Parameters:"
81 for name, flags, signature, default in params:
82 print "\t%s (%s)" % (name, signature),
84 if flags & telepathy.constants.CONN_MGR_PARAM_FLAG_REQUIRED:
86 if flags & telepathy.constants.CONN_MGR_PARAM_FLAG_REGISTER:
88 if flags & telepathy.constants.CONN_MGR_PARAM_FLAG_SECRET:
90 if flags & telepathy.constants.CONN_MGR_PARAM_FLAG_DBUS_PROPERTY:
91 print "dbus-property",
92 if flags & telepathy.constants.CONN_MGR_PARAM_FLAG_HAS_DEFAULT:
93 print "has-default(%s)" % default,
96 super(DisplayParams, self)._on_done()
99 class Connect(Action):
101 def __init__(self, cm, username, password, forward):
102 super(Connect, self).__init__()
106 self._serviceName = None
108 self._username = username
109 self._password = password
110 self._forward = forward
117 def serviceName(self):
118 return self._serviceName
120 def queue_action(self):
121 self._cm[telepathy.server.CONNECTION_MANAGER].RequestConnection(
124 'username': self._username,
125 'password': self._password,
126 'forward': self._forward,
128 reply_handler = self._on_connection_requested,
129 error_handler = self._on_error,
132 def _on_connection_requested(self, busName, objectPath):
133 self._serviceName = busName
134 self._conn = telepathy.client.Connection(busName, objectPath)
135 self._conn[telepathy.server.CONNECTION].connect_to_signal(
139 self._conn[telepathy.server.CONNECTION].Connect(
140 reply_handler = self._on_generic_message,
141 error_handler = self._on_error,
145 super(Connect, self)._on_done()
147 def _on_change(self, status, reason):
148 if status == telepathy.constants.CONNECTION_STATUS_DISCONNECTED:
149 print "Disconnected!"
151 elif status == telepathy.constants.CONNECTION_STATUS_CONNECTED:
154 elif status == telepathy.constants.CONNECTION_STATUS_CONNECTING:
157 print "Status: %r" % status
160 class SimplePresenceOptions(Action):
162 def __init__(self, connAction):
163 super(SimplePresenceOptions, self).__init__()
164 self._connAction = connAction
166 def queue_action(self):
167 self._connAction.conn[DBUS_PROPERTIES].Get(
168 telepathy.server.CONNECTION_INTERFACE_SIMPLE_PRESENCE,
170 reply_handler = self._on_done,
171 error_handler = self._on_error,
174 def _on_done(self, statuses):
175 print "\tAvailable Statuses"
176 for (key, value) in statuses.iteritems():
177 print "\t\t - %s" % key
178 super(SimplePresenceOptions, self)._on_done()
181 class NullHandle(object):
192 class UserHandle(Action):
194 def __init__(self, connAction):
195 super(UserHandle, self).__init__()
196 self._connAction = connAction
205 return [self._handle]
207 def queue_action(self):
208 self._connAction.conn[telepathy.server.CONNECTION].GetSelfHandle(
209 reply_handler = self._on_done,
210 error_handler = self._on_error,
213 def _on_done(self, handle):
214 self._handle = handle
215 super(UserHandle, self)._on_done()
218 class RequestHandle(Action):
220 def __init__(self, connAction, handleType, handleNames):
221 super(RequestHandle, self).__init__()
222 self._connAction = connAction
224 self._handleType = handleType
225 self._handleNames = handleNames
233 return [self._handle]
235 def queue_action(self):
236 self._connAction.conn[telepathy.server.CONNECTION].RequestHandles(
239 reply_handler = self._on_done,
240 error_handler = self._on_error,
243 def _on_done(self, handles):
244 self._handle = handles[0]
245 super(RequestHandle, self)._on_done()
248 class RequestChannel(Action):
250 def __init__(self, connAction, handleAction, channelType, handleType):
251 super(RequestChannel, self).__init__()
252 self._connAction = connAction
253 self._handleAction = handleAction
255 self._channelType = channelType
256 self._handleType = handleType
262 def queue_action(self):
263 self._connAction.conn[telepathy.server.CONNECTION].RequestChannel(
266 self._handleAction.handle,
268 reply_handler = self._on_done,
269 error_handler = self._on_error,
272 def _on_done(self, channelObjectPath):
273 self._channel = telepathy.client.Channel(self._connAction.serviceName, channelObjectPath)
274 super(RequestChannel, self)._on_done()
277 class ContactHandles(Action):
279 def __init__(self, connAction, chanAction):
280 super(ContactHandles, self).__init__()
281 self._connAction = connAction
282 self._chanAction = chanAction
289 def queue_action(self):
292 def _on_done(self, handle):
293 super(ContactHandles, self)._on_done()
296 class SimplePresenceStatus(Action):
298 def __init__(self, connAction, handleAction):
299 super(SimplePresenceStatus, self).__init__()
300 self._connAction = connAction
301 self._handleAction = handleAction
303 def queue_action(self):
304 self._connAction.conn[telepathy.server.CONNECTION_INTERFACE_SIMPLE_PRESENCE].GetPresences(
305 self._handleAction.handles,
306 reply_handler = self._on_done,
307 error_handler = self._on_error,
310 def _on_done(self, aliases):
312 for hid, (presenceType, presence, presenceMessage) in aliases.iteritems():
313 print "\t\t%s:" % hid, presenceType, presence, presenceMessage
314 super(SimplePresenceStatus, self)._on_done()
317 class Aliases(Action):
319 def __init__(self, connAction, handleAction):
320 super(Aliases, self).__init__()
321 self._connAction = connAction
322 self._handleAction = handleAction
324 def queue_action(self):
325 self._connAction.conn[telepathy.server.CONNECTION_INTERFACE_ALIASING].RequestAliases(
326 self._handleAction.handles,
327 reply_handler = self._on_done,
328 error_handler = self._on_error,
331 def _on_done(self, aliases):
333 for alias in aliases:
335 super(Aliases, self)._on_done()
340 def __init__(self, connAction, chanAction, handleAction):
341 super(Call, self).__init__()
342 self._connAction = connAction
343 self._chanAction = chanAction
344 self._handleAction = handleAction
346 def queue_action(self):
347 self._chanAction.channel[telepathy.server.CHANNEL_TYPE_STREAMED_MEDIA].RequestStreams(
348 self._handleAction.handle,
349 [telepathy.constants.MEDIA_STREAM_TYPE_AUDIO],
350 reply_handler = self._on_done,
351 error_handler = self._on_error,
354 def _on_done(self, handle):
356 super(Call, self)._on_done()
359 class Disconnect(Action):
361 def __init__(self, connAction):
362 super(Disconnect, self).__init__()
363 self._connAction = connAction
365 def queue_action(self):
366 self._connAction.conn[telepathy.server.CONNECTION].Disconnect(
367 reply_handler = self._on_done,
368 error_handler = self._on_error,
372 if __name__ == '__main__':
373 loop = gobject.MainLoop()
376 cm = get_connection_manager(reg)
378 nullHandle = NullHandle()
380 dummy = DummyAction()
385 dp = DisplayParams(cm)
386 lastAction.append_action(dp)
390 username = sys.argv[1]
391 password = sys.argv[2]
392 forward = sys.argv[3]
393 con = Connect(cm, username, password, forward)
394 lastAction.append_action(con)
398 spo = SimplePresenceOptions(con)
399 lastAction.append_action(spo)
404 lastAction.append_action(uh)
407 ua = Aliases(con, uh)
408 lastAction.append_action(ua)
411 sps = SimplePresenceStatus(con, uh)
412 lastAction.append_action(sps)
416 rclh = RequestHandle(con, telepathy.HANDLE_TYPE_LIST, ["subscribe"])
417 lastAction.append_action(rclh)
420 rclc = RequestChannel(
423 telepathy.CHANNEL_TYPE_CONTACT_LIST,
424 telepathy.HANDLE_TYPE_LIST,
426 lastAction.append_action(rclc)
429 # @todo get aliases for contacts
432 rch = RequestHandle(con, telepathy.HANDLE_TYPE_CONTACT, ["18005558355"]) #(1-800-555-TELL)
433 lastAction.append_action(rch)
438 smHandleType = telepathy.HANDLE_TYPE_CONTACT
440 smHandle = nullHandle
441 smHandleType = telepathy.HANDLE_TYPE_NONE
442 rsmc = RequestChannel(
445 telepathy.CHANNEL_TYPE_STREAMED_MEDIA,
448 lastAction.append_action(rsmc)
451 call = Call(con, rsmc, rch)
452 lastAction.append_action(call)
455 dis = Disconnect(con)
456 lastAction.append_action(dis)
459 quitter = QuitLoop(loop)
460 lastAction.append_action(quitter)
463 firstAction.queue_action()