r4394 - trunk/src/target/opkg/libopkg

thomas at sita.openmoko.org thomas at sita.openmoko.org
Wed Apr 23 17:40:39 CEST 2008


Author: thomas
Date: 2008-04-23 17:40:38 +0200 (Wed, 23 Apr 2008)
New Revision: 4394

Modified:
   trunk/src/target/opkg/libopkg/opkg.c
   trunk/src/target/opkg/libopkg/opkg_cmd.c
   trunk/src/target/opkg/libopkg/opkg_download.c
   trunk/src/target/opkg/libopkg/opkg_download.h
Log:
opkg: improve download callback handling and integrate into opkg_update_package_lists


Modified: trunk/src/target/opkg/libopkg/opkg.c
===================================================================
--- trunk/src/target/opkg/libopkg/opkg.c	2008-04-23 13:41:33 UTC (rev 4393)
+++ trunk/src/target/opkg/libopkg/opkg.c	2008-04-23 15:40:38 UTC (rev 4394)
@@ -87,8 +87,41 @@
   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 ***/
 
 opkg_t *
@@ -456,12 +489,20 @@
     {
       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)
       {
         /* XXX: Note: Inflating downloaded file */
@@ -479,7 +520,7 @@
       }
     }
     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 @@
 
     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 */

Modified: trunk/src/target/opkg/libopkg/opkg_cmd.c
===================================================================
--- trunk/src/target/opkg/libopkg/opkg_cmd.c	2008-04-23 13:41:33 UTC (rev 4393)
+++ trunk/src/target/opkg/libopkg/opkg_cmd.c	2008-04-23 15:40:38 UTC (rev 4394)
@@ -226,7 +226,7 @@
 	      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 @@
 		   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 @@
 
 	  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");

Modified: trunk/src/target/opkg/libopkg/opkg_download.c
===================================================================
--- trunk/src/target/opkg/libopkg/opkg_download.c	2008-04-23 13:41:33 UTC (rev 4393)
+++ trunk/src/target/opkg/libopkg/opkg_download.c	2008-04-23 15:40:38 UTC (rev 4394)
@@ -33,35 +33,8 @@
 #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 opkg_download(opkg_conf_t *conf, const char *src, const char *dest_file_name, curl_progress_func cb, void *data)
 {
-    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 err = 0;
 
     char *src_basec = strdup(src);
@@ -110,9 +83,12 @@
     {
 	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 @@
 
     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 @@
 	  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;
 

Modified: trunk/src/target/opkg/libopkg/opkg_download.h
===================================================================
--- trunk/src/target/opkg/libopkg/opkg_download.h	2008-04-23 13:41:33 UTC (rev 4393)
+++ trunk/src/target/opkg/libopkg/opkg_download.h	2008-04-23 15:40:38 UTC (rev 4394)
@@ -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. 





More information about the commitlog mailing list