~teejee2008/apt-toolkit/trunk

« back to all changes in this revision

Viewing changes to src/DownloadWindow.vala

  • Committer: Tony George
  • Date: 2017-04-01 12:46:26 UTC
  • Revision ID: tony.george.kol@gmail.com-20170401124626-5sujdsdq06gjm6qu
Updated download manager backend; Fixed a random crash on downloading packages;

Show diffs side-by-side

added added

removed removed

Lines of Context:
47
47
        private Gtk.TreeViewColumn col_size;
48
48
        private Gtk.TreeViewColumn col_desc;
49
49
        private Gtk.TreeViewColumn col_status;
 
50
        
50
51
        private uint tmr_init = 0;
51
52
        private uint tmr_progress = 0;
52
53
        //private uint tmr_close = 0;
 
54
        
53
55
        private int def_width = 560;
54
56
        private int def_height = 400;
55
57
 
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;
 
61
 
 
62
        private Gee.ArrayList<Package> package_list;
61
63
        
62
64
        // init
63
65
 
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);
66
68
                set_modal(true);
67
69
                //set_skip_taskbar_hint(true);
74
76
                App.progress_count = 0;
75
77
                App.progress_total = 0;
76
78
 
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;
 
80
 
 
81
                mgr = new DownloadTask();
 
82
                mgr.status_in_kb = true;
 
83
 
 
84
                mgr.task_complete.connect(() => {
 
85
                        this.response(Gtk.ResponseType.OK);
 
86
                });
 
87
 
 
88
                foreach(var pkg in package_list){
 
89
                        var item = new DownloadItem(pkg.deb_uri, "/var/cache/apt/archives", pkg.deb_file_name);
 
90
                        item.name = pkg.name;
 
91
                        mgr.add_to_queue(item);
83
92
                        
84
 
                        App.progress_total += mgr.size;
 
93
                        App.progress_total += pkg.deb_size;
85
94
                }
86
95
 
87
96
                init_window();
88
97
        }
89
98
 
90
99
        public void init_window () {
 
100
                
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);
175
185
 
176
 
                //col_status ------------------
 
186
                //Status ------------------
177
187
                
178
188
                col_status = new TreeViewColumn();
179
189
                col_status.title = _("Status");
186
196
                col_status.pack_start (cell_status, false);
187
197
                
188
198
                col_status.set_cell_data_func (cell_status, (cell_layout, cell, model, iter) => {
189
 
                        DownloadManager mgr;
190
 
                        int progress_percent;
191
 
                        model.get (iter, 0, out mgr, 1, out progress_percent, -1);
192
 
                        (cell as CellRendererProgress2).value = progress_percent;
 
199
                        int percent;
 
200
                        model.get (iter, 1, out percent, -1);
 
201
                        (cell as CellRendererProgress2).value = percent;
193
202
                });
194
203
 
195
 
                //col_size ----------------------
 
204
                //Size ----------------------
196
205
 
197
206
                col_size = new TreeViewColumn();
198
207
                col_size.title = _("Size");
206
215
                col_size.pack_start (cell_size, false);
207
216
 
208
217
                col_size.set_cell_data_func (cell_size, (cell_layout, cell, model, iter) => {
209
 
                        DownloadManager mgr;
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));
 
218
                        DownloadItem item;
 
219
                        model.get (iter, 0, out item, -1);
 
220
                        (cell as Gtk.CellRendererText).text = "%s".printf(format_file_size(item.bytes_total));
213
221
                });
214
222
                
215
 
                //col_name ----------------------
 
223
                //Package ----------------------
216
224
 
217
225
                col_name = new TreeViewColumn();
218
226
                col_name.title = _("Package");
226
234
                col_name.pack_start (cell_name, false);
227
235
 
228
236
                col_name.set_cell_data_func (cell_name, (cell_layout, cell, model, iter) => {
229
 
                        DownloadManager mgr;
230
 
                        model.get (iter, 0, out mgr, -1);
231
 
                        (cell as Gtk.CellRendererText).text = mgr.name;
 
237
                        DownloadItem item;
 
238
                        model.get (iter, 0, out item, -1);
 
239
                        (cell as Gtk.CellRendererText).text = item.name;
232
240
                });
