Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTomeu Vizoso <tomeu@tomeuvizoso.net>2007-11-14 09:40:57 (GMT)
committer Tomeu Vizoso <tomeu@tomeuvizoso.net>2007-11-14 09:40:57 (GMT)
commita42f40d57542edf6d3220156598465ccaaf9987a (patch)
treeed7749d2142d8898d49c25cacd4eebc16a23a4ff
parent00c586b2cad080fd7efac0abbfb148378d78385b (diff)
#4784 Use valid FAT names when saving entries to usb sticks.
-rw-r--r--NEWS2
-rw-r--r--src/olpc/datastore/backingstore.py22
2 files changed, 15 insertions, 9 deletions
diff --git a/NEWS b/NEWS
index b609ad2..62e91e7 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,5 @@
+* #4784 Use valid FAT names when saving entries to usb sticks. (tomeu)
+
Snapshot 6d3d607ec7
* #4783 Try harder to guess the file extension. (tomeu)
diff --git a/src/olpc/datastore/backingstore.py b/src/olpc/datastore/backingstore.py
index 9021448..4177e05 100644
--- a/src/olpc/datastore/backingstore.py
+++ b/src/olpc/datastore/backingstore.py
@@ -787,9 +787,13 @@ class InplaceFileBackingStore(FileBackingStore):
completion(exc)
def _get_unique_filename(self, suggested_filename):
- filename = suggested_filename.replace('/', '_')
- filename = filename.replace(':', '_')
- filename = filename.replace('\n', '_')
+ # Invalid characters in VFAT filenames. From
+ # http://en.wikipedia.org/wiki/File_Allocation_Table
+ invalid_chars = ['/', '\\', ':', '*', '?', '"', '<', '>', '|', '\x7F']
+ invalid_chars.extend([chr(x) for x in range(0, 32)])
+ filename = suggested_filename
+ for char in invalid_chars:
+ filename = filename.replace(char, '_')
# FAT limit is 255, leave some space for uniqueness
max_len = 250
@@ -825,12 +829,12 @@ class InplaceFileBackingStore(FileBackingStore):
# files to these devices we need to detect this case and
# place the file
proposed_name = props.get('filename', None)
- if not proposed_name:
- suggested = props.get('suggested_filename', None)
- if suggested:
- proposed_name = self._get_unique_filename(suggested)
- if not proposed_name:
- proposed_name = os.path.split(filelike.name)[1]
+ if proposed_name is None:
+ proposed_name = props.get('suggested_filename', None)
+ if proposed_name is None:
+ proposed_name = os.path.split(filelike.name)[1]
+ proposed_name = self._get_unique_filename(proposed_name)
+
# record the name before qualifying it to the store
props['filename'] = proposed_name
proposed_name = os.path.join(self.uri, proposed_name)