From 7e156584baaf04052e7fd55c3144e3f60e942451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Higor=20Eur=C3=ADpedes?= Date: Mon, 30 Nov 2015 09:17:46 -0300 Subject: [PATCH] (tasks) Add progress metter and task titles --- menu/cbs/menu_cbs_ok.c | 7 ------- tasks/task_http.c | 27 +++++++++------------------ tasks/tasks.c | 35 +++++++++++++++++++++++++++++++++-- tasks/tasks.h | 4 ++++ 4 files changed, 46 insertions(+), 27 deletions(-) diff --git a/menu/cbs/menu_cbs_ok.c b/menu/cbs/menu_cbs_ok.c index 921298e2cf..f9bbbd2a43 100644 --- a/menu/cbs/menu_cbs_ok.c +++ b/menu/cbs/menu_cbs_ok.c @@ -1172,13 +1172,6 @@ static int action_ok_download_generic(const char *path, transf->type_hash = menu_hash_calculate(type_msg); strlcpy(transf->path, path, sizeof(transf->path)); - snprintf(s2, sizeof(s2), - "%s %s.", - menu_hash_to_str(MENU_LABEL_VALUE_STARTING_DOWNLOAD), - path); - - menu_display_msg_queue_push(s2, 1, 90, true); - rarch_task_push_http_transfer(s3, type_msg, cb_generic_download, transf); #endif return 0; diff --git a/tasks/task_http.c b/tasks/task_http.c index df70ec6def..2030899d1f 100644 --- a/tasks/task_http.c +++ b/tasks/task_http.c @@ -110,28 +110,14 @@ static int cb_http_conn_default(void *data_, size_t len) * Returns: 0 when finished, -1 when we should continue * with the transfer on the next frame. **/ -static int rarch_main_data_http_iterate_transfer(void *data) +static int rarch_main_data_http_iterate_transfer(rarch_task_t *task) { - http_handle_t *http = (http_handle_t*)data; + http_handle_t *http = (http_handle_t*)task->state; size_t pos = 0, tot = 0; if (!net_http_update(http->handle, &pos, &tot)) { - int percent = 0; - - if(tot != 0) - percent = (unsigned long long)pos * 100 - / (unsigned long long)tot; - - if (percent > 0) - { - char tmp[PATH_MAX_LENGTH]; - snprintf(tmp, sizeof(tmp), "%s: %d%%", - msg_hash_to_str(MSG_DOWNLOAD_PROGRESS), - percent); - data_runloop_osd_msg(tmp, sizeof(tmp)); - } - + task->progress = tot == 0 ? -1 : (pos * 100 / tot); return -1; } @@ -154,7 +140,7 @@ static void rarch_task_http_transfer_handler(rarch_task_t *task) http->status = HTTP_STATUS_CONNECTION_TRANSFER_PARSE; break; case HTTP_STATUS_TRANSFER: - if (!rarch_main_data_http_iterate_transfer(http)) + if (!rarch_main_data_http_iterate_transfer(task)) goto task_finished; break; case HTTP_STATUS_TRANSFER_PARSE: @@ -212,6 +198,7 @@ bool rarch_task_push_http_transfer(const char *url, const char *type, rarch_task rarch_task_t *t; http_handle_t *http; struct http_connection_t *conn; + char tmp[PATH_MAX_LENGTH]; if (!url || !*url) return false; @@ -235,6 +222,10 @@ bool rarch_task_push_http_transfer(const char *url, const char *type, rarch_task t->state = http; t->callback = cb; t->user_data = user_data; + t->progress = -1; + + snprintf(tmp, sizeof(tmp), "Downloading '%s'", path_basename(url)); + t->title = strdup(tmp); rarch_task_push(t); diff --git a/tasks/tasks.c b/tasks/tasks.c index c5f1197fea..92327ea57b 100644 --- a/tasks/tasks.c +++ b/tasks/tasks.c @@ -63,10 +63,34 @@ static void rarch_task_internal_gather(void) if (task->error) free(task->error); + if (task->title) + free(task->title); + free(task); } } +static void push_task_progress(rarch_task_t *task) +{ + if (task->title) + { + if (task->finished) + { + if (task->error) + rarch_main_msg_queue_pushf(1, 60, true, "Failed: %s", task->title); + else + rarch_main_msg_queue_pushf(1, 60, true, "100%%: %s", task->title); + } + else + { + if (task->progress >= 0 && task->progress <= 100) + rarch_main_msg_queue_pushf(1, 10, true, "%i%%: %s", task->progress, task->title); + else + rarch_main_msg_queue_pushf(1, 10, true, "%s...", task->title); + } + } +} + static void regular_push_running(rarch_task_t *task) { task_queue_put(&tasks_running, task); @@ -78,8 +102,6 @@ static void regular_gather(void) rarch_task_t *queue = NULL; rarch_task_t *next = NULL; - /* mimics threaded_gather() for compatibility, a faster implementation - * can be written for systems without HAVE_THREADS if necessary. */ while ((task = task_queue_get(&tasks_running)) != NULL) { task->next = queue; @@ -91,6 +113,8 @@ static void regular_gather(void) next = task->next; task->handler(task); + push_task_progress(task); + if (task->finished) task_queue_put(&tasks_finished, task); else @@ -148,6 +172,13 @@ static void threaded_push_running(rarch_task_t *task) static void threaded_gather(void) { + rarch_task_t *task; + slock_lock(running_lock); + for (task = tasks_running.front; task; task = task->next) + push_task_progress(task); + + slock_unlock(running_lock); + slock_lock(finished_lock); rarch_task_internal_gather(); slock_unlock(finished_lock); diff --git a/tasks/tasks.h b/tasks/tasks.h index 0c31243c52..92bd0b86c4 100644 --- a/tasks/tasks.h +++ b/tasks/tasks.h @@ -55,6 +55,10 @@ struct rarch_task { /* created by task handler; destroyed by main loop (after calling the callback) */ char *error; + /* -1 = unmettered, 0-100 progress value */ + char progress; + char *title; /* handler can modify but will be free()d automatically if non-null */ + /* don't touch this. */ rarch_task_t *next; };