diff options
author | Sascha Silbe <sascha@silbe.org> | 2009-07-17 20:09:40 (GMT) |
---|---|---|
committer | Sascha Silbe <sascha@silbe.org> | 2009-08-17 20:32:46 (GMT) |
commit | c1f4949d05fb60168085634f57416a43e769971f (patch) | |
tree | a8379a9bd6ead0eb156ba504140593a544b8f906 | |
parent | 2e780d624cd85ec239fc1974470eeccca010ea4a (diff) |
use sugar.datastore.datastore wherever possible instead of direct DBus interactions (cherry pick of a03bb625ace5af63601484c2183bbf7f234ecdd3)
-rw-r--r-- | src/sugar/activity/activityfactory.py | 5 | ||||
-rw-r--r-- | src/sugar/datastore/datastore.py | 65 | ||||
-rw-r--r-- | src/sugar/datastore/dbus_helpers.py | 3 |
3 files changed, 61 insertions, 12 deletions
diff --git a/src/sugar/activity/activityfactory.py b/src/sugar/activity/activityfactory.py index dcd840f..9916a59 100644 --- a/src/sugar/activity/activityfactory.py +++ b/src/sugar/activity/activityfactory.py @@ -30,6 +30,7 @@ from sugar.presence import presenceservice from sugar.activity.activityhandle import ActivityHandle from sugar import util from sugar import env +from sugar import datastore from errno import EEXIST, ENOSPC @@ -42,10 +43,6 @@ _SHELL_SERVICE = "org.laptop.Shell" _SHELL_PATH = "/org/laptop/Shell" _SHELL_IFACE = "org.laptop.Shell" -_DS_SERVICE = "org.laptop.sugar.DataStore" -_DS_INTERFACE = "org.laptop.sugar.DataStore" -_DS_PATH = "/org/laptop/sugar/DataStore" - _ACTIVITY_FACTORY_INTERFACE = "org.laptop.ActivityFactory" # helper method to close all filedescriptors diff --git a/src/sugar/datastore/datastore.py b/src/sugar/datastore/datastore.py index 80d5936..9a7a6bf 100644 --- a/src/sugar/datastore/datastore.py +++ b/src/sugar/datastore/datastore.py @@ -28,6 +28,7 @@ import gobject from sugar.datastore import dbus_helpers from sugar import mime +from sugar import dispatch class DSMetadata(gobject.GObject): __gsignals__ = { @@ -75,10 +76,12 @@ class DSMetadata(gobject.GObject): return DSMetadata(self._props.copy()) def get(self, key, default=None): - if self._props.has_key(key): - return self._props[key] - else: - return default + return self._props.get(key, default) + + def update(self, d) : + for (k,v) in d.items() : + self[k] = v + class DSObject(object): def __init__(self, object_id, metadata=None, file_path=None): @@ -90,7 +93,7 @@ class DSObject(object): def get_metadata(self): if self._metadata is None and not self.object_id is None: - metadata = DSMetadata(dbus_helpers.get_properties(self.object_id)) + metadata = DSMetadata(get_properties(self.object_id)) self._metadata = metadata return self._metadata @@ -137,7 +140,7 @@ class DSObject(object): return DSObject(None, self._metadata.copy(), self._file_path) def get(object_id): - logging.debug('datastore.get') + logging.debug('datastore.get %r', object_id) metadata = dbus_helpers.get_properties(object_id) ds_object = DSObject(object_id, DSMetadata(metadata), None) @@ -186,7 +189,7 @@ def write(ds_object, update_mtime=True, transfer_ownership=False, logging.debug('Written object %s to the datastore.' % ds_object.object_id) def delete(object_id): - logging.debug('datastore.delete') + logging.debug('datastore.delete %r', object_id) dbus_helpers.delete(object_id) def find(query, sorting=None, limit=None, offset=None, properties=None, @@ -252,3 +255,51 @@ def complete_indexing(): def get_unique_values(key): return dbus_helpers.get_unique_values(key) + + +class DatastoreListener(object): + + _sig_names = ['created', 'updated', 'deleted', 'stopped'] + + def __init__(self): + self._datastore = dbus_helpers._get_data_store() + self._signal_handlers = [ + self._datastore.connect_to_signal(sig_name[0].upper()+sig_name[1:], + getattr(self, "__datastore_%s_cb" % (sig_name,))) + for sig_name in self._sig_names] + for sig_name in self._sig_names : + setattr(self, sig_name, dispatch.Signal()) + + def __del__(self) : + try : + for handler in self._signal_handlers : + handler.remove() + except : + # ignore errors during garbage collection - the signal handlers might + # have already been collected + pass + + def __datastore_created_cb(self, tree_id, version_id): + metadata = get_metadata((tree_id, version_id)) + self.saved.send(self, metadata=metadata) + + def __datastore_updated_cb(self, tree_id, version_id): + metadata = get_metadata((tree_id, version_id)) + self.changedMetadata.send(self, metadata=metadata) + + def __datastore_deleted_cb(self, tree_id, version_id): + self.deleted.send(self, object_id=(tree_id, version_id)) + + def __datastore_stopped(self): + self.stopped.send(self) + + +_DATASTORE_LISTENER = None +def get_datastore_listener() : + global _DATASTORE_LISTENER + + if not _DATASTORE_LISTENER : + _DATASTORE_LISTENER = DatastoreListener() + + return _DATASTORE_LISTENER + diff --git a/src/sugar/datastore/dbus_helpers.py b/src/sugar/datastore/dbus_helpers.py index 9115382..e9e0dda 100644 --- a/src/sugar/datastore/dbus_helpers.py +++ b/src/sugar/datastore/dbus_helpers.py @@ -31,6 +31,7 @@ DS_DBUS_PATH = "/org/laptop/sugar/DataStore" _data_store = None +# also used by sugar.datastore.datastore def _get_data_store(): global _data_store @@ -77,7 +78,7 @@ def get_filename(uid): logging.debug('dbus_helpers.get_filename: %s, %s' % (uid, filename)) return filename -def find(query, properties, reply_handler, error_handler): +def find(query, properties, reply_handler=None, error_handler=None): logging.debug('dbus_helpers.find: %r %r' % (query, properties)) if reply_handler and error_handler: return _get_data_store().find(query, properties, |