Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAleksey Lim <alsroot@member.fsf.org>2009-09-04 16:49:03 (GMT)
committer Daniel Drake <dsd@laptop.org>2009-12-01 18:03:39 (GMT)
commit576b62f84df7a326d536af2b41eaebd6730e0b84 (patch)
tree7ec71eec17c14f595cd3cc4149d48735b919a3d6 /src
parentc3d1ac5706f9f5dc5b4f5bc77b26d9878beebf66 (diff)
ObjectChooser displays USB media files, but fails to access file #1241
Diffstat (limited to 'src')
-rw-r--r--src/sugar/datastore/datastore.py46
1 files changed, 45 insertions, 1 deletions
diff --git a/src/sugar/datastore/datastore.py b/src/sugar/datastore/datastore.py
index 80d5936..8e8f361 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
@@ -136,10 +137,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')
metadata = dbus_helpers.get_properties(object_id)
+ if object_id.startswith('/'):
+ return RawObject(object_id)
+
ds_object = DSObject(object_id, DSMetadata(metadata), None)
# TODO: register the object for updates
return ds_object