]> git.street.me.uk Git - andy/viking.git/blobdiff - src/download.c
Make simple GPSBabel filter options use the updated acquire framework options.
[andy/viking.git] / src / download.c
index 2e80ba56a4db05bfc1a950f97d6fa998de4f4c5f..ef75b02f3b4d4bf9c5d18c246567e26f0977a055 100644 (file)
@@ -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 );
 }