summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierre Grandin <grandinp@altern.org>2017-01-24 17:50:25 -0800
committerPierre Grandin <grandinp@altern.org>2017-01-24 17:50:25 -0800
commit3b03b26f44015973d557051df9cceb1841792c53 (patch)
treebb3fd69fc90c19d70e0b03e6539132d677cda18a
parent1089fed671eb1e38f0dbc70dcc1c1da324cae9e1 (diff)
downloadnavit-3b03b26f44015973d557051df9cceb1841792c53.tar.gz
Implemented download resume
-rw-r--r--navit/gui/internal/gui_internal_map_downloader.c8
-rw-r--r--navit/network.c44
-rw-r--r--navit/network.h5
3 files changed, 50 insertions, 7 deletions
diff --git a/navit/gui/internal/gui_internal_map_downloader.c b/navit/gui/internal/gui_internal_map_downloader.c
index 9e36d6dbb..b9ed0c9ef 100644
--- a/navit/gui/internal/gui_internal_map_downloader.c
+++ b/navit/gui/internal/gui_internal_map_downloader.c
@@ -86,9 +86,13 @@ gui_internal_map_downloader(struct gui_priv *this, struct widget *wm, void *data
} else {
dbg(lvl_error, "Download will be started\n");
- strcpy (dl_info.url, g_strdup_printf ("http://maps9.navit-project.org/api/map/?bbox=-125.94,32.43,-114.08,42.07&timestamp=161223"));
strcpy (dl_info.url, g_strdup_printf ("http://www.navit-project.org/maps/osm_bbox_11.3,47.9,11.7,48.2.osm.bz2"));
- dbg(lvl_error,"Url %s\n", dl_info.url);
+ strcpy (dl_info.url, g_strdup_printf ("http://maps9.navit-project.org/api/map/?bbox=-125.94,32.43,-114.08,42.07&timestamp=161223"));
+ strcpy (dl_info.url, g_strdup_printf ("http://maps9.navit-project.org/api/map/?bbox=-123.7,36.9,-120.5,38.7&timestamp=161223"));
+ dl_info.name = g_strdup("west.bin");
+ dl_info.path = g_strjoin(NULL, getenv("NAVIT_SHAREDIR"), "/maps/", dl_info.name, NULL);
+ dl_info.xml = g_strjoin(NULL, getenv("NAVIT_SHAREDIR"), "/maps/", dl_info.name, ".xml", NULL);
+ dbg(lvl_error," %s -> %s %s\n", dl_info.url, dl_info.name, dl_info.path);
if(pthread_create(&dl_thread, NULL, download_map, &dl_info)) {
dbg(lvl_error, "Error creating download thread\n");
diff --git a/navit/network.c b/navit/network.c
index 426aebd9b..bdfe905d7 100644
--- a/navit/network.c
+++ b/navit/network.c
@@ -4,6 +4,8 @@
#include "stddef.h"
#include "network.h"
+#include "sys/stat.h"
+
int progressCallBack(struct map_download_info *dl_info, double dltotal, double dlnow, double
ultotal, double ulnow)
@@ -15,17 +17,37 @@ ultotal, double ulnow)
// Could be use to trigger a cancel from the UI
}
+
void * download_map(void * arguments)
{
struct map_download_info * dl_info = arguments;
- dl_info->downloading = 1;
CURL *handle;
+ FILE* file;
+ int current_size = 0;
+
+ dl_info->downloading = 1;
CURLcode res = CURLE_OK;
- fprintf(stderr, "url = %s\n", dl_info->url);
+ dbg(lvl_debug, "downloading %s to %s\n", dl_info->url, dl_info->path);
- handle = curl_easy_init();
+#ifndef WINDOWS
+ struct stat st;
+ stat(dl_info->path, &st);
+ current_size = st.st_size;
+#else
+ // Implement resuming on windows via https://msdn.microsoft.com/en-us/library/windows/desktop/aa364955(v=vs.85).aspx
+#endif
+ handle = curl_easy_init();
curl_easy_setopt(handle, CURLOPT_URL, dl_info->url);
+
+ if (current_size>0){
+ dbg(lvl_debug, "Current size : %i, will resume\n", current_size);
+ curl_easy_setopt(handle, CURLOPT_RESUME_FROM, current_size);
+ dl_info->resume = 1;
+ } else {
+ dbg(lvl_debug, "Downloading from scratch\n");
+ }
+
// Map server might redirect to a mirror
curl_easy_setopt(handle, CURLOPT_FOLLOWLOCATION, 1L);
@@ -33,7 +55,7 @@ void * download_map(void * arguments)
curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 0);
curl_easy_setopt(handle, CURLOPT_PROGRESSFUNCTION, progressCallBack);
- FILE* file = fopen( "out.bin", "w");
+ file = fopen( dl_info->path, current_size > 0 ? "ab":"wb");
curl_easy_setopt( handle, CURLOPT_WRITEDATA, file) ;
res = curl_easy_perform( handle );
fclose(file);
@@ -42,7 +64,19 @@ void * download_map(void * arguments)
dbg(lvl_error, "%s\n", curl_easy_strerror(res));
curl_easy_cleanup(handle);
- dbg(lvl_error, "download complete\n");
+
+
+ dbg(lvl_debug, "download complete, creating XML\n");
+
+ file = fopen( dl_info->xml, "w");
+ if(file == NULL)
+ {
+ dbg(lvl_error, "Could not open %s for writing", dl_info->xml);
+ return -1;
+ }
+
+ fprintf(file, "<map type=\"binfile\" data=\"$NAVIT_SHAREDIR/maps/%s\" />", dl_info->name);
+ fclose(file);
dl_info->downloading = 0;
return (int)res;;
diff --git a/navit/network.h b/navit/network.h
index 9656f169b..014c5a798 100644
--- a/navit/network.h
+++ b/navit/network.h
@@ -7,7 +7,12 @@ extern "C" {
struct map_download_info{
char url[256];
+ char *name;
+ char *path;
+ char *xml;
int downloading;
+ int resume;
+ FILE * stream;
double dl_now;
double dl_total;
};