Removed extra 'head' dir.
[zeroinstall.git] / gui.py
blobd5c32c4b0318736960ae2580f8920ffb5971736c
1 from policy import Policy
2 import download
3 import gtk, os
4 import dialog
5 from reader import InvalidInterface
6 from model import SafeException
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_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_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 got = os.read(src.fileno(), 100)
30 if not got:
31 error_stream.close()
32 self.n_downloads -= 1
33 if self.n_downloads == 0:
34 self.window.progress.hide()
35 gtk.timeout_remove(self.pulse)
36 self.pulse = None
37 try:
38 data = dl.error_stream_closed()
39 self.check_signed_data(dl, data)
40 except download.DownloadError, ex:
41 dialog.alert(self.window,
42 "Error downloading interface '%s':\n\n%s" %
43 (dl.interface.uri, ex))
44 except InvalidInterface, ex:
45 dialog.alert(self.window,
46 "Syntax error in downloaded interface '%s':\n\n%s" %
47 (dl.interface.uri, ex))
48 except SafeException, ex:
49 dialog.alert(self.window,
50 "Error updating interface '%s':\n\n%s" %
51 (dl.interface.uri, ex))
52 return False
53 dl.error_stream_data(got)
54 return True
56 gtk.input_add(error_stream, gtk.gdk.INPUT_READ, error_ready)
58 self.n_downloads += 1
59 if self.pulse is None:
60 progress = self.window.progress
61 self.pulse = gtk.timeout_add(50, lambda: progress.pulse() or True)
62 progress.show()
64 def confirm_trust_keys(self, interface, sigs, iface_xml):
65 import trust_box
66 trust_box.trust_box.confirm_trust(interface, sigs, iface_xml)
68 def main(self):
69 self.window.show()
70 gtk.main()
72 def pretty_size(size):
73 if size is None:
74 return '?'
75 if size < 2048:
76 return '%d bytes' % size
77 size = float(size)
78 for unit in ('Kb', 'Mb', 'Gb', 'Tb'):
79 size /= 1024
80 if size < 2048:
81 break
82 return '%.1f %s' % (size, unit)