From 789dbd97abde283c8ccdc5ba359c1bdd3fcc2268 Mon Sep 17 00:00:00 2001 From: Thomas Leonard Date: Sun, 20 Feb 2005 16:17:38 +0000 Subject: [PATCH] Updated GUI to handle background downloads. git-svn-id: file:///home/talex/Backups/sf.net/Subversion/zero-install/injector/head/injector-gui/head@59 9f8c893c-44ee-0310-b757-c8ca8341c71e --- gui.py | 48 ++++++++++++++++++++++++++++-------------------- properties.py | 3 +-- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/gui.py b/gui.py index 16f5f93..8e8e5dd 100644 --- a/gui.py +++ b/gui.py @@ -1,6 +1,8 @@ +from gpg import BadSignature from policy import Policy import download import gtk, os +import sys # Singleton Policy policy = None @@ -8,6 +10,7 @@ policy = None class GUIPolicy(Policy): window = None n_downloads = 0 + pulse = None def __init__(self, interface, prog, prog_args): Policy.__init__(self, interface) @@ -19,31 +22,36 @@ class GUIPolicy(Policy): self.window = mainwindow.MainWindow(prog, prog_args) self.window.browser.set_root(policy.get_interface(policy.root)) - def start_download(self, dl): - assert dl.status is download.download_starting - print "Start" + def monitor_download(self, dl): + error_stream = dl.start() + def error_ready(src, cond): + print src, "ready" + got = os.read(src.fileno(), 100) + if not got: + error_stream.close() + self.n_downloads -= 1 + if self.n_downloads == 0: + self.window.progress.hide() + gtk.timeout_remove(self.pulse) + self.pulse = None + data = dl.error_stream_closed() + try: + self.check_signed_data(dl, data) + except BadSignature, ex: + print >>sys.stderr, ex + return False + print "Errors: '%s'" % got + print "(from %s)" % dl.url + return True + + gtk.input_add(error_stream, gtk.gdk.INPUT_READ, error_ready) self.n_downloads += 1 - if self.n_downloads == 1: + if self.pulse is None: progress = self.window.progress - gtk.timeout_add(50, lambda: progress.pulse() or True) + self.pulse = gtk.timeout_add(50, lambda: progress.pulse() or True) progress.show() - #self.window.label.set_text('Fetching ' + dl.url) - - child = os.fork() - if child == 0: - try: - self.child_do_download(dl) - finally: - os._exit(1) - pid, status = os.waitpid(child, 0) - assert pid == child - - dl.status = download.download_failed def main(self): self.window.show() gtk.main() - - def child_do_download(self, dl): - print "Downloading", dl diff --git a/properties.py b/properties.py index 727bd0a..07181fb 100644 --- a/properties.py +++ b/properties.py @@ -39,8 +39,7 @@ class Properties(Dialog): if resp == gtk.RESPONSE_CANCEL: self.destroy() elif resp == 1: - policy.begin_iface_download(interface) - policy.recalculate() + policy.begin_iface_download(interface, True) elif resp == gtk.RESPONSE_HELP: properties_help.display() self.connect('response', response) -- 2.11.4.GIT