[sugar] [PATCH] services/presence/server_plugin.py: Handle presence more correctly.

Dan Williams dcbw
Sat May 19 11:51:03 EDT 2007


On Wed, 2007-05-16 at 11:40 +0100, Simon McVittie wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> This avoids unnecessary attempts to look up the buddy properties of
> channel-specific handles (which doesn't work) by only looking up the buddy
> properties of people we're subscribed to.
> Also, this approves subscription requests that come in while we're online,
> rather than handling them when we next go from offline to online.

Great, looks good.

> - ---
>  services/presence/server_plugin.py |   53 +++++++++++++++++++++++++++++++++---
>  1 files changed, 49 insertions(+), 4 deletions(-)
> 
> diff --git a/services/presence/server_plugin.py b/services/presence/server_plugin.py
> index b3b9482..ac569ba 100644
> - --- a/services/presence/server_plugin.py
> +++ b/services/presence/server_plugin.py
> @@ -320,11 +320,22 @@ class ServerPlugin(gobject.GObject):
>  
>          # the group of contacts who may receive your presence
>          publish = self._request_list_channel('publish')
> - -        publish_handles, local_pending, remote_pending = publish[CHANNEL_INTERFACE_GROUP].GetAllMembers()
> +        self._publish_channel = publish
> +        publish[CHANNEL_INTERFACE_GROUP].connect_to_signal('MembersChanged',
> +                self._publish_members_changed_cb)
> +        publish_handles, local_pending, remote_pending = \
> +                publish[CHANNEL_INTERFACE_GROUP].GetAllMembers()
>  
>          # the group of contacts for whom you wish to receive presence
>          subscribe = self._request_list_channel('subscribe')
> - -        subscribe_handles = subscribe[CHANNEL_INTERFACE_GROUP].GetMembers()
> +        self._subscribe_channel = subscribe
> +        subscribe[CHANNEL_INTERFACE_GROUP].connect_to_signal('MembersChanged',
> +                self._subscribe_members_changed_cb)
> +        subscribe_handles, subscribe_lp, subscribe_rp = \
> +                subscribe[CHANNEL_INTERFACE_GROUP].GetAllMembers()
> +        self._subscribe_members = set(subscribe_handles)
> +        self._subscribe_local_pending = set(subscribe_lp)
> +        self._subscribe_remote_pending = set(subscribe_rp)
>  
>          if local_pending:
>              # accept pending subscriptions
> @@ -364,8 +375,7 @@ class ServerPlugin(gobject.GObject):
>          self._set_self_current_activity()
>          self._set_self_avatar()
>  
> - -        # Request presence for everyone on the channel
> - -        subscribe_handles = subscribe[CHANNEL_INTERFACE_GROUP].GetMembers()
> +        # Request presence for everyone we're subscribed to
>          self._conn[CONN_INTERFACE_PRESENCE].RequestPresence(subscribe_handles)
>          return True
>  
> @@ -690,6 +700,13 @@ class ServerPlugin(gobject.GObject):
>  
>      def _contact_online(self, handle):
>          """Handle a contact coming online"""
> +        if (handle not in self._subscribe_members and
> +                handle not in self._subscribe_local_pending and
> +                handle not in self._subscribe_remote_pending):
> +            # it's probably a channel-specific handle - can't create a Buddy
> +            # object
> +            return
> +
>          self._online_contacts[handle] = None
>          if handle == self._conn[CONN_INTERFACE].GetSelfHandle():
>              jid = self._conn[CONN_INTERFACE].InspectHandles(CONNECTION_HANDLE_TYPE_CONTACT, [handle])[0]
> @@ -702,6 +719,34 @@ class ServerPlugin(gobject.GObject):
>              reply_handler=lambda *args: self._contact_online_properties_cb(handle, *args),
>              error_handler=lambda *args: self._contact_online_properties_error_cb(handle, *args))
>  
> +    def _subscribe_members_changed_cb(self, added, removed, local_pending,
> +            remote_pending, actor, reason):
> +        for handle in added:
> +            self._subscribe_members.add(handle)
> +        for handle in local_pending:
> +            self._subscribe_local_pending.add(handle)
> +        for handle in remote_pending:
> +            self._subscribe_remote_pending.add(handle)
> +        for handle in removed:
> +            self._subscribe_members.discard(handle)
> +            self._subscribe_local_pending.discard(handle)
> +            self._subscribe_remote_pending.discard(handle)
> +
> +    def _publish_members_changed_cb(self, added, removed, local_pending,
> +            remote_pending, actor, reason):
> +
> +        if local_pending:
> +            # accept all requested subscriptions
> +            self._publish_channel[CHANNEL_INTERFACE_GROUP].AddMembers(
> +                    local_pending, '')
> +
> +        # subscribe to people who've subscribed to us, if necessary
> +        added = list(set(added) - self._subscribe_members
> +                     - self._subscribe_remote_pending)
> +        if added:
> +            self._subscribe_channel[CHANNEL_INTERFACE_GROUP].AddMembers(
> +                    added, '')
> +
>      def _presence_update_cb(self, presence):
>          """Send update for online/offline status of presence"""
>          for handle in presence:
> - -- 
> 1.5.2-rc2.GIT
> 
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.6 (GNU/Linux)
> Comment: OpenPGP key: http://www.pseudorandom.co.uk/2003/contact/ or pgp.net
> 
> iD8DBQFGSt+PWSc8zVUw7HYRAmTjAJ4wT5vmv7wOLkNeXekAcee4H2eR/ACgh+I3
> wf36dxS4smqSWF1atTqgBQA=
> =D7w9
> -----END PGP SIGNATURE-----
> _______________________________________________
> Sugar mailing list
> Sugar at laptop.org
> http://mailman.laptop.org/mailman/listinfo/sugar




More information about the Sugar-devel mailing list