download.c (2986B)
1 2 #include <Elementary.h> 3 #include <EWebKit2.h> 4 5 #include "viking_state.h" 6 #include "viking.h" 7 #include "download.h" 8 9 static Eina_Bool 10 download_status_cb(void *data) 11 { 12 Ewk_Download_Job *dl; 13 Eina_List *l; 14 15 Window_Data *wd = data; 16 App_Data *ad = wd->app; 17 unsigned int dl_count = eina_list_count(ad->downloads); 18 Eina_Strbuf *buf = eina_strbuf_new(); 19 double percent_done; 20 21 eina_strbuf_append_printf(buf, "%i DL", eina_list_count(ad->downloads)); 22 23 percent_done = 0.0; 24 EINA_LIST_FOREACH(ad->downloads, l, dl) 25 percent_done += 100.0 * ewk_download_job_estimated_progress_get(dl); 26 27 percent_done /= (double)dl_count; 28 29 eina_strbuf_append_printf(buf, " (%.1f%%)", percent_done); 30 31 EINA_LIST_FOREACH(ad->windows, l, wd) { 32 if (dl_count == 0) { 33 evas_object_size_hint_weight_set(wd->downloads, 0.0, 0.0); 34 elm_object_text_set(wd->downloads, ""); 35 } 36 else { 37 evas_object_size_hint_weight_set(wd->downloads, EVAS_HINT_EXPAND, 0.0); 38 elm_object_text_set(wd->downloads, eina_strbuf_string_get(buf)); 39 } 40 } 41 eina_strbuf_free(buf); 42 43 return ECORE_CALLBACK_RENEW; 44 } 45 46 void 47 download_request_cb(void *data, Evas_Object *obj, void *event_info) 48 { 49 Window_Data *wd = data; 50 App_Data *ad = wd->app; 51 Eina_Strbuf *full_path = eina_strbuf_new(); 52 Ewk_Download_Job *dl = event_info; 53 const char *suggested_name = ewk_download_job_suggested_filename_get(dl); 54 55 eina_strbuf_append_printf(full_path, "%s/%s", efreet_desktop_dir_get(), suggested_name); 56 printf("download_request_cb() downloading to %s\n", eina_strbuf_string_get(full_path)); 57 ewk_download_job_destination_set(dl, eina_strbuf_string_steal(full_path)); 58 59 // ewk_object_ref(dl); 60 ad->downloads = eina_list_append(ad->downloads, dl); 61 62 if (eina_list_count(ad->downloads) == 1) 63 ad->download_status_timer = ecore_timer_loop_add(1, download_status_cb, wd); 64 65 download_status_cb(wd); 66 } 67 68 static void 69 download_remove(Window_Data *wd, Ewk_Download_Job *dl) 70 { 71 App_Data *ad = wd->app; 72 73 // ewk_object_unref(dl); 74 ad->downloads = eina_list_remove(ad->downloads, dl); 75 76 if (eina_list_count(ad->downloads) == 0) 77 ecore_timer_del(ad->download_status_timer); 78 79 download_status_cb(wd); 80 } 81 82 void 83 download_finished_cb(void *data, Evas_Object *obj, void *event_info) 84 { 85 Window_Data *wd = data; 86 Ewk_Download_Job *dl = event_info; 87 88 download_remove(wd, dl); 89 } 90 91 void 92 download_failed_cb(void *data, Evas_Object *obj, void *event_info) 93 { 94 Window_Data *wd = data; 95 Ewk_Download_Job_Error *err = event_info; 96 Ewk_Download_Job *dl = err->download_job; 97 98 /* 99 Arg a; 100 101 a.i = Error; 102 a.s = strdup_printf("download of %s failed!", 103 ewk_download_job_suggested_filename_get(dl)); 104 echo(&a, wd); 105 free(a.s); 106 */ 107 108 download_remove(wd, dl); 109 } 110 111 void 112 download_cancelled_cb(void *data, Evas_Object *obj, void *event_info) 113 { 114 Window_Data *wd = data; 115 Ewk_Download_Job *dl = event_info; 116 117 /* 118 Arg a; 119 120 a.i = Info; 121 a.s = strdup_printf("download %s cancelled", ewk_download_job_suggested_filename_get(dl)); 122 echo(&a, wd); 123 free(a.s); 124 */ 125 126 download_remove(wd, dl); 127 } 128