X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/75a790673a6a8b178084c0e2ac03ff848cef6c3f..c2cf03332f51a9fa992220124635f737399fba91:/src/download.c diff --git a/src/download.c b/src/download.c index 2e80ba56..ef75b02f 100644 --- a/src/download.c +++ b/src/download.c @@ -50,6 +50,7 @@ #include "curl_download.h" #include "preferences.h" #include "globals.h" +#include "vik_compat.h" static gboolean check_file_first_line(FILE* f, gchar *patterns[]) { @@ -135,8 +136,12 @@ void a_download_init (void) VikLayerParamData tmp; tmp.u = VIK_CONFIG_DEFAULT_TILE_AGE / 86400; // Now in days a_preferences_register(prefs, tmp, VIKING_PREFERENCES_GROUP_KEY); + file_list_mutex = vik_mutex_new(); +} - file_list_mutex = g_mutex_new(); +void a_download_uninit (void) +{ + vik_mutex_free(file_list_mutex); } static gboolean lock_file(const char *fn) @@ -201,7 +206,14 @@ void a_try_decompress_file (gchar *name) gboolean zip = FALSE; gboolean bzip2 = FALSE; if ( myt ) { +#ifdef WINDOWS + // We have to 'package' the magic database ourselves :( + // --> %PROGRAM FILES%\Viking\magic.mgc + magic_load ( myt, "magic.mgc" ); +#else + // Use system default magic_load ( myt, NULL ); +#endif const char* magic = magic_file (myt, name); g_debug ("%s: magic output: %s", __FUNCTION__, magic ); @@ -230,7 +242,7 @@ void a_try_decompress_file (gchar *name) #endif } -static int download( const char *hostname, const char *uri, const char *fn, DownloadMapOptions *options, gboolean ftp, void *handle) +static DownloadResult_t download( const char *hostname, const char *uri, const char *fn, DownloadMapOptions *options, gboolean ftp, void *handle) { FILE *f; int ret; @@ -244,7 +256,7 @@ static int download( const char *hostname, const char *uri, const char *fn, Down if (options == NULL || (!options->check_file_server_time && !options->use_etag)) { /* Nothing to do as file already exists and we don't want to check server */ - return -3; + return DOWNLOAD_NOT_REQUIRED; } time_t tile_age = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "download_tile_age")->u; @@ -254,7 +266,7 @@ static int download( const char *hostname, const char *uri, const char *fn, Down time_t file_time = buf.st_mtime; if ( (time(NULL) - file_time) < tile_age ) { /* File cache is too recent, so return */ - return -3; + return DOWNLOAD_NOT_REQUIRED; } if (options->check_file_server_time) { @@ -289,7 +301,7 @@ static int download( const char *hostname, const char *uri, const char *fn, Down g_free ( tmpfilename ); if (options->use_etag) g_free ( file_options.etag ); - return -4; + return DOWNLOAD_FILE_WRITE_ERROR; } f = g_fopen ( tmpfilename, "w+b" ); /* truncate file and open it */ if ( ! f ) { @@ -297,20 +309,24 @@ static int download( const char *hostname, const char *uri, const char *fn, Down g_free ( tmpfilename ); if (options->use_etag) g_free ( file_options.etag ); - return -4; + return DOWNLOAD_FILE_WRITE_ERROR; } /* Call the backend function */ ret = curl_download_get_url ( hostname, uri, f, options, ftp, &file_options, handle ); - if (ret != DOWNLOAD_NO_ERROR && ret != DOWNLOAD_NO_NEWER_FILE) { + DownloadResult_t result = DOWNLOAD_SUCCESS; + + if (ret != CURL_DOWNLOAD_NO_ERROR && ret != CURL_DOWNLOAD_NO_NEWER_FILE) { g_debug("%s: download failed: curl_download_get_url=%d", __FUNCTION__, ret); failure = TRUE; + result = DOWNLOAD_HTTP_ERROR; } if (!failure && options != NULL && options->check_file != NULL && ! options->check_file(f)) { g_debug("%s: file content checking failed", __FUNCTION__); failure = TRUE; + result = DOWNLOAD_CONTENT_ERROR; } fclose ( f ); @@ -326,7 +342,7 @@ static int download( const char *hostname, const char *uri, const char *fn, Down g_free ( file_options.etag ); g_free ( file_options.new_etag ); } - return -1; + return result; } if ( options->convert_file ) @@ -342,7 +358,7 @@ static int download( const char *hostname, const char *uri, const char *fn, Down } } - if (ret == DOWNLOAD_NO_NEWER_FILE) { + if (ret == CURL_DOWNLOAD_NO_NEWER_FILE) { g_remove ( tmpfilename ); #if GLIB_CHECK_VERSION(2,18,0) g_utime ( fn, NULL ); /* update mtime of local copy */ @@ -350,7 +366,9 @@ static int download( const char *hostname, const char *uri, const char *fn, Down utimes ( fn, NULL ); /* update mtime of local copy */ #endif } else { - g_rename ( tmpfilename, fn ); /* move completely-downloaded file to permanent location */ + /* move completely-downloaded file to permanent location */ + if ( g_rename ( tmpfilename, fn ) ) + g_warning ("%s: file rename failed [%s] to [%s]", __FUNCTION__, tmpfilename, fn ); } unlock_file ( tmpfilename ); g_free ( tmpfilename ); @@ -359,18 +377,19 @@ static int download( const char *hostname, const char *uri, const char *fn, Down g_free ( file_options.etag ); g_free ( file_options.new_etag ); } - return 0; + return DOWNLOAD_SUCCESS; } -/* success = 0, -1 = couldn't connect, -2 HTTP error, -3 file exists, -4 couldn't write to file... */ -/* uri: like "/uri.html?whatever" */ -/* only reason for the "wrapper" is so we can do redirects. */ -int a_http_download_get_url ( const char *hostname, const char *uri, const char *fn, DownloadMapOptions *opt, void *handle ) +/** + * uri: like "/uri.html?whatever" + * only reason for the "wrapper" is so we can do redirects. + */ +DownloadResult_t a_http_download_get_url ( const char *hostname, const char *uri, const char *fn, DownloadMapOptions *opt, void *handle ) { return download ( hostname, uri, fn, opt, FALSE, handle ); } -int a_ftp_download_get_url ( const char *hostname, const char *uri, const char *fn, DownloadMapOptions *opt, void *handle ) +DownloadResult_t a_ftp_download_get_url ( const char *hostname, const char *uri, const char *fn, DownloadMapOptions *opt, void *handle ) { return download ( hostname, uri, fn, opt, TRUE, handle ); }