summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlorian Bruhin <git@the-compiler.org>2014-12-28 01:57:14 +0100
committerFlorian Bruhin <git@the-compiler.org>2014-12-28 01:57:14 +0100
commit60cc70151c1fea2cbc2050234ee72addc5cbf588 (patch)
treee5361cec33474a6410e70a6d49d423fbc06bee4e
parent3426d843bd411459e5821de80a7d95c20f01624e (diff)
parent6c6ae4e465f36db1f42206689c5b023249182a65 (diff)
downloadqutebrowser-60cc70151c1fea2cbc2050234ee72addc5cbf588.tar.gz
qutebrowser-60cc70151c1fea2cbc2050234ee72addc5cbf588.zip
Merge branch 'prevent_downloading_existing_file' of https://github.com/oed/qutebrowser into oed-prevent_downloading_existing_file
-rw-r--r--qutebrowser/browser/downloads.py44
1 files changed, 36 insertions, 8 deletions
diff --git a/qutebrowser/browser/downloads.py b/qutebrowser/browser/downloads.py
index 66154f6d7..079eabe3b 100644
--- a/qutebrowser/browser/downloads.py
+++ b/qutebrowser/browser/downloads.py
@@ -171,6 +171,7 @@ class DownloadItem(QObject):
_read_timer: A QTimer which reads the QNetworkReply into self._buffer
periodically.
_retry_info: A RetryInfo instance.
+ _win_id: The window ID the DownloadItem runs in.
Signals:
data_changed: The downloads metadata changed.
@@ -217,6 +218,7 @@ class DownloadItem(QObject):
self.fileobj = None
self._filename = None
self.init_reply(reply)
+ self._win_id = parent._win_id
def __repr__(self):
return utils.get_repr(self, basename=self.basename)
@@ -256,6 +258,27 @@ class DownloadItem(QObject):
name=self.basename, speed=speed, remaining=remaining,
perc=perc, down=down, total=total, errmsg=errmsg))
+ def _create_fileobj(self):
+ """Creates a file object using the internal filename."""
+ try:
+ fileobj = open(self._filename, 'wb')
+ except OSError as e:
+ self._die(e.strerror)
+ else:
+ self.set_fileobj(fileobj)
+
+ def _ask_overwrite_question(self):
+ """Create a Question object to be asked."""
+ q = usertypes.Question(self)
+ q.text = self._filename + " already exists. Overwrite? (y/n)"
+ q.mode = usertypes.PromptMode.yesno
+ q.answered_yes.connect(self._create_fileobj)
+ q.answered_no.connect(functools.partial(self.cancel, False))
+ q.cancelled.connect(functools.partial(self.cancel, False))
+ message_bridge = objreg.get('message-bridge', scope='window',
+ window=self._win_id)
+ message_bridge.ask(q, blocking=False)
+
def _die(self, msg):
"""Abort the download and emit an error."""
assert not self.successful
@@ -312,8 +335,12 @@ class DownloadItem(QObject):
return utils.interpolate_color(
start, stop, self.stats.percentage(), system)
- def cancel(self):
- """Cancel the download."""
+ def cancel(self, remove_data=True):
+ """Cancel the download.
+
+ Args:
+ remove_data: Whether to remove the downloaded data.
+ """
log.downloads.debug("cancelled")
self._read_timer.stop()
self.cancelled.emit()
@@ -325,7 +352,8 @@ class DownloadItem(QObject):
if self.fileobj is not None:
self.fileobj.close()
try:
- if self._filename is not None and os.path.exists(self._filename):
+ if (self._filename is not None and os.path.exists(self._filename)
+ and remove_data):
os.remove(self._filename)
except OSError:
log.downloads.exception("Failed to remove partial file")
@@ -376,12 +404,12 @@ class DownloadItem(QObject):
self._filename = os.path.join(download_dir, filename)
self.basename = filename
log.downloads.debug("Setting filename to {}".format(filename))
- try:
- fileobj = open(self._filename, 'wb')
- except OSError as e:
- self._die(e.strerror)
+ if os.path.isfile(self._filename):
+ # The file already exists, so ask the user if it should be
+ # overwritten.
+ self._ask_overwrite_question()
else:
- self.set_fileobj(fileobj)
+ self._create_fileobj()
def set_fileobj(self, fileobj):
""""Set the file object to write the download to.