New release.
[zeroinstall.git] / gui.py
blobca9550e4ee63ec03063f2ff1483c991960352945
1 import gtk, os, gobject, sys
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 version = '0.7'
11 # Singleton Policy
12 policy = None
14 class GUIPolicy(Policy):
15 window = None
16 pulse = None
17 monitored_downloads = None
19 def __init__(self, interface, prog_args, download_only):
20 Policy.__init__(self, interface)
21 global policy
22 assert policy is None
23 policy = self
24 self.monitored_downloads = []
26 import mainwindow
27 self.window = mainwindow.MainWindow(prog_args, download_only)
28 self.window.browser.set_root(policy.get_interface(policy.root))
30 def monitor_download(self, dl):
31 self.monitored_downloads.append(dl)
33 error_stream = dl.start()
34 def error_ready(src, cond):
35 got = os.read(src.fileno(), 100)
36 if not got:
37 error_stream.close()
38 self.monitored_downloads.remove(dl)
39 if len(self.monitored_downloads) == 0:
40 self.window.progress.hide()
41 gobject.source_remove(self.pulse)
42 self.pulse = None
43 try:
44 data = dl.error_stream_closed()
45 self.check_signed_data(dl, data)
46 except download.DownloadError, ex:
47 dialog.alert(self.window,
48 "Error downloading interface '%s':\n\n%s" %
49 (dl.interface.uri, ex))
50 except InvalidInterface, ex:
51 dialog.alert(self.window,
52 "Syntax error in downloaded interface '%s':\n\n%s" %
53 (dl.interface.uri, ex))
54 except SafeException, ex:
55 dialog.alert(self.window,
56 "Error updating interface '%s':\n\n%s" %
57 (dl.interface.uri, ex))
58 return False
59 dl.error_stream_data(got)
60 return True
62 gobject.io_add_watch(error_stream,
63 gobject.IO_IN | gobject.IO_HUP,
64 error_ready)
66 if self.pulse is None:
67 progress = self.window.progress
68 self.pulse = gobject.timeout_add(50, lambda: progress.pulse() or True)
69 progress.show()
71 def recalculate(self):
72 Policy.recalculate(self)
73 try:
74 self.ready
75 except:
76 self.ready = True
77 print >>sys.stderr, "Your version of the injector is very old. " \
78 "Try upgrading (http://0install.net/injector.html)"
79 else:
80 self.window.set_response_sensitive(gtk.RESPONSE_OK, self.ready)
82 def confirm_trust_keys(self, interface, sigs, iface_xml):
83 import trust_box
84 trust_box.confirm_trust(interface, sigs, iface_xml)
86 def main(self):
87 self.window.show()
88 gtk.main()
90 def get_best_source(self, impl):
91 """Return the best download source for this implementation."""
92 return impl.download_sources[0]
94 # XXX: Remove this. Moved to Policy.
95 def refresh_all(self, force = True):
96 for x in self.walk_interfaces():
97 self.begin_iface_download(x, force)
99 def abort_all_downloads(self):
100 for x in self.monitored_downloads[:]:
101 x.abort()
103 def pretty_size(size):
104 if size is None:
105 return '?'
106 if size < 2048:
107 return '%d bytes' % size
108 size = float(size)
109 for unit in ('Kb', 'Mb', 'Gb', 'Tb'):
110 size /= 1024
111 if size < 2048:
112 break
113 return '%.1f %s' % (size, unit)