2 # Takes a generator and a notification identifier as parameter,
3 # starts a thread, and post a notification whenever data arrives.
4 # Posts a completion notification when done.
5 # Terminates if generator fails or encounters an error.
8 from postoffice import postoffice
16 log = logging.getLogger(__name__)
18 class _Worker(threading.Thread):
19 def __init__(self, generator, owner):
20 threading.Thread.__init__(self)
22 self.generator = generator
25 def _post(self, item):
26 def idle_fetch(owner, item):
27 postoffice.notify("fetch", owner, item)
28 gobject.idle_add(idle_fetch, self.owner, item)
31 def idle_fetch_ok(owner):
32 postoffice.notify("fetch-ok", owner)
33 gobject.idle_add(idle_fetch_ok, self.owner)
35 def _post_fail(self, e):
36 def idle_fetch_fail(owner, e):
37 postoffice.notify("fetch-fail", owner, e)
38 gobject.idle_add(idle_fetch_fail, self.owner, e)
42 for item in self.generator():
45 except jamaendo.JamendoAPIException, e:
46 log.exception("Failed to fetch, id %s" % (self.owner))
49 class Fetcher(object):
50 def __init__(self, generator, owner, on_item = None, on_ok = None, on_fail = None):
51 self.generator = generator
55 self.on_item = on_item
57 self.on_fail = on_fail
59 def _on_item_cb(self, i, x):
62 def _on_ok_cb(self, i):
64 if isinstance(self.owner, gtk.Window):
65 hildon.hildon_gtk_window_set_progress_indicator(self.owner, 0)
67 def _on_fail_cb(self, i, e):
69 if isinstance(self.owner, gtk.Window):
70 hildon.hildon_gtk_window_set_progress_indicator(self.owner, 0)
73 postoffice.connect('fetch', self, self._on_item_cb)
74 postoffice.connect('fetch-ok', self, self._on_ok_cb)
75 postoffice.connect('fetch-fail', self, self._on_fail_cb)
76 if isinstance(self.owner, gtk.Window):
77 hildon.hildon_gtk_window_set_progress_indicator(self.owner, 1)
78 self.worker = _Worker(self.generator, self.owner)
82 postoffice.disconnect(['fetch', 'fetch-ok', 'fetch-fail'], self)