Display error messages from failed downloads.
[zeroinstall.git] / gui.py
blob83ab7a5507715642118c9de8a16a36ed2599300b
1 from gpg import BadSignature
2 from policy import Policy
3 import download
4 import gtk, os
5 import sys
6 import dialog
8 # Singleton Policy
9 policy = None
11 class GUIPolicy(Policy):
12 window = None
13 n_downloads = 0
14 pulse = None
16 def __init__(self, interface, prog, prog_args):
17 Policy.__init__(self, interface)
18 global policy
19 assert policy is None
20 policy = self
22 import mainwindow
23 self.window = mainwindow.MainWindow(prog, prog_args)
24 self.window.browser.set_root(policy.get_interface(policy.root))
26 def monitor_download(self, dl):
27 error_stream = dl.start()
28 def error_ready(src, cond):
29 print src, "ready"
30 got = os.read(src.fileno(), 100)
31 if not got:
32 error_stream.close()
33 self.n_downloads -= 1
34 if self.n_downloads == 0:
35 self.window.progress.hide()
36 gtk.timeout_remove(self.pulse)
37 self.pulse = None
38 try:
39 data = dl.error_stream_closed()
40 self.check_signed_data(dl, data)
41 except download.DownloadError, ex:
42 dialog.alert(self.window,
43 "Error downloading interface '%s':\n%s" %
44 (dl.interface.uri, ex))
45 except BadSignature, ex:
46 dialog.alert(self.window,
47 "Error verifying downloaded interface '%s':\n%s" %
48 (dl.interface.uri, ex))
49 return False
50 dl.error_stream_data(got)
51 return True
53 gtk.input_add(error_stream, gtk.gdk.INPUT_READ, error_ready)
55 self.n_downloads += 1
56 if self.pulse is None:
57 progress = self.window.progress
58 self.pulse = gtk.timeout_add(50, lambda: progress.pulse() or True)
59 progress.show()
61 def main(self):
62 self.window.show()
63 gtk.main()