From b6ceb5e11ae20ede9b30979d4b54c56f84e89eaf Mon Sep 17 00:00:00 2001 From: ticktock35 Date: Mon, 15 Dec 2008 05:12:27 +0000 Subject: [PATCH] opkg: improve download callback handling and integrate into opkg_update_package_lists git-svn-id: http://opkg.googlecode.com/svn/trunk@86 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358 --- libopkg/opkg.c | 47 ++++++++++++++++++++++++++++++++++++++--- libopkg/opkg_cmd.c | 6 +++--- libopkg/opkg_download.c | 42 ++++++++---------------------------- libopkg/opkg_download.h | 4 +++- 4 files changed, 59 insertions(+), 40 deletions(-) diff --git a/libopkg/opkg.c b/libopkg/opkg.c index 0e63180..fc7bd3f 100644 --- a/libopkg/opkg.c +++ b/libopkg/opkg.c @@ -87,6 +87,39 @@ opkg_configure_packages(opkg_conf_t *conf, char *pkg_name) return err; } +struct _curl_cb_data +{ + opkg_progress_callback_t cb; + opkg_t *opkg; + void *user_data; + int start_range; + int finish_range; +}; + +int +curl_progress_cb (struct _curl_cb_data *cb_data, + double t, /* dltotal */ + double d, /* dlnow */ + double ultotal, + double ulnow) +{ + int p = (t) ? d*100/t : 0; + static int prev = -1; + + /* prevent the same value being sent twice (can occur due to rounding) */ + if (p == prev) + return 0; + prev = p; + + if (t < 1) + return 0; + + (cb_data->cb) (cb_data->opkg, + cb_data->start_range + (d/t * ((cb_data->finish_range - cb_data->start_range))), + cb_data->user_data); + + return 0; +} /*** Public API ***/ @@ -456,11 +489,19 @@ opkg_update_package_lists (opkg_t *opkg, opkg_progress_callback_t progress_callb { char *tmp_file_name; FILE *in, *out; + struct _curl_cb_data cb_data; sprintf_alloc (&tmp_file_name, "%s/%s.gz", tmp, src->name); /* XXX: Note: downloading url */ - err = opkg_download (opkg->conf, url, tmp_file_name); + + cb_data.cb = progress_callback; + cb_data.opkg = opkg; + cb_data.user_data = user_data; + cb_data.start_range = 100 * sources_done / sources_list_count; + cb_data.finish_range = 100 * (sources_done + 1) / sources_list_count; + + err = opkg_download (opkg->conf, url, tmp_file_name, (curl_progress_func) curl_progress_cb, &cb_data); if (err == 0) { @@ -479,7 +520,7 @@ opkg_update_package_lists (opkg_t *opkg, opkg_progress_callback_t progress_callb } } else - err = opkg_download (opkg->conf, url, list_file_name); + err = opkg_download (opkg->conf, url, list_file_name, NULL, NULL); if (err) { @@ -501,7 +542,7 @@ opkg_update_package_lists (opkg_t *opkg, opkg_progress_callback_t progress_callb sprintf_alloc (&tmp_file_name, "%s/%s", tmp, "Packages.sig"); - err = opkg_download (opkg->conf, url, tmp_file_name); + err = opkg_download (opkg->conf, url, tmp_file_name, NULL, NULL); if (err) { /* XXX: Warning: Download failed */ diff --git a/libopkg/opkg_cmd.c b/libopkg/opkg_cmd.c index 42443a5..a7f9b1a 100644 --- a/libopkg/opkg_cmd.c +++ b/libopkg/opkg_cmd.c @@ -226,7 +226,7 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) FILE *in, *out; sprintf_alloc (&tmp_file_name, "%s/%s.gz", tmp, src->name); - err = opkg_download(conf, url, tmp_file_name); + err = opkg_download(conf, url, tmp_file_name, NULL, NULL); if (err == 0) { opkg_message (conf, OPKG_NOTICE, "Inflating %s\n", url); in = fopen (tmp_file_name, "r"); @@ -242,7 +242,7 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) unlink (tmp_file_name); } } else - err = opkg_download(conf, url, list_file_name); + err = opkg_download(conf, url, list_file_name, NULL, NULL); if (err) { failures++; } else { @@ -266,7 +266,7 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) sprintf_alloc (&tmp_file_name, "%s/%s", tmp, "Packages.sig"); - err = opkg_download(conf, url, tmp_file_name); + err = opkg_download(conf, url, tmp_file_name, NULL, NULL); if (err) { failures++; opkg_message (conf, OPKG_NOTICE, "Signature check failed\n"); diff --git a/libopkg/opkg_download.c b/libopkg/opkg_download.c index d994670..428cad5 100644 --- a/libopkg/opkg_download.c +++ b/libopkg/opkg_download.c @@ -33,34 +33,7 @@ #include "str_util.h" #include "opkg_defines.h" -opkg_download_progress_callback opkg_cb_download_progress = NULL; - -int -curl_progress_func (char* url, - double t, /* dltotal */ - double d, /* dlnow */ - double ultotal, - double ulnow) -{ - int p = (t) ? d*100/t : 0; - - if (opkg_cb_download_progress) - { - static int prev = -1; - - /* don't report the same percentage multiple times - * (this can occur due to rounding) */ - if (prev == p) - return 0; - prev = p; - - opkg_cb_download_progress (p, url); - return 0; - } - return 0; -} - -int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name) +int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name, curl_progress_func cb, void *data) { int err = 0; @@ -110,9 +83,12 @@ int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name { curl_easy_setopt (curl, CURLOPT_URL, src); curl_easy_setopt (curl, CURLOPT_WRITEDATA, file); - curl_easy_setopt (curl, CURLOPT_NOPROGRESS, 0); - curl_easy_setopt (curl, CURLOPT_PROGRESSDATA, src); - curl_easy_setopt (curl, CURLOPT_PROGRESSFUNCTION, curl_progress_func); + curl_easy_setopt (curl, CURLOPT_NOPROGRESS, (cb == NULL)); + if (cb) + { + curl_easy_setopt (curl, CURLOPT_PROGRESSDATA, data); + curl_easy_setopt (curl, CURLOPT_PROGRESSFUNCTION, cb); + } curl_easy_setopt (curl, CURLOPT_FAILONERROR, 1); if (conf->http_proxy || conf->ftp_proxy) { @@ -179,7 +155,7 @@ int opkg_download_pkg(opkg_conf_t *conf, pkg_t *pkg, const char *dir) sprintf_alloc(&pkg->local_filename, "%s/%s", dir, stripped_filename); - err = opkg_download(conf, url, pkg->local_filename); + err = opkg_download(conf, url, pkg->local_filename, NULL, NULL); free(url); opkg_set_current_state (conf, OPKG_STATE_NONE, NULL); @@ -204,7 +180,7 @@ int opkg_prepare_url_for_install(opkg_conf_t *conf, const char *url, char **name char *file_base = basename(file_basec); sprintf_alloc(&tmp_file, "%s/%s", conf->tmp_dir, file_base); - err = opkg_download(conf, url, tmp_file); + err = opkg_download(conf, url, tmp_file, NULL, NULL); if (err) return err; diff --git a/libopkg/opkg_download.h b/libopkg/opkg_download.h index 8b940e7..39cd9a6 100644 --- a/libopkg/opkg_download.h +++ b/libopkg/opkg_download.h @@ -21,8 +21,10 @@ #include "opkg_conf.h" typedef void (*opkg_download_progress_callback)(int percent, char *url); +typedef int (*curl_progress_func)(void *data, double t, double d, double ultotal, double ulnow); -int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name); + +int opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name, curl_progress_func cb, void *data); int opkg_download_pkg(opkg_conf_t *conf, pkg_t *pkg, const char *dir); /* * Downloads file from url, installs in package database, return package name. -- 2.25.1