Ticket #1029: datauri_workaround.patch
File datauri_workaround.patch, 2.3 KB (added by lucian, 15 years ago) |
---|
-
downloadmanager.py
diff --git a/downloadmanager.py b/downloadmanager.py index 8402b81..329d3fc 100644
a b import time 22 22 import tempfile 23 23 import urlparse 24 24 import urllib 25 import re 26 import base64 25 27 26 28 import gtk 27 29 import hulahop … … components.registrar.registerFactory('{23c51569-e9a1-4a92-adeb-3723db82ef7c}', 296 298 297 299 def save_link(url, text, owner_document): 298 300 # Inspired on Firefox' browser/base/content/nsContextMenu.js:saveLink() 301 302 # HACK, workaround for ticket #1029 303 if url.startswith('data:'): 304 save_data_uri(url, text, owner_document) 305 return 299 306 300 307 cls = components.classes["@mozilla.org/network/io-service;1"] 301 308 io_service = cls.getService(interfaces.nsIIOService) … … def save_link(url, text, owner_document): 320 327 _SaveLinkProgressListener(owner_document), 321 328 interfaces.nsIStreamListener) 322 329 channel.asyncOpen(listener, None) 330 331 def save_data_uri(url, text, owner_document): 332 '''Special case, workaround for ticket #1029''' 333 pattern = re.compile(r''' 334 ^data: 335 (\w+/\w+)? # mimetype 336 (?:;charset="(\w+)")? # charset 337 (?:;(base64))? # encoding 338 ,(.+) # actual data 339 $ 340 ''', re.VERBOSE) 341 result = re.search(pattern, url).groups() 342 343 mime = result[0] or 'text/plain' 344 charset = result[1] or 'US-ASCII' 345 encoding = result[2] or 'base64' 346 data = base64.decodestring(result[3]) 347 348 temp_path = os.path.join(activity.get_activity_root(), 'instance') 349 if not os.path.exists(temp_path): 350 os.makedirs(temp_path) 351 fd, file_path = tempfile.mkstemp(dir=temp_path, prefix='datauri', 352 suffix='') 353 os.close(fd) 354 os.chmod(file_path, 0644) 355 356 # write data to file 357 open(file_path, 'w').write(data) 358 359 jobject = datastore.create() 360 jobject.metadata['title'] = 'datauri' 361 jobject.metadata['mime_type'] = mime 362 jobject.metadata['icon-color'] = profile.get_color().to_string() 363 jobject.file_path = file_path 364 datastore.write(jobject) 365 366 activity.show_object_in_journal(jobject.object_id) 323 367 324 368 def _implements_interface(obj, interface): 325 369 try: