From 74f702fbf07930d02df199013bc6bd9d030db1f8 Mon Sep 17 00:00:00 2001
From: Aleksey Lim <alsroot@member.fsf.org>
Date: Wed, 2 Sep 2009 14:49:09 +0000
Subject: ObjectChooser displays USB media files, but fails to access file #1241
---
src/sugar/datastore/datastore.py | 47 +++++++++++++++++++++++++++++++++++++-
1 files changed, 46 insertions(+), 1 deletions(-)
diff --git a/src/sugar/datastore/datastore.py b/src/sugar/datastore/datastore.py
index f001d76..cc93e3d 100644
a
|
b
|
import logging |
23 | 23 | import time |
24 | 24 | from datetime import datetime |
25 | 25 | import os |
26 | | |
| 26 | import tempfile |
27 | 27 | import gobject |
28 | 28 | |
| 29 | from sugar import env |
29 | 30 | from sugar.datastore import dbus_helpers |
30 | 31 | from sugar import mime |
31 | 32 | |
… |
… |
class DSObject(object): |
138 | 139 | def copy(self): |
139 | 140 | return DSObject(None, self._metadata.copy(), self._file_path) |
140 | 141 | |
| 142 | class NonDSObject(object): |
| 143 | |
| 144 | def __init__(self, file_path): |
| 145 | self.object_id = file_path |
| 146 | self._metadata = DSMetadata() |
| 147 | self._file_path = None |
| 148 | self._destroyed = False |
| 149 | |
| 150 | def get_metadata(self): |
| 151 | return self._metadata |
| 152 | |
| 153 | metadata = property(get_metadata) |
| 154 | |
| 155 | def get_file_path(self, fetch=True): |
| 156 | # we have to create symlink since its a common practice |
| 157 | # to create hardlinks to jobject files |
| 158 | if self._file_path is None: |
| 159 | self._file_path = tempfile.mktemp( |
| 160 | prefix='nondsobject', |
| 161 | dir=os.path.join(env.get_profile_path(), 'data')) |
| 162 | os.symlink(self.object_id, self._file_path) |
| 163 | return self._file_path |
| 164 | |
| 165 | file_path = property(get_file_path) |
| 166 | |
| 167 | def destroy(self): |
| 168 | if self._destroyed: |
| 169 | logging.warning('This NonDSObject has already been destroyed!.') |
| 170 | return |
| 171 | self._destroyed = True |
| 172 | if self._file_path is not None: |
| 173 | os.remove(self._file_path) |
| 174 | self._file_path = None |
| 175 | |
| 176 | def __del__(self): |
| 177 | if not self._destroyed: |
| 178 | logging.warning('NonDSObject was deleted without cleaning up. ' |
| 179 | 'Call NonDSObject.destroy() before disposing it.') |
| 180 | self.destroy() |
| 181 | |
141 | 182 | |
142 | 183 | def get(object_id): |
143 | 184 | logging.debug('datastore.get') |
| 185 | |
| 186 | if object_id.startswith('/'): |
| 187 | return NonDSObject(object_id) |
| 188 | |
144 | 189 | metadata = dbus_helpers.get_properties(object_id) |
145 | 190 | |
146 | 191 | ds_object = DSObject(object_id, DSMetadata(metadata), None) |