Use iface_cache interface directly.
[zeroinstall.git] / gui.py
blobe0cf9166810b0976e8ab20031dde9ea5cb8f12d5
1 import gtk, os, gobject
3 from zeroinstall.injector.policy import Policy
4 from zeroinstall.injector import download
5 from zeroinstall.injector.model import SafeException
6 from zeroinstall.injector.reader import InvalidInterface
7 import dialog
9 # Singleton Policy
10 policy = None
12 class GUIPolicy(Policy):
13 window = None
14 n_downloads = 0
15 pulse = None
17 def __init__(self, interface, prog_args, download_only):
18 Policy.__init__(self, interface)
19 global policy
20 assert policy is None
21 policy = self
23 import mainwindow
24 self.window = mainwindow.MainWindow(prog_args, download_only)
25 self.window.browser.set_root(policy.get_interface(policy.root))
27 def monitor_download(self, dl):
28 error_stream = dl.start()
29 def error_ready(src, cond):
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 gobject.source_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\n%s" %
44 (dl.interface.uri, ex))
45 except InvalidInterface, ex:
46 dialog.alert(self.window,
47 "Syntax error in downloaded interface '%s':\n\n%s" %
48 (dl.interface.uri, ex))
49 except SafeException, ex:
50 dialog.alert(self.window,
51 "Error updating interface '%s':\n\n%s" %
52 (dl.interface.uri, ex))
53 return False
54 dl.error_stream_data(got)
55 return True
57 gobject.io_add_watch(error_stream,
58 gobject.IO_IN | gobject.IO_HUP,
59 error_ready)
61 self.n_downloads += 1
62 if self.pulse is None:
63 progress = self.window.progress
64 self.pulse = gobject.timeout_add(50, lambda: progress.pulse() or True)
65 progress.show()
67 def recalculate(self):
68 Policy.recalculate(self)
69 self.window.set_response_sensitive(gtk.RESPONSE_OK, self.ready)
71 def confirm_trust_keys(self, interface, sigs, iface_xml):
72 import trust_box
73 trust_box.confirm_trust(interface, sigs, iface_xml)
75 def main(self):
76 self.window.show()
77 gtk.main()
79 def get_best_source(self, impl):
80 """Return the best download source for this implementation."""
81 return impl.download_sources[0]
83 # XXX: Remove this. Moved to Policy.
84 def refresh_all(self, force = True):
85 for x in self.walk_interfaces():
86 self.begin_iface_download(x, force)
88 def pretty_size(size):
89 if size is None:
90 return '?'
91 if size < 2048:
92 return '%d bytes' % size
93 size = float(size)
94 for unit in ('Kb', 'Mb', 'Gb', 'Tb'):
95 size /= 1024
96 if size < 2048:
97 break
98 return '%.1f %s' % (size, unit)