233
241
 
234
 
                //col_ppa_desc ----------------------
 
242
                //Progress ----------------------
235
243
 
236
244
                col_desc = new TreeViewColumn();
237
245
                col_desc.title = _("Progress");
245
253
                col_desc.pack_start (cell_desc, false);
246
254
 
247
255
                col_desc.set_cell_data_func (cell_desc, (cell_layout, cell, model, iter) => {
248
 
                        string desc;
249
 
                        DownloadManager mgr;
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;
253
 
                        }
254
 
                        else{
255
 
                                (cell as Gtk.CellRendererText).text = "";
256
 
                        }
 
256
                        string txt;
 
257
                        model.get (iter, 2, out txt, -1);
 
258
                        (cell as Gtk.CellRendererText).text = txt;
257
259
                });
258
260
        }
259
261
 
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));
262
264
 
263
265
                TreeIter iter;
264
 
                foreach(DownloadManager mgr in download_list) {
 
266
                foreach(var item in mgr.downloads) {
265
267
                        //add row
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);
268
270
                }
269
271
 
270
272
                tv_pkg.set_model(model);
274
276
        // do work
275
277
 
276
278
        private void download_begin(){
277
 
                job_count = 0;
 
279
 
 
280
                mgr.execute();
 
281
                
278
282
                update_timer_start();
279
 
                start_next();
280
 
        }
281
 
 
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();
289
 
                                        job_count++;
290
 
                                        assigned = true;
291
 
                                        break;
292
 
                                }
293
 
                        }
294
 
                        if (!assigned){
295
 
                                break; //nothing left to assign
296
 
                        }
297
 
                }
298
 
        }
299
 
 
300
 
        private void download_complete_callback(){
301
 
                job_count--;
302
 
                start_next();
303
 
                bool all_done = true;
304
 
                foreach(var mgr in download_list){
305
 
                        if (mgr.status != DownloadManager.Status.FINISHED){
306
 
                                all_done = false;
307
 
                                break;
308
 
                        }
309
 
                }
310
 
                if (all_done){
311
 
                        this.response(Gtk.ResponseType.OK);
312
 
                }
313
 
        }
314
 
        
 
283
        }
 
284
 
315
285
        public void update_timer_start(){
316
 
                tmr_progress = Timeout.add(100, update_progress);
 
286
                tmr_progress = Timeout.add(1000, update_progress);
317
287
        }
318
288
 
 
289
        public void update_timer_stop(){
 
290
                if (tmr_progress > 0) {
 
291
                        Source.remove(tmr_progress);
 
292
                        tmr_progress = 0;
 
293
                }
 
294
        }
 
295
        
319
296
        private bool update_progress(){
320
 
                if (tmr_progress > 0) {
321
 
                        Source.remove(tmr_progress);
322
 
                        tmr_progress = 0;
323
 
                }
 
297
                
 
298
                update_timer_stop();
324
299
 
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;
331
306
                        }
332
307
                }
333
308
 
342
317
                gtk_do_events();
343
318
 
344
319
                if (!user_aborted){
345
 
                        tmr_progress = Timeout.add(1000, update_progress);
 
320
                        update_timer_start();
346
321
                }
347
322
                return true;
348
323
        }
349
324
 
350
325
        public void update_status_all(){
 
326
                
351
327
                var model = (Gtk.ListStore) tv_pkg.model;
352
 
                DownloadManager mgr = null;
353
328
                int index = -1;
354
329
                TreeIter iter;
355
330
 
356
331
                bool iterExists = model.get_iter_first (out iter);
357
332
                index++;
358
333
 
 
334
                DownloadItem item;
 
335
 
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);
 
340
 
 
341
                        //log_debug("progress=%d".printf(item.progress));
363
342
 
364
343
                        iterExists = model.iter_next (ref iter);
365
344
                        index++;
366
345
                }
367
346
        }
368
 
        
369
 
        public void update_timer_stop(){
370
 
                if (tmr_progress > 0) {
371
 
                        Source.remove(tmr_progress);
372
 
                        tmr_progress = 0;
373
 
                }
374
 
        }
375
347
 
376
348
        // common
377
349