Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS2
-rw-r--r--downloadmanager.py21
2 files changed, 21 insertions, 2 deletions
diff --git a/NEWS b/NEWS
index 43b0b1f..dc9e410 100644
--- a/NEWS
+++ b/NEWS
@@ -1,3 +1,5 @@
+* #3552: Cancel a donwload when the related journal entry is deleted. (tomeu)
+
62
* #2910 Open popups in the current window (marco)
diff --git a/downloadmanager.py b/downloadmanager.py
index dfc8a10..a190d75 100644
--- a/downloadmanager.py
+++ b/downloadmanager.py
@@ -24,6 +24,7 @@ from xpcom.nsError import *
from xpcom import components
from xpcom.components import interfaces
from xpcom.server.factory import Factory
+import dbus
from sugar.datastore import datastore
from sugar.clipboard import clipboardservice
@@ -38,6 +39,12 @@ if dbus.version >= (0, 82, 3):
else:
DBUS_PYTHON_TIMEOUT_UNITS_PER_SECOND = 1000
+NS_BINDING_ABORTED = 0x804b0002 # From nsNetError.h
+
+DS_DBUS_SERVICE = 'org.laptop.sugar.DataStore'
+DS_DBUS_INTERFACE = 'org.laptop.sugar.DataStore'
+DS_DBUS_PATH = '/org/laptop/sugar/DataStore'
+
_browser = None
_temp_path = '/tmp'
def init(browser, temp_path):
@@ -101,6 +108,7 @@ class Download:
self._cb_object_id = None
self._last_update_time = 0
self._last_update_percent = 0
+ self._cancelable = cancelable
return NS_OK
@@ -169,8 +177,6 @@ class Download:
self._last_update_percent = percent
if percent < 100:
- self._dl_jobject.metadata['title'] = _('Downloading %s from\n%s.') % \
- (file_name, self._source.spec)
self._dl_jobject.metadata['progress'] = str(percent)
datastore.write(self._dl_jobject)
@@ -196,6 +202,17 @@ class Download:
self._dl_jobject.file_path = ''
datastore.write(self._dl_jobject)
+ bus = dbus.SessionBus()
+ obj = bus.get_object(DS_DBUS_SERVICE, DS_DBUS_PATH)
+ datastore_dbus = dbus.Interface(obj, DS_DBUS_INTERFACE)
+ datastore_dbus.connect_to_signal('Deleted', self.__datastore_deleted_cb,
+ arg0=self._dl_jobject.object_id)
+
+ def __datastore_deleted_cb(self, uid):
+ logging.debug('Downloaded entry has been deleted from the datastore: %r' % uid)
+ # TODO: Use NS_BINDING_ABORTED instead of NS_ERROR_FAILURE.
+ self._cancelable.cancel(NS_ERROR_FAILURE) #NS_BINDING_ABORTED)
+
def _create_clipboard_object(self):
path, file_name = os.path.split(self._target_file.path)