Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src/sugar/datastore
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@member.fsf.org>2009-09-04 16:49:03 (GMT)
committer Aleksey Lim <alsroot@member.fsf.org>2009-09-04 16:49:03 (GMT)
commitda678c6973c124c81f2365f93e0df6d3f93d995f (patch)
tree2afab36667c72444d6ea08ac30fedbe3e8712554 /src/sugar/datastore
parent49c9de8a82dafe10735a89636846ac3314e09d7c (diff)
ObjectChooser displays USB media files, but fails to access file #1241
Diffstat (limited to 'src/sugar/datastore')
-rw-r--r--src/sugar/datastore/datastore.py47
1 files changed, 46 insertions, 1 deletions
diff --git a/src/sugar/datastore/datastore.py b/src/sugar/datastore/datastore.py
index f001d76..81cda9c 100644
--- a/src/sugar/datastore/datastore.py
+++ b/src/sugar/datastore/datastore.py
@@ -23,9 +23,10 @@ import logging
import time
from datetime import datetime
import os
-
+import tempfile
import gobject
+from sugar import env
from sugar.datastore import dbus_helpers
from sugar import mime
@@ -138,9 +139,53 @@ class DSObject(object):
def copy(self):
return DSObject(None, self._metadata.copy(), self._file_path)
+class RawObject(object):
+
+ def __init__(self, file_path):
+ self.object_id = file_path
+ self._metadata = DSMetadata()
+ self._file_path = None
+ self._destroyed = False
+
+ def get_metadata(self):
+ return self._metadata
+
+ metadata = property(get_metadata)
+
+ def get_file_path(self, fetch=True):
+ # we have to create symlink since its a common practice
+ # to create hardlinks to jobject files
+ if self._file_path is None:
+ self._file_path = tempfile.mktemp(
+ prefix='rawobject',
+ dir=os.path.join(env.get_profile_path(), 'data'))
+ os.symlink(self.object_id, self._file_path)
+ return self._file_path
+
+ file_path = property(get_file_path)
+
+ def destroy(self):
+ if self._destroyed:
+ logging.warning('This RawObject has already been destroyed!.')
+ return
+ self._destroyed = True
+ if self._file_path is not None:
+ os.remove(self._file_path)
+ self._file_path = None
+
+ def __del__(self):
+ if not self._destroyed:
+ logging.warning('RawObject was deleted without cleaning up. '
+ 'Call RawObject.destroy() before disposing it.')
+ self.destroy()
+
def get(object_id):
logging.debug('datastore.get')
+
+ if object_id.startswith('/'):
+ return RawObject(object_id)
+
metadata = dbus_helpers.get_properties(object_id)
ds_object = DSObject(object_id, DSMetadata(metadata), None)