47
47
private Gtk.TreeViewColumn col_size;
48
48
private Gtk.TreeViewColumn col_desc;
49
49
private Gtk.TreeViewColumn col_status;
50
51
private uint tmr_init = 0;
51
52
private uint tmr_progress = 0;
52
53
//private uint tmr_close = 0;
53
55
private int def_width = 560;
54
56
private int def_height = 400;
56
private Gee.ArrayList<DownloadManager> download_list;
57
private int job_count = 0;
58
private int job_count_max = 3;
58
private DownloadTask mgr;
59
59
private bool user_aborted = false;
60
60
//private bool allow_close = false;
62
private Gee.ArrayList<Package> package_list;
64
public DownloadWindow.with_parent(Window parent, Gee.ArrayList<Package> pkg_download_list) {
66
public DownloadWindow.with_parent(Window parent, Gee.ArrayList<Package> _package_list) {
65
67
set_transient_for(parent);
67
69
//set_skip_taskbar_hint(true);
74
76
App.progress_count = 0;
75
77
App.progress_total = 0;
77
download_list = new Gee.ArrayList<DownloadManager>();
78
foreach(var pkg in pkg_download_list){
79
var mgr = new DownloadManager(pkg.deb_file_name,"/var/cache/apt/archives","/var/cache/apt/archives/partial",pkg.deb_uri);
80
mgr.size = pkg.deb_size;
81
mgr.md5hash = pkg.deb_md5hash;
82
download_list.add(mgr);
79
package_list = _package_list;
81
mgr = new DownloadTask();
82
mgr.status_in_kb = true;
84
mgr.task_complete.connect(() => {
85
this.response(Gtk.ResponseType.OK);
88
foreach(var pkg in package_list){
89
var item = new DownloadItem(pkg.deb_uri, "/var/cache/apt/archives", pkg.deb_file_name);
91
mgr.add_to_queue(item);
84
App.progress_total += mgr.size;
93
App.progress_total += pkg.deb_size;
90
99
public void init_window () {
91
101
title = _("Download");
92
102
icon = get_app_icon(16);
93
103
set_default_size (def_width, def_height);
173
183
//sw_pkg.margin_top = 12;
174
184
vbox_main.add(sw_pkg);
176
//col_status ------------------
186
//Status ------------------
178
188
col_status = new TreeViewColumn();
179
189
col_status.title = _("Status");
186
196
col_status.pack_start (cell_status, false);
188
198
col_status.set_cell_data_func (cell_status, (cell_layout, cell, model, iter) => {
190
int progress_percent;
191
model.get (iter, 0, out mgr, 1, out progress_percent, -1);
192
(cell as CellRendererProgress2).value = progress_percent;
200
model.get (iter, 1, out percent, -1);
201
(cell as CellRendererProgress2).value = percent;
195
//col_size ----------------------
204
//Size ----------------------
197
206
col_size = new TreeViewColumn();
198
207
col_size.title = _("Size");
206
215
col_size.pack_start (cell_size, false);
208
217
col_size.set_cell_data_func (cell_size, (cell_layout, cell, model, iter) => {
210
model.get (iter, 0, out mgr, -1);
211
//(cell as Gtk.CellRendererText).text = "%'.0f KB".printf((mgr.size / 1000.0));
212
(cell as Gtk.CellRendererText).text = "%s".printf(format_file_size(mgr.size));
219
model.get (iter, 0, out item, -1);
220
(cell as Gtk.CellRendererText).text = "%s".printf(format_file_size(item.bytes_total));
215
//col_name ----------------------
223
//Package ----------------------
217
225
col_name = new TreeViewColumn();
218
226
col_name.title = _("Package");
226
234
col_name.pack_start (cell_name, false);
228
236
col_name.set_cell_data_func (cell_name, (cell_layout, cell, model, iter) => {
230
model.get (iter, 0, out mgr, -1);
231
(cell as Gtk.CellRendererText).text = mgr.name;
238
model.get (iter, 0, out item, -1);
239
(cell as Gtk.CellRendererText).text = item.name;
234
//col_ppa_desc ----------------------
242
//Progress ----------------------
236
244
col_desc = new TreeViewColumn();
237
245
col_desc.title = _("Progress");
245
253
col_desc.pack_start (cell_desc, false);
247
255
col_desc.set_cell_data_func (cell_desc, (cell_layout, cell, model, iter) => {
250
model.get (iter, 0, out mgr, 2, out desc, -1);
251
if (mgr.status == DownloadManager.Status.STARTED){
252
(cell as Gtk.CellRendererText).text = desc;
255
(cell as Gtk.CellRendererText).text = "";
257
model.get (iter, 2, out txt, -1);
258
(cell as Gtk.CellRendererText).text = txt;
260
262
private void tv_pkg_refresh() {
261
var model = new Gtk.ListStore(3, typeof(DownloadManager),typeof(int),typeof(string));
263
var model = new Gtk.ListStore(3, typeof(DownloadItem),typeof(int),typeof(string));
264
foreach(DownloadManager mgr in download_list) {
266
foreach(var item in mgr.downloads) {
266
268
model.append(out iter);
267
model.set (iter, 0, mgr, 1, 0, 2, "", -1);
269
model.set (iter, 0, item, 1, 0, 2, "", -1);
270
272
tv_pkg.set_model(model);
276
278
private void download_begin(){
278
282
update_timer_start();
282
private void start_next(){
283
while ((job_count < job_count_max) && (!user_aborted)){
284
bool assigned = false;
285
foreach(var mgr in download_list){
286
if (mgr.status == DownloadManager.Status.PENDING){
287
mgr.download_complete.connect(download_complete_callback);
288
mgr.download_begin();
295
break; //nothing left to assign
300
private void download_complete_callback(){
303
bool all_done = true;
304
foreach(var mgr in download_list){
305
if (mgr.status != DownloadManager.Status.FINISHED){
311
this.response(Gtk.ResponseType.OK);
315
285
public void update_timer_start(){
316
tmr_progress = Timeout.add(100, update_progress);
286
tmr_progress = Timeout.add(1000, update_progress);
289
public void update_timer_stop(){
290
if (tmr_progress > 0) {
291
Source.remove(tmr_progress);
319
296
private bool update_progress(){
320
if (tmr_progress > 0) {
321
Source.remove(tmr_progress);
325
300
int64 downrate = 0;
326
301
App.progress_count = 0;
327
foreach(var mgr in download_list){
328
App.progress_count += mgr.progress_count;
329
if (mgr.status == DownloadManager.Status.STARTED){
330
downrate += mgr.download_rate;
302
foreach(var item in mgr.downloads){
303
App.progress_count += item.bytes_received;
304
if (item.status == "RUNNING"){
305
downrate += item.rate;
344
319
if (!user_aborted){
345
tmr_progress = Timeout.add(1000, update_progress);
320
update_timer_start();
350
325
public void update_status_all(){
351
327
var model = (Gtk.ListStore) tv_pkg.model;
352
DownloadManager mgr = null;
356
331
bool iterExists = model.get_iter_first (out iter);
359
336
while (iterExists){
360
model.get (iter, 0, out mgr, -1);
361
model.set (iter, 1, (int) (mgr.progress_percent));
362
model.set (iter, 2, mgr.status_line);
337
model.get (iter, 0, out item, -1);
338
model.set (iter, 1, (int) (item.progress * 100), -1);
339
model.set (iter, 2, item.status_line, -1);
341
//log_debug("progress=%d".printf(item.progress));
364
343
iterExists = model.iter_next (ref iter);
369
public void update_timer_stop(){
370
if (tmr_progress > 0) {
371
Source.remove(tmr_progress);