[Sugar-devel] [PATCH sugar] Fix invitations from a non sugar client (empathy), part of OLPC #10814

Sascha Silbe sascha-ml-reply-to-2011-2 at silbe.org
Fri Apr 15 18:24:01 EDT 2011


Excerpts from Simon Schampijer's message of Thu Apr 14 19:42:35 +0200 2011:

[src/jarabe/model/invites.py]
> +class BaseInvite(object):
> +    """Invitation to shared activity or private 1-1 Telepathy channel"""
> +    def __init__(self, dispatch_operation_path, handle, handler):
>          self.dispatch_operation_path = dispatch_operation_path
>          self._handle = handle
>          self._handler = handler

I know this is from the old code, but can we rename self._handler to
self._handler_name? With the previous name I'd assume it's a callback.
Alternatively we could introduce a docstring that explains the
parameters.


> +    def _name_owner_changed_cb(self, name, old_owner, new_owner):
> +        logging.debug('BasicInvite._name_owner_changed_cb %r %r %r', name,
> +                      new_owner, old_owner)

s/BasicInvite/BaseInvite/ I suppose.

> +        if name == self._handler and new_owner and not old_owner:
> +            self._call_handle_with()
> +

> +    def _call_handle_with(self):

Both BaseInvite and Invites contain a method that calls HandleWith
(BaseInvite._call_handle_with() vs. Invites._handle_with()). They look
exactly the same to me. What's the difference? Do we need both?

It would be nice to at least give them the same name.


> +class ActivityInvite(BaseInvite):
> +    """Invitation to a shared activity."""
> +    def __init__(self, dispatch_operation_path, handle, handler,
> +                 activity_properties):
> +        BaseInvite.__init__(self, dispatch_operation_path, handle, handler)
> +
> +        if activity_properties is not None:
> +            self._activity_properties = activity_properties
> +        else:
> +            self._activity_properties = {}

How about:

        self._activity_properties = activity_properties or {}

Or can activity_properties contain a value that's evaluated as False,
but still semantically different from None / {}?


[class PrivateInvite]
> +    def get_color(self):
> +        client = gconf.client_get_default()
> +        return XoColor(client.get_string('/desktop/sugar/user/color'))

I wonder whether we should move the gconf code to XoColor and indicate
we want the owner color via some parameter. Not as part of this patch,
of course.


> +    def join(self):
> +        logging.error('PrivateInvite.join handler %r', self._handler)
> +
> +        registry = bundleregistry.get_registry()
> +        bundle_id = self.get_bundle_id()
> +        bundle = registry.get_bundle(bundle_id)
> +        if bundle is None:
> +            self._call_handle_with()

What exactly does the latter part do? Reject the invitation? Or pass it
on to a non-Sugar application?

>          else:
> -            logging.debug('__handle_with_reply_cb')
> +            bus = dbus.SessionBus()
> +            bus.add_signal_receiver(self._name_owner_changed_cb,
> +                                    'NameOwnerChanged',
> +                                    'org.freedesktop.DBus',
> +                                    arg0=self._handler)
> +            misc.launch(bundle, color=self.get_color(), invited=True,
> +                        uri=self._private_channel)

Making the "if bundle is None" check guarding style would get rid of one
level of indentation and one line continuation for the
add_signal_receiver, slightly improving code readability:

        if bundle is None:
            self._call_handle_with()
            return

        bus = dbus.SessionBus()
        bus.add_signal_receiver(self._name_owner_changed_cb,
                                'NameOwnerChanged', 'org.freedesktop.DBus',
                                arg0=self._handler)
        misc.launch(bundle, color=self.get_color(), invited=True,
                    uri=self._private_channel)


[Invites._dispatch_non_sugar_invitation()]
>          if channel_type == CHANNEL_TYPE_CONTACT_LIST:
>              self._handle_with(dispatch_operation_path, CLIENT + '.Sugar')
>          elif channel_type == CHANNEL_TYPE_TEXT:
>              handler = CLIENT + '.org.laptop.Chat'

We should make this configurable at some point, but not now (it would be
a feature, not a bug fix).


[src/jarabe/model/telepathyclient.py]
> @@ -63,13 +63,20 @@ class TelepathyClient(dbus.service.Object, DBusProperties):
>      def __get_filters_cb(self):
>          logging.debug('__get_filters_cb')
>  
> -        filt = {
> +        activity_invitation = {
>              CHANNEL + '.ChannelType': CHANNEL_TYPE_TEXT,
>              CHANNEL + '.TargetHandleType': CONNECTION_HANDLE_TYPE_ROOM,
>              }
> -        filter_dict = dbus.Dictionary(filt, signature='sv')
> +        filter_dict = dbus.Dictionary(activity_invitation, signature='sv')
>          filters = dbus.Array([filter_dict], signature='a{sv}')
>  
> +        text_invitation = {
> +            CHANNEL + '.ChannelType': CHANNEL_TYPE_TEXT,
> +            CHANNEL + '.TargetHandleType': CONNECTION_HANDLE_TYPE_CONTACT,
> +            }
> +        filter_dict = dbus.Dictionary(text_invitation, signature='sv')
> +        filters.append(filter_dict)
> +

Like above I'm wondering whether we need the explicit conversions:

    def __get_filters_cb(self):
        # We can handle Activity (ROOM) and plain text (CONTACT) invitations
        return [{CHANNEL + '.ChannelType': CHANNEL_TYPE_TEXT,
                 CHANNEL + '.TargetHandleType': CONNECTION_HANDLE_TYPE_ROOM},
                {CHANNEL + '.ChannelType': CHANNEL_TYPE_TEXT,
                 CHANNEL + '.TargetHandleType': CONNECTION_HANDLE_TYPE_CONTACT}]

Sascha

-- 
http://sascha.silbe.org/
http://www.infra-silbe.de/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 500 bytes
Desc: not available
URL: <http://lists.sugarlabs.org/archive/sugar-devel/attachments/20110416/673d3f56/attachment-0001.pgp>


More information about the Sugar-devel mailing list