services/presence/server_plugin: implement _new_channel_cb asynchronously

This commit is contained in:
Simon McVittie 2007-05-23 18:39:24 +01:00
parent 3444acae8f
commit 3c2bdfc346

View File

@ -905,24 +905,52 @@ class ServerPlugin(gobject.GObject):
_logger.debug("Handle %s: current activity now %s" % (handle, activity)) _logger.debug("Handle %s: current activity now %s" % (handle, activity))
self._buddy_properties_changed_cb(handle, prop) 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 """Handle creation of a new channel
""" """
if handle_type == CONNECTION_HANDLE_TYPE_ROOM and channel_type == CHANNEL_TYPE_TEXT: if (handle_type == CONNECTION_HANDLE_TYPE_ROOM and
channel = Channel(self._conn._dbus_object._named_service, object_path) channel_type == CHANNEL_TYPE_TEXT):
def ready(channel):
# hack for act_id, act_handle in self._activities.iteritems():
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():
if handle == act_handle: if handle == act_handle:
self.emit("activity-invitation", act_id) break
else:
return
elif handle_type == CONNECTION_HANDLE_TYPE_CONTACT and \ def members_changed(message, added, removed, local_pending,
channel_type in [CHANNEL_TYPE_TEXT, CHANNEL_TYPE_STREAMED_MEDIA]: 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) self.emit("private-invitation", object_path)
def update_activity_properties(self, act_id): def update_activity_properties(self, act_id):