Ticket #1197: 0001-use-sugar.datastore.-instead-of-direct-DBus-access.patch

File 0001-use-sugar.datastore.-instead-of-direct-DBus-access.patch, 8.4 KB (added by sascha_silbe, 15 years ago)

use sugar.datastore.* instead of direct DBus access (updated)

  • src/sugar/activity/activityfactory.py

    From d97ee793009b2ac9c94c11895eee23fc18be16ee Mon Sep 17 00:00:00 2001
    From: Sascha Silbe <sascha@silbe.org>
    Date: Wed, 19 Aug 2009 22:36:07 +0200
    Subject: [PATCH] use sugar.datastore.* instead of direct DBus access
    
    ---
     src/sugar/activity/activityfactory.py |   11 +---
     src/sugar/datastore/datastore.py      |  107 +++++++++++++++++++++++++++------
     src/sugar/datastore/dbus_helpers.py   |    3 +-
     3 files changed, 92 insertions(+), 29 deletions(-)
    
    diff --git a/src/sugar/activity/activityfactory.py b/src/sugar/activity/activityfactory.py
    index dcd840f..462a0f9 100644
    a b from sugar.presence import presenceservice 
    3030from sugar.activity.activityhandle import ActivityHandle
    3131from sugar import util
    3232from sugar import env
     33from sugar.datastore import datastore
    3334
    3435from errno import EEXIST, ENOSPC
    3536
    _SHELL_SERVICE = "org.laptop.Shell" 
    4243_SHELL_PATH = "/org/laptop/Shell"
    4344_SHELL_IFACE = "org.laptop.Shell"
    4445
    45 _DS_SERVICE = "org.laptop.sugar.DataStore"
    46 _DS_INTERFACE = "org.laptop.sugar.DataStore"
    47 _DS_PATH = "/org/laptop/sugar/DataStore"
    48 
    4946_ACTIVITY_FACTORY_INTERFACE = "org.laptop.ActivityFactory"
    5047
    5148# helper method to close all filedescriptors
    class ActivityCreationHandler(gobject.GObject): 
    210207        self._shell = dbus.Interface(bus_object, _SHELL_IFACE)
    211208
    212209        if handle.activity_id is not None and handle.object_id is None:
    213             datastore = dbus.Interface(
    214                     bus.get_object(_DS_SERVICE, _DS_PATH), _DS_INTERFACE)
    215210            datastore.find({'activity_id': self._handle.activity_id},
    216                            [],
    217211                           reply_handler=self._find_object_reply_handler,
    218                            error_handler=self._find_object_error_handler,
    219                            byte_arrays=True)
     212                           error_handler=self._find_object_error_handler)
    220213        else:
    221214            self._launch_activity()
    222215
  • src/sugar/datastore/datastore.py

    diff --git a/src/sugar/datastore/datastore.py b/src/sugar/datastore/datastore.py
    index 80d5936..e45367d 100644
    a b import gobject 
    2828
    2929from sugar.datastore import dbus_helpers
    3030from sugar import mime
     31from sugar import dispatch
    3132
    3233class DSMetadata(gobject.GObject):
    3334    __gsignals__ = {
    class DSMetadata(gobject.GObject): 
    4041        if not props:
    4142            self._props = {}
    4243        else:
    43             self._props = props
     44            self._props = dict(props)
    4445       
    4546        default_keys = ['activity', 'activity_id',
    4647                        'mime_type', 'title_set_by_user']
    class DSMetadata(gobject.GObject): 
    6768
    6869    def keys(self):
    6970        return self._props.keys()
    70    
     71
     72    def items(self):
     73        return self._props.items()
     74
    7175    def get_dictionary(self):
    7276        return self._props
    7377
    class DSMetadata(gobject.GObject): 
    7579        return DSMetadata(self._props.copy())
    7680
    7781    def get(self, key, default=None):
    78         if self._props.has_key(key):
    79             return self._props[key]
    80         else:
    81             return default
     82        return self._props.get(key, default)
     83
     84    def update(self, d):
     85        for (k, v) in d.items():
     86            self[k] = v
     87
    8288
    8389class DSObject(object):
    8490    def __init__(self, object_id, metadata=None, file_path=None):
    class DSObject(object): 
    9096
    9197    def get_metadata(self):
    9298        if self._metadata is None and not self.object_id is None:
    93             metadata = DSMetadata(dbus_helpers.get_properties(self.object_id))
     99            metadata = DSMetadata(get_properties(self.object_id))
    94100            self._metadata = metadata
    95101        return self._metadata
    96102   
    class DSObject(object): 
    137143        return DSObject(None, self._metadata.copy(), self._file_path)
    138144
    139145def get(object_id):
    140     logging.debug('datastore.get')
    141     metadata = dbus_helpers.get_properties(object_id)
     146    logging.debug('datastore.get %r', object_id)
     147    metadata = get_properties(object_id)
    142148
    143149    ds_object = DSObject(object_id, DSMetadata(metadata), None)
    144150    # TODO: register the object for updates
    def write(ds_object, update_mtime=True, transfer_ownership=False, 
    186192    logging.debug('Written object %s to the datastore.' % ds_object.object_id)
    187193
    188194def delete(object_id):
    189     logging.debug('datastore.delete')
     195    logging.debug('datastore.delete %r', object_id)
    190196    dbus_helpers.delete(object_id)
    191197
     198def get_properties(object_id):
     199    logging.debug('dbus_helpers.get_properties: %r', object_id)
     200    return dbus_helpers.get_properties(object_id)
     201
    192202def find(query, sorting=None, limit=None, offset=None, properties=None,
    193203         reply_handler=None, error_handler=None):
    194204
    def find(query, sorting=None, limit=None, offset=None, properties=None, 
    203213        query['limit'] = limit
    204214    if offset:
    205215        query['offset'] = offset
    206    
    207     props_list, total_count = dbus_helpers.find(query, properties,
    208                                                 reply_handler, error_handler)
    209    
     216
     217    if reply_handler and error_handler:
     218        f_reply_handler = (lambda entries, total_count:
     219            reply_handler(_metadata_to_dsobjects(entries), total_count))
     220
     221        return dbus_helpers.find(query, properties, f_reply_handler,
     222            error_handler)
     223
     224    entries, total_count = dbus_helpers.find(query, properties)
     225    return _metadata_to_dsobjects(entries), total_count
     226
     227def _metadata_to_dsobjects(entries) :
    210228    objects = []
    211     for props in props_list:
    212         object_id = props['uid']
    213         del props['uid']
     229    for properties in entries:
     230        object_id = properties['uid']
     231        del properties['uid']
    214232
    215         ds_object = DSObject(object_id, DSMetadata(props), None)
     233        ds_object = DSObject(object_id, DSMetadata(properties))
    216234        objects.append(ds_object)
    217235
    218     return objects, total_count
     236    return objects
    219237
    220238def copy(jobject, mount_point):
    221239
    def complete_indexing(): 
    252270
    253271def get_unique_values(key):
    254272    return dbus_helpers.get_unique_values(key)
     273
     274
     275class DatastoreListener(object):
     276
     277    _sig_names = ['created', 'updated', 'deleted', 'stopped']
     278
     279    def __init__(self):
     280        # pylint: disable-msg=W0212
     281        self._datastore = dbus_helpers._get_data_store()
     282        self._signal_handlers = [
     283            self._datastore.connect_to_signal(
     284                sig_name[0].upper() + sig_name[1:],
     285                getattr(self, "_datastore_%s_cb" % (sig_name, )))
     286            for sig_name in self._sig_names]
     287        for sig_name in self._sig_names:
     288            setattr(self, sig_name, dispatch.Signal())
     289
     290    def __del__(self):
     291        try :
     292            for handler in self._signal_handlers:
     293                handler.remove()
     294        # pylint: disable-msg=W0704
     295        except Exception:
     296            # Ignore errors during garbage collection - the signal handlers
     297            # might have already been collected.
     298            pass
     299
     300    def _datastore_created_cb(self, object_id):
     301        metadata = get_properties(object_id)
     302        self.created.send(self, metadata=metadata)
     303
     304    def _datastore_updated_cb(self, object_id):
     305        metadata = get_properties(object_id)
     306        self.updated.send(self, metadata=metadata)
     307
     308    def _datastore_deleted_cb(self, object_id):
     309        self.deleted.send(self, object_id=object_id)
     310
     311    def _datastore_stopped_cb(self):
     312        self.stopped.send(self)
     313
     314
     315_DATASTORE_LISTENER = None
     316def get_datastore_listener() :
     317    global _DATASTORE_LISTENER
     318
     319    if not _DATASTORE_LISTENER :
     320        _DATASTORE_LISTENER = DatastoreListener()
     321
     322    return _DATASTORE_LISTENER
     323
  • src/sugar/datastore/dbus_helpers.py

    diff --git a/src/sugar/datastore/dbus_helpers.py b/src/sugar/datastore/dbus_helpers.py
    index 9115382..e9e0dda 100644
    a b DS_DBUS_PATH = "/org/laptop/sugar/DataStore" 
    3131
    3232_data_store = None
    3333
     34# also used by sugar.datastore.datastore
    3435def _get_data_store():
    3536    global _data_store
    3637
    def get_filename(uid): 
    7778    logging.debug('dbus_helpers.get_filename: %s, %s' % (uid, filename))
    7879    return filename
    7980
    80 def find(query, properties, reply_handler, error_handler):
     81def find(query, properties, reply_handler=None, error_handler=None):
    8182    logging.debug('dbus_helpers.find: %r %r' % (query, properties))
    8283    if reply_handler and error_handler:
    8384        return _get_data_store().find(query, properties,