From 047267003e5dae6efb4edcb07121fa146a1904c9 Mon Sep 17 00:00:00 2001 From: Tomeu Vizoso Date: Wed, 03 Sep 2008 17:06:31 +0000 Subject: #8256 Only put image in the clipboard when the image has been completely written --- diff --git a/palettes.py b/palettes.py index efab5fb..bae47a5 100644 --- a/palettes.py +++ b/palettes.py @@ -20,6 +20,7 @@ import urlparse from gettext import gettext as _ import gtk +import xpcom from xpcom import components from xpcom.components import interfaces @@ -134,7 +135,6 @@ class ImagePalette(Palette): Palette.__init__(self) self._url = url - self._temp_file = None self.props.primary_text = title self.props.secondary_text = url @@ -148,12 +148,6 @@ class ImagePalette(Palette): menu_item.show() def __copy_activate_cb(self, menu_item): - clipboard = gtk.Clipboard() - clipboard.set_with_data([('text/uri-list', 0, 0)], - self.__clipboard_get_func_cb, - self.__clipboard_clear_func_cb) - - def __clipboard_get_func_cb(self, clipboard, selection_data, info, data): file_name = os.path.basename(urlparse.urlparse(self._url).path) if '.' in file_name: base_name, extension = file_name.split('.') @@ -163,10 +157,10 @@ class ImagePalette(Palette): extension = '' temp_path = os.path.join(activity.get_activity_root(), 'instance') - fd, self._temp_file = tempfile.mkstemp(dir=temp_path, prefix=base_name, + fd, temp_file = tempfile.mkstemp(dir=temp_path, prefix=base_name, suffix=extension) os.close(fd) - os.chmod(self._temp_file, 0664) + os.chmod(temp_file, 0664) cls = components.classes['@mozilla.org/network/io-service;1'] io_service = cls.getService(interfaces.nsIIOService) @@ -174,17 +168,49 @@ class ImagePalette(Palette): cls = components.classes['@mozilla.org/file/local;1'] target_file = cls.createInstance(interfaces.nsILocalFile) - target_file.initWithPath(self._temp_file) + target_file.initWithPath(temp_file) cls = components.classes[ \ '@mozilla.org/embedding/browser/nsWebBrowserPersist;1'] persist = cls.createInstance(interfaces.nsIWebBrowserPersist) persist.persistFlags = 1 # PERSIST_FLAGS_FROM_CACHE + listener = xpcom.server.WrapObject(_ImageProgressListener(temp_file), + interfaces.nsIWebProgressListener) + persist.progressListener = listener persist.saveURI(uri, None, None, None, None, target_file) - selection_data.set_uris(['file://' + self._temp_file]) +class _ImageProgressListener(object): + _com_interfaces_ = interfaces.nsIWebProgressListener - def __clipboard_clear_func_cb(self, clipboard, data): - if os.path.exists(self._temp_file): - os.remove(self._temp_file) + def __init__(self, temp_file): + self._temp_file = temp_file + + def onLocationChange(self, webProgress, request, location): + pass + + def onProgressChange(self, webProgress, request, curSelfProgress, + maxSelfProgress, curTotalProgress, maxTotalProgress): + pass + + def onSecurityChange(self, webProgress, request, state): + pass + + def onStatusChange(self, webProgress, request, status, message): + pass + + def onStateChange(self, webProgress, request, stateFlags, status): + if stateFlags & interfaces.nsIWebProgressListener.STATE_IS_REQUEST and \ + stateFlags & interfaces.nsIWebProgressListener.STATE_STOP: + clipboard = gtk.Clipboard() + clipboard.set_with_data([('text/uri-list', 0, 0)], + _clipboard_get_func_cb, + _clipboard_clear_func_cb, + self._temp_file) + +def _clipboard_get_func_cb(clipboard, selection_data, info, temp_file): + selection_data.set_uris(['file://' + temp_file]) + +def _clipboard_clear_func_cb(clipboard, temp_file): + if os.path.exists(temp_file): + os.remove(temp_file) -- cgit v0.9.1