diff options
| -rw-r--r-- | navit/gui/internal/gui_internal_map_downloader.c | 8 | ||||
| -rw-r--r-- | navit/network.c | 44 | ||||
| -rw-r--r-- | navit/network.h | 5 |
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×tamp=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×tamp=161223")); + strcpy (dl_info.url, g_strdup_printf ("http://maps9.navit-project.org/api/map/?bbox=-123.7,36.9,-120.5,38.7×tamp=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; }; |
