It checks for enough space (using Activity.enough_space) before downloading the file. If not, Browse will cancel the download process before starting it and an Alert will be shown to the user to inform this situation.
Signed-off-by: Manuel Kaufmann <humi...@gmail.com> --- downloadmanager.py | 63 +++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 48 insertions(+), 15 deletions(-) diff --git a/downloadmanager.py b/downloadmanager.py index 9950c16..5ad1a6f 100644 --- a/downloadmanager.py +++ b/downloadmanager.py @@ -74,16 +74,18 @@ class Download(object): self._stop_alert = None # figure out download URI - temp_path = os.path.join(activity.get_activity_root(), 'instance') - if not os.path.exists(temp_path): - os.makedirs(temp_path) + self.temp_path = os.path.join(activity.get_activity_root(), 'instance') + if not os.path.exists(self.temp_path): + os.makedirs(self.temp_path) - fd, self._dest_path = tempfile.mkstemp(dir=temp_path, + fd, self._dest_path = tempfile.mkstemp(dir=self.temp_path, suffix=download.get_suggested_filename(), prefix='tmp') os.close(fd) logging.debug('Download destination path: %s' % self._dest_path) + # We have to start the download to get 'total-size' + # property. It not, 0 is returned self._download.set_destination_uri('file://' + self._dest_path) self._download.start() @@ -95,17 +97,48 @@ class Download(object): def __state_change_cb(self, download, gparamspec): state = self._download.get_status() if state == WebKit.DownloadStatus.STARTED: - self._create_journal_object() - self._object_id = self.dl_jobject.object_id - - alert = TimeoutAlert(9) - alert.props.title = _('Download started') - alert.props.msg = _('%s' % self._download.get_suggested_filename()) - self._activity.add_alert(alert) - alert.connect('response', self.__start_response_cb) - alert.show() - global _active_downloads - _active_downloads.append(self) + # Check free space and cancel the download if there is not enough. + total_size = self._download.get_total_size() + logging.debug('Total size of the file: %s', total_size) + enough_space = self._activity.enough_space( + total_size, path=self.temp_path) + if not enough_space: + logging.debug('Download canceled because of Disk Space') + self.cancel() + + self._canceled_alert = Alert() + self._canceled_alert.props.title = _('Not enough space ' + 'to download') + + total_size_mb = total_size / 1024.0 ** 2 + free_space_mb = datastore.free_available_space( + path=self.temp_path) - datastore.SPACE_THRESHOLD \ + / 1024.0 ** 2 + filename = self._download.get_suggested_filename() + self._canceled_alert.props.msg = \ + _('Download "%s" requires %.2f MB of free space, only ' + '%.2f MB is available' % (filename, total_size_mb, + free_space_mb)) + ok_icon = Icon(icon_name='dialog-ok') + self._canceled_alert.add_button(Gtk.ResponseType.OK, + _('Ok'), ok_icon) + ok_icon.show() + self._canceled_alert.connect('response', + self.__stop_response_cb) + self._activity.add_alert(self._canceled_alert) + else: + self._create_journal_object() + self._object_id = self.dl_jobject.object_id + + alert = TimeoutAlert(9) + alert.props.title = _('Download started') + alert.props.msg = _('%s' % + self._download.get_suggested_filename()) + self._activity.add_alert(alert) + alert.connect('response', self.__start_response_cb) + alert.show() + global _active_downloads + _active_downloads.append(self) elif state == WebKit.DownloadStatus.FINISHED: self._stop_alert = Alert() -- 1.7.11.4 _______________________________________________ Sugar-devel mailing list Sugar-devel@lists.sugarlabs.org http://lists.sugarlabs.org/listinfo/sugar-devel