1 # Copyright (C) 2008, Vincent Povirk for CodeWeavers
3 # This library is free software; you can redistribute it and/or
4 # modify it under the terms of the GNU Lesser General Public
5 # License as published by the Free Software Foundation; either
6 # version 2 of the License, or (at your option) any later version.
8 # This library is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 # Lesser General Public License for more details.
13 # You should have received a copy of the GNU Lesser General Public
14 # License along with this library; if not, write to the
15 # Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16 # Boston, MA 02111-1307, USA.
18 # Sugar's metadata does not typically provide a file extension, and the
19 # filename tends to be unusable. Windows depends on extensions so we need
20 # a conversion of metadata -> usable filenames.
22 from sugar
.activity
import activity
26 f
= open(os
.path
.join(activity
.get_bundle_path(), 'activity', 'wine.info'), 'U')
27 for line
in f
.readlines():
29 key
, value
= line
.rstrip('\n').split('=')
33 def guess_extension(metadata
):
34 #try wine.info settings
36 if key
.startswith('.'):
37 if metadata
['mime_type'] in settings
[key
].split(';'):
40 #then try python's standard library
42 guess
= mimetypes
.guess_extension(metadata
['mime_type'])
43 if guess
: return guess
45 #ok, maybe it's an application/x-extension- type?
46 if metadata
['mime_type'].startswith(['application/x-extension-']):
47 return '.%s' % metadata
['mime_type'][len('application/x-extension-'):]
49 #no? let's call it quits then
52 def guess_filename(metadata
):
53 def sanitize_filename(string
):
54 for character
in r
'\/:*?"<>|':
55 string
= string
.replace(character
, '_')
59 # trivial case: someone told us what filename to use
60 return sanitize_filename(metadata
['suggested_filename'])
62 ext
= guess_extension(metadata
)
64 # if there is a word that ends with the extension, use it
65 # this does the right thing for downloads in English, at least
66 for word
in metadata
['title'].split():
67 if word
.endswith(ext
):
68 return sanitize_filename(word
)
69 # otherwise, just use the title and extension
70 return '%s%s' % (sanitize_filename(metadata
['title']), ext
)
72 return sanitize_filename(metadata
['title'])
74 def create_dsobject_file(metadata
, tmpdir
=None):
78 tmpdir
= tempfile
.gettempdir()
80 filename
= guess_filename(metadata
)
83 path
= os
.path
.join(tmpdir
, filename
)
84 fd
= os
.open(path
, os
.O_RDWR|os
.O_CREAT|os
.O_EXCL
, 0770)
86 fd
, path
= tempfile
.mkstemp(suffix
=filename
, dir=tmpdir
)