4 from zeroinstall
.injector
.model
import SafeException
5 from zeroinstall
.injector
import download
, run
6 from gui
import policy
, pretty_size
7 from dialog
import Dialog
10 warnings
.filterwarnings('ignore', category
= DeprecationWarning, module
='download_box')
12 def download_with_gui(mainwindow
, prog_args
, run_afterwards
, main
= None):
13 """If all downloads are ready, runs the program. Otherwise,
14 hides mainwindow, shows the download progress box and then runs
15 it. On error, mainwindow is re-shown."""
18 for iface
, impl
in policy
.get_uncached_implementations():
19 if not impl
.download_sources
:
20 raise SafeException("Implementation " + impl
.id + " of "
21 "interface " + iface
.get_name() + " cannot be "
22 "downloaded (no download locations given in "
24 dl
= download
.begin_impl_download(policy
.get_best_source(impl
),
26 downloads
.append((iface
, dl
))
28 policy
.abort_all_downloads()
29 if not run_afterwards
:
33 run
.execute(policy
, prog_args
) # Don't break older versions
35 run
.execute(policy
, prog_args
, main
= main
)
38 DownloadProgessBox(run_it
, downloads
, mainwindow
).show()
41 except SafeException
, ex
:
42 box
= gtk
.MessageDialog(None, gtk
.DIALOG_MODAL
,
43 gtk
.MESSAGE_ERROR
, gtk
.BUTTONS_OK
,
49 class DownloadProgessBox(Dialog
):
56 def __init__(self
, run_it
, downloads
, mainwindow
):
58 self
.set_title('Downloading, please wait...')
59 self
.mainwindow
= mainwindow
63 self
.add_button(gtk
.STOCK_CANCEL
, gtk
.RESPONSE_CANCEL
)
65 table
= gtk
.Table(len(downloads
) + 1, 3)
66 self
.vbox
.pack_start(table
, False, False, 0)
67 table
.set_row_spacings(4)
68 table
.set_col_spacings(10)
69 table
.set_border_width(10)
74 for iface
, dl
in downloads
:
75 bar
= gtk
.ProgressBar()
76 bars
.append((dl
, bar
))
77 table
.attach(gtk
.Label(iface
.get_name()),
79 table
.attach(gtk
.Label(pretty_size(dl
.source
.size
)),
81 table
.attach(bar
, 2, 3, row
, row
+ 1)
83 self
.start_download(dl
)
89 for iface
, dl
in downloads
:
91 gtk
.timeout_remove(self
.idle_timeout
)
92 self
.idle_timeout
= None
96 self
.connect('response', resp
)
99 if self
.n_downloads
== 0:
105 perc
= dl
.get_current_fraction()
106 bar
.set_fraction(perc
)
109 self
.idle_timeout
= gtk
.timeout_add(250, update_bars
)
111 def start_download(self
, dl
):
112 error_stream
= dl
.start()
113 def error_ready(src
, cond
):
114 got
= os
.read(src
.fileno(), 100)
117 self
.n_downloads
-= 1
119 data
= dl
.error_stream_closed()
120 policy
.add_to_cache(dl
.source
, data
)
121 except Exception, ex
:
122 label
= gtk
.Label("Error getting '%s':\n%s" % (dl
.url
, ex
))
123 label
.set_padding(4, 4)
124 self
.vbox
.pack_start(label
, False, True, 2)
125 label
.set_selectable(True)
130 dl
.error_stream_data(got
)
133 self
.n_downloads
+= 1
134 gtk
.input_add(error_stream
, gtk
.gdk
.INPUT_READ
, error_ready
)