Ticket #1197: sugar-toolkit-0001-use-sugar.datastore.datastore-or-at-least-sugar.data.patch
File sugar-toolkit-0001-use-sugar.datastore.datastore-or-at-least-sugar.data.patch, 8.5 KB (added by sascha_silbe, 15 years ago) |
---|
-
src/sugar/activity/activityfactory.py
From 2ed5b136cddea3070faa5b28f3bd870ceeaf9d47 Mon Sep 17 00:00:00 2001 From: Sascha Silbe <sascha@silbe.org> Date: Tue, 18 Aug 2009 01:56:19 +0200 Subject: [PATCH] use sugar.datastore.datastore or at least sugar.datastore.dbus_helpers instead of direct DBus calls --- 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 30 30 from sugar.activity.activityhandle import ActivityHandle 31 31 from sugar import util 32 32 from sugar import env 33 from sugar.datastore import datastore 33 34 34 35 from errno import EEXIST, ENOSPC 35 36 … … _SHELL_SERVICE = "org.laptop.Shell" 42 43 _SHELL_PATH = "/org/laptop/Shell" 43 44 _SHELL_IFACE = "org.laptop.Shell" 44 45 45 _DS_SERVICE = "org.laptop.sugar.DataStore"46 _DS_INTERFACE = "org.laptop.sugar.DataStore"47 _DS_PATH = "/org/laptop/sugar/DataStore"48 49 46 _ACTIVITY_FACTORY_INTERFACE = "org.laptop.ActivityFactory" 50 47 51 48 # helper method to close all filedescriptors … … class ActivityCreationHandler(gobject.GObject): 210 207 self._shell = dbus.Interface(bus_object, _SHELL_IFACE) 211 208 212 209 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)215 210 datastore.find({'activity_id': self._handle.activity_id}, 216 [],217 211 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) 220 213 else: 221 214 self._launch_activity() 222 215 -
src/sugar/datastore/datastore.py
diff --git a/src/sugar/datastore/datastore.py b/src/sugar/datastore/datastore.py index 80d5936..26d9c49 100644
a b import gobject 28 28 29 29 from sugar.datastore import dbus_helpers 30 30 from sugar import mime 31 from sugar import dispatch 31 32 32 33 class DSMetadata(gobject.GObject): 33 34 __gsignals__ = { … … class DSMetadata(gobject.GObject): 40 41 if not props: 41 42 self._props = {} 42 43 else: 43 self._props = props44 self._props = dict(props) 44 45 45 46 default_keys = ['activity', 'activity_id', 46 47 'mime_type', 'title_set_by_user'] … … class DSMetadata(gobject.GObject): 67 68 68 69 def keys(self): 69 70 return self._props.keys() 70 71 72 def items(self): 73 return self._props.items() 74 71 75 def get_dictionary(self): 72 76 return self._props 73 77 … … class DSMetadata(gobject.GObject): 75 79 return DSMetadata(self._props.copy()) 76 80 77 81 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 82 88 83 89 class DSObject(object): 84 90 def __init__(self, object_id, metadata=None, file_path=None): … … class DSObject(object): 90 96 91 97 def get_metadata(self): 92 98 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)) 94 100 self._metadata = metadata 95 101 return self._metadata 96 102 … … class DSObject(object): 137 143 return DSObject(None, self._metadata.copy(), self._file_path) 138 144 139 145 def 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) 142 148 143 149 ds_object = DSObject(object_id, DSMetadata(metadata), None) 144 150 # TODO: register the object for updates … … def write(ds_object, update_mtime=True, transfer_ownership=False, 186 192 logging.debug('Written object %s to the datastore.' % ds_object.object_id) 187 193 188 194 def delete(object_id): 189 logging.debug('datastore.delete ')195 logging.debug('datastore.delete %r', object_id) 190 196 dbus_helpers.delete(object_id) 191 197 198 def get_properties(object_id): 199 logging.debug('dbus_helpers.get_properties: %r', object_id) 200 return dbus_helpers.get_properties(object_id) 201 192 202 def find(query, sorting=None, limit=None, offset=None, properties=None, 193 203 reply_handler=None, error_handler=None): 194 204 … … def find(query, sorting=None, limit=None, offset=None, properties=None, 203 213 query['limit'] = limit 204 214 if offset: 205 215 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 227 def _metadata_to_dsobjects(entries) : 210 228 objects = [] 211 for prop s in props_list:212 object_id = prop s['uid']213 del prop s['uid']229 for properties in entries: 230 object_id = properties['uid'] 231 del properties['uid'] 214 232 215 ds_object = DSObject(object_id, DSMetadata(prop s), None)233 ds_object = DSObject(object_id, DSMetadata(properties)) 216 234 objects.append(ds_object) 217 235 218 return objects , total_count236 return objects 219 237 220 238 def copy(jobject, mount_point): 221 239 … … def complete_indexing(): 252 270 253 271 def get_unique_values(key): 254 272 return dbus_helpers.get_unique_values(key) 273 274 275 class 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) 310 311 def _datastore_stopped_cb(self): 312 self.stopped.send(self) 313 314 315 _DATASTORE_LISTENER = None 316 def 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" 31 31 32 32 _data_store = None 33 33 34 # also used by sugar.datastore.datastore 34 35 def _get_data_store(): 35 36 global _data_store 36 37 … … def get_filename(uid): 77 78 logging.debug('dbus_helpers.get_filename: %s, %s' % (uid, filename)) 78 79 return filename 79 80 80 def find(query, properties, reply_handler , error_handler):81 def find(query, properties, reply_handler=None, error_handler=None): 81 82 logging.debug('dbus_helpers.find: %r %r' % (query, properties)) 82 83 if reply_handler and error_handler: 83 84 return _get_data_store().find(query, properties,