services/presence/server_plugin: implement _new_channel_cb asynchronously
This commit is contained in:
parent
3444acae8f
commit
3c2bdfc346
@ -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):
|
||||||
|
Loading…
Reference in New Issue
Block a user