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
):
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
))
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)
38 self
.monitored_downloads
.remove(dl
)
39 if len(self
.monitored_downloads
) == 0:
40 self
.window
.progress
.hide()
41 gobject
.source_remove(self
.pulse
)
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
))
59 dl
.error_stream_data(got
)
62 gobject
.io_add_watch(error_stream
,
63 gobject
.IO_IN | gobject
.IO_HUP
,
66 if self
.pulse
is None:
67 progress
= self
.window
.progress
68 self
.pulse
= gobject
.timeout_add(50, lambda: progress
.pulse() or True)
71 def recalculate(self
):
72 Policy
.recalculate(self
)
77 print >>sys
.stderr
, "Your version of the injector is very old. " \
78 "Try upgrading (http://0install.net/injector.html)"
80 self
.window
.set_response_sensitive(gtk
.RESPONSE_OK
, self
.ready
)
82 def confirm_trust_keys(self
, interface
, sigs
, iface_xml
):
84 trust_box
.confirm_trust(interface
, sigs
, iface_xml
)
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
[:]:
103 def pretty_size(size
):
107 return '%d bytes' % size
109 for unit
in ('Kb', 'Mb', 'Gb', 'Tb'):
113 return '%.1f %s' % (size
, unit
)