Moved refresh processing to gui.
[zeroinstall.git] / gui.py
blob524f271699506ac182122e0a487fa31d3c34ec00
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, refresh):
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 if refresh:
31 self.refresh_all(force = False)
33 def monitor_download(self, dl):
34 self.monitored_downloads.append(dl)
36 error_stream = dl.start()
37 def error_ready(src, cond):
38 got = os.read(src.fileno(), 100)
39 if not got:
40 error_stream.close()
41 self.monitored_downloads.remove(dl)
42 if len(self.monitored_downloads) == 0:
43 self.window.progress.hide()
44 gobject.source_remove(self.pulse)
45 self.pulse = None
46 try:
47 data = dl.error_stream_closed()
48 self.check_signed_data(dl, data)
49 except download.DownloadError, ex:
50 dialog.alert(self.window,
51 "Error downloading interface '%s':\n\n%s" %
52 (dl.interface.uri, ex))
53 except InvalidInterface, ex:
54 dialog.alert(self.window,
55 "Syntax error in downloaded interface '%s':\n\n%s" %
56 (dl.interface.uri, ex))
57 except SafeException, ex:
58 dialog.alert(self.window,
59 "Error updating interface '%s':\n\n%s" %
60 (dl.interface.uri, ex))
61 return False
62 dl.error_stream_data(got)
63 return True
65 gobject.io_add_watch(error_stream,
66 gobject.IO_IN | gobject.IO_HUP,
67 error_ready)
69 if self.pulse is None:
70 progress = self.window.progress
71 self.pulse = gobject.timeout_add(50, lambda: progress.pulse() or True)
72 progress.show()
74 def recalculate(self):
75 Policy.recalculate(self)
76 try:
77 self.ready
78 except:
79 self.ready = True
80 print >>sys.stderr, "Your version of the injector is very old. " \
81 "Try upgrading (http://0install.net/injector.html)"
82 else:
83 self.window.set_response_sensitive(gtk.RESPONSE_OK, self.ready)
85 def confirm_trust_keys(self, interface, sigs, iface_xml):
86 import trust_box
87 trust_box.confirm_trust(interface, sigs, iface_xml)
89 def main(self):
90 self.window.show()
91 gtk.main()
93 def get_best_source(self, impl):
94 """Return the best download source for this implementation."""
95 return impl.download_sources[0]
97 # XXX: Remove this. Moved to Policy.
98 def refresh_all(self, force = True):
99 for x in self.walk_interfaces():
100 self.begin_iface_download(x, force)
102 def abort_all_downloads(self):
103 for x in self.monitored_downloads[:]:
104 x.abort()
106 def pretty_size(size):
107 if size is None:
108 return '?'
109 if size < 2048:
110 return '%d bytes' % size
111 size = float(size)
112 for unit in ('Kb', 'Mb', 'Gb', 'Tb'):
113 size /= 1024
114 if size < 2048:
115 break
116 return '%.1f %s' % (size, unit)