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
14 class GUIPolicy(Policy
):
17 monitored_downloads
= None
19 def __init__(self
, interface
, prog_args
, download_only
, refresh
):
20 Policy
.__init
__(self
, interface
)
24 self
.monitored_downloads
= []
27 self
.window
= mainwindow
.MainWindow(prog_args
, download_only
)
28 self
.window
.browser
.set_root(policy
.get_interface(policy
.root
))
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)
41 self
.monitored_downloads
.remove(dl
)
42 if len(self
.monitored_downloads
) == 0:
43 self
.window
.progress
.hide()
44 gobject
.source_remove(self
.pulse
)
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
))
62 dl
.error_stream_data(got
)
65 gobject
.io_add_watch(error_stream
,
66 gobject
.IO_IN | gobject
.IO_HUP
,
69 if self
.pulse
is None:
70 progress
= self
.window
.progress
71 self
.pulse
= gobject
.timeout_add(50, lambda: progress
.pulse() or True)
74 def recalculate(self
):
75 Policy
.recalculate(self
)
80 print >>sys
.stderr
, "Your version of the injector is very old. " \
81 "Try upgrading (http://0install.net/injector.html)"
83 self
.window
.set_response_sensitive(gtk
.RESPONSE_OK
, self
.ready
)
85 def confirm_trust_keys(self
, interface
, sigs
, iface_xml
):
87 trust_box
.confirm_trust(interface
, sigs
, iface_xml
)
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
[:]:
106 def pretty_size(size
):
110 return '%d bytes' % size
112 for unit
in ('Kb', 'Mb', 'Gb', 'Tb'):
116 return '%.1f %s' % (size
, unit
)