[Telepathy] telepathy-python: alternative approaches to client-side interface handling

Dafydd Harries dafydd.harries at collabora.co.uk
Tue Aug 14 01:20:08 PDT 2007


Currently, telepathy-python client objects subclass a class InterfaceFactory,
which overloads __contains__ and __getitem__, so that you can do, e.g.

  if telepathy.CONN_IFACE_ALIASING in conn:
     conn[telepathy.CONN_IFACE_ALIASING].DoSomething(...)

The difficulty is that knowing which interfaces an object has requires calling
GetInterfaces() on it, but we would like it to be possible to do this
asynchronously since blocking calls are problematic. The current solution is
to pass in a ready_handler parameter to the Connection/Channel constructors,
but I think this leads to ugly code:

  def channel_ready_cb(channel):
      print "channel ready"
      ...

  def new_channel_cb(object_path, channel_type, handle_type, handle,
          suppress_handler):
      ...
      Channel(conn.__service_name__, object_path,
          ready_handler=channel_ready_cb)

  conn.request_channel(..., ready_handler=channel_ready_cb)

An alternative approach would be to get rid of the idea of objects being
"ready", and to implicitly do any introspection in conjunction with method
calls. When you look up an interface on a client object:

 - if introspection has been done already, use the cached interface list
 - otherwise, return a pseudo-Interface object that will perform introspection
   when you call methods on it
 - if you call a method synchronously, introspection is performed
   synchronously
 - if you call a method asynchronously, introspection is performed
   asynchronously

Difficulties:

 - overlapping asynchronous method calls need special handling
 - __contains__ will no longer work before you've called a method, unless it
   performs synchronous introspection (perhaps a has_iface_async() method
   would be ok)

In many cases, __contains__ could be replaced with exceptions:

  try:
      conn[telepathy.CONN_IFACE_ALIASING].RequestAliases(...)
  except telepathy.InterfaceError:
      # fall back

However, I think this is a loss in code clarity.

Thoughts?

-- 
Dafydd


More information about the Telepathy mailing list