Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSascha Silbe <sascha@silbe.org>2009-07-17 20:09:40 (GMT)
committer Sascha Silbe <sascha@silbe.org>2009-08-17 20:32:46 (GMT)
commitc1f4949d05fb60168085634f57416a43e769971f (patch)
treea8379a9bd6ead0eb156ba504140593a544b8f906
parent2e780d624cd85ec239fc1974470eeccca010ea4a (diff)
use sugar.datastore.datastore wherever possible instead of direct DBus interactions (cherry pick of a03bb625ace5af63601484c2183bbf7f234ecdd3)
-rw-r--r--src/sugar/activity/activityfactory.py5
-rw-r--r--src/sugar/datastore/datastore.py65
-rw-r--r--src/sugar/datastore/dbus_helpers.py3
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,