[sugar] [PATCH] services/presence/server_plugin: implement _new_channel_cb asynchronously
Simon McVittie
simon.mcvittie
Thu May 24 07:44:55 EDT 2007
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
- ---
services/presence/server_plugin.py | 56 +++++++++++++++++++++++++++---------
1 files changed, 42 insertions(+), 14 deletions(-)
diff --git a/services/presence/server_plugin.py b/services/presence/server_plugin.py
index 49280e3..2871df8 100644
- --- a/services/presence/server_plugin.py
+++ b/services/presence/server_plugin.py
@@ -905,24 +905,52 @@ class ServerPlugin(gobject.GObject):
_logger.debug("Handle %s: current activity now %s" % (handle, activity))
self._buddy_properties_changed_cb(handle, prop)
- - def _new_channel_cb(self, object_path, channel_type, handle_type, handle, suppress_handler):
+ def _new_channel_cb(self, object_path, channel_type, handle_type, handle,
+ suppress_handler):
"""Handle creation of a new channel
"""
- - if handle_type == CONNECTION_HANDLE_TYPE_ROOM and channel_type == CHANNEL_TYPE_TEXT:
- - channel = Channel(self._conn._dbus_object._named_service, object_path)
+ if (handle_type == CONNECTION_HANDLE_TYPE_ROOM and
+ channel_type == CHANNEL_TYPE_TEXT):
+ def ready(channel):
- - # hack
- - channel._valid_interfaces.add(CHANNEL_INTERFACE_GROUP)
- -
- - current, local_pending, remote_pending = channel[CHANNEL_INTERFACE_GROUP].GetAllMembers()
- -
- - if local_pending:
- - for act_id, act_handle in self._activities.items():
+ for act_id, act_handle in self._activities.iteritems():
if handle == act_handle:
- - self.emit("activity-invitation", act_id)
- -
- - elif handle_type == CONNECTION_HANDLE_TYPE_CONTACT and \
- - channel_type in [CHANNEL_TYPE_TEXT, CHANNEL_TYPE_STREAMED_MEDIA]:
+ break
+ else:
+ return
+
+ def members_changed(message, added, removed, local_pending,
+ remote_pending, actor, reason):
+ # FIXME: if contacts were added, who don't have this
+ # activity in their PEP node for whatever reason, then
+ # emit buddy-activities-changed for them (otherwise they
+ # could be in an activity while pretending they weren't,
+ # which would be crazy)
+ pass
+
+ def got_all_members(current, local_pending, remote_pending):
+ if local_pending:
+ for act_id, act_handle in self._activities.iteritems():
+ if handle == act_handle:
+ self.emit('activity-invitation', act_id)
+ def got_all_members_err(e):
+ logger.debug('Unable to get channel members for %s:',
+ object_path, exc_info=1)
+
+ # hook the MembersChanged signal so we get told when people
+ # join/leave
+ group = channel[CHANNEL_INTERFACE_GROUP]
+ group.connect_to_signal('MembersChanged', members_changed)
+ group.GetAllMembers(reply_handler=got_all_members,
+ error_handler=got_all_members_err)
+
+ # we throw away the channel as soon as ready() finishes
+ Channel(self._conn.service_name, object_path,
+ ready_handler=ready)
+
+ elif (handle_type == CONNECTION_HANDLE_TYPE_CONTACT and
+ channel_type in (CHANNEL_TYPE_TEXT,
+ CHANNEL_TYPE_STREAMED_MEDIA)):
self.emit("private-invitation", object_path)
def update_activity_properties(self, act_id):
- --
1.5.2-rc3.GIT
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: OpenPGP key: http://www.pseudorandom.co.uk/2003/contact/ or pgp.net
iD8DBQFGVXq3WSc8zVUw7HYRAuSGAKC2exySPjDM1VQ+3g6/2LIsvCrPigCgvGWs
nCJ3O+BD29et0Rb5vaiMRko=
=kx/X
-----END PGP SIGNATURE-----
More information about the Sugar-devel
mailing list