<br><br><div class="gmail_quote">On Sat, May 21, 2011 at 10:24 AM, Sascha Silbe <span dir="ltr"><<a href="mailto:silbe@activitycentral.com">silbe@activitycentral.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
If downloads were cancelled, Browse could leave a (potentially large)<br>
temporary file behind. Now we delete them whenever they get cancelled<br>
(but not if Browse crashes).<br>
<br>
Based on patches by Rafael Ortiz <<a href="mailto:rafael@activitycentral.com">rafael@activitycentral.com</a>> and<br>
Sebastian Silva <<a href="mailto:sebastian@somosazucar.org">sebastian@somosazucar.org</a>>.<br>
<br>
Signed-off-by: Sascha Silbe <<a href="mailto:silbe@activitycentral.com">silbe@activitycentral.com</a>><br>
---<br>
 downloadmanager.py |  37 ++++++++++++++++++++++---------------<br>
 1 files changed, 22 insertions(+), 15 deletions(-)<br>
<br>
diff --git a/downloadmanager.py b/downloadmanager.py<br>
index 934693f..a88389f 100644<br>
--- a/downloadmanager.py<br>
+++ b/downloadmanager.py<br>
@@ -38,7 +38,6 @@ from sugar.graphics.alert import Alert, TimeoutAlert<br>
 from sugar.graphics.icon import Icon<br>
 from sugar.graphics import style<br>
 from sugar.activity import activity<br>
-<br>
 # #3903 - this constant can be removed and assumed to be 1 when dbus-python<br>
 # 0.82.3 is the only version used<br>
 import dbus<br>
@@ -69,9 +68,8 @@ def remove_all_downloads():<br>
  for download in _active_downloads:<br>
    download.cancelable.cancel(NS_ERROR_FAILURE)<br>
    if download.dl_jobject is not None:<br>
- Â Â Â Â Â Â download.datastore_deleted_handler.remove()<br>
      datastore.delete(download.dl_jobject.object_id)<br>
- Â Â Â Â Â Â download.cleanup_datastore_write()<br>
+ Â Â Â Â download.cleanup()<br>
<br>
<br>
 class HelperAppLauncherDialog:<br>
@@ -170,6 +168,7 @@ class Download:<br>
    elif state_flags & interfaces.nsIWebProgressListener.STATE_STOP:<br>
      if NS_FAILED(status):<br>
        # download cancelled<br>
+ Â Â Â Â Â Â Â Â self.cleanup()<br>
        return<br>
<br>
      self._stop_alert = Alert()<br>
@@ -252,14 +251,13 @@ class Download:<br>
    global _active_downloads<br>
    if response_id is gtk.RESPONSE_CANCEL:<br>
      logging.debug('Download Canceled')<br>
+ Â Â Â Â Â Â logging.debug('target_path=%r', self._target_file.path)<br>
      self.cancelable.cancel(NS_ERROR_FAILURE)<br>
      try:<br>
- Â Â Â Â Â Â Â Â self.datastore_deleted_handler.remove()<br>
        datastore.delete(self._object_id)<br>
      except Exception:<br>
        logging.exception('Object has been deleted already')<br>
- Â Â Â Â Â Â if self.dl_jobject is not None:<br>
- Â Â Â Â Â Â Â Â self.cleanup_datastore_write()<br>
+ Â Â Â Â Â Â self.cleanup()<br>
      if self._stop_alert is not None:<br>
        self._activity.remove_alert(self._stop_alert)<br>
<br>
@@ -272,21 +270,30 @@ class Download:<br>
      activity.show_object_in_journal(self._object_id)<br>
    self._activity.remove_alert(alert)<br>
<br>
- Â Â def cleanup_datastore_write(self):<br>
+ Â Â def cleanup(self):<br>
    global _active_downloads<br>
- Â Â Â Â _active_downloads.remove(self)<br>
+ Â Â Â Â if self in _active_downloads:<br>
+ Â Â Â Â Â Â _active_downloads.remove(self)<br>
<br>
- Â Â Â Â if os.path.isfile(self.dl_jobject.file_path):<br>
- Â Â Â Â Â Â os.remove(self.dl_jobject.file_path)<br>
- Â Â Â Â self.dl_jobject.destroy()<br>
- Â Â Â Â self.dl_jobject = None<br>
+ Â Â Â Â if self.datastore_deleted_handler is not None:<br>
+ Â Â Â Â Â Â self.datastore_deleted_handler.remove()<br>
+ Â Â Â Â Â Â self.datastore_deleted_handler = None<br>
+<br>
+ Â Â Â Â if os.path.isfile(self._target_file.path):<br>
+ Â Â Â Â Â Â os.remove(self._target_file.path)<br>
+ Â Â Â Â if os.path.isfile(self._target_file.path + '.part'):<br>
+ Â Â Â Â Â Â os.remove(self._target_file.path + '.part')<br>
+<br>
+ Â Â Â Â if self.dl_jobject is not None:<br>
+ Â Â Â Â Â Â self.dl_jobject.destroy()<br>
+ Â Â Â Â Â Â self.dl_jobject = None<br>
<br>
  def _internal_save_cb(self):<br>
- Â Â Â Â self.cleanup_datastore_write()<br>
+ Â Â Â Â self.cleanup()<br>
<br>
  def _internal_save_error_cb(self, err):<br>
    logging.error('Error saving activity object to datastore: %s', err)<br>
- Â Â Â Â self.cleanup_datastore_write()<br>
+ Â Â Â Â self.cleanup()<br>
<br>
  def onProgressChange64(self, web_progress, request, cur_self_progress,<br>
              max_self_progress, cur_total_progress,<br>
@@ -348,7 +355,7 @@ class Download:<br>
    if self in _active_downloads:<br>
      # TODO: Use NS_BINDING_ABORTED instead of NS_ERROR_FAILURE.<br>
      self.cancelable.cancel(NS_ERROR_FAILURE)<br>
- Â Â Â Â Â Â _active_downloads.remove(self)<br>
+ Â Â Â Â Â Â self.cleanup()<br>
<br>
<br>
 components.registrar.registerFactory('{23c51569-e9a1-4a92-adeb-3723db82ef7c}',<br>
<font color="#888888">--<br>
1.7.4.1<br>
<br></font></blockquote><div><br></div><div>Tested and works as expected, we still need to address the case when browse crashes.  </div></div><br><div>can you apply to mainline ?. </div><div><br></div>