X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/8853eed92957ede374f023148da0a75e4c8b82e1..45da1f2f3f75619ba2e551be754223c9da97d267:/src/download.c?ds=sidebyside diff --git a/src/download.c b/src/download.c index 931f8cca..dd129d2d 100644 --- a/src/download.c +++ b/src/download.c @@ -2,6 +2,7 @@ * viking -- GPS Data and Topo Analyzer, Explorer, and Manager * * Copyright (C) 2003-2005, Evan Battaglia + * Copyright (C) 2007, Guilhem Bonnefille * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -124,7 +125,7 @@ static gboolean lock_file(const char *fn) { gboolean locked = FALSE; g_mutex_lock(file_list_mutex); - if (g_list_find(file_list, fn) == NULL) + if (g_list_find_custom(file_list, fn, (GCompareFunc)g_strcmp0) == NULL) { // The filename is not yet locked file_list = g_list_append(file_list, (gpointer)fn), @@ -158,19 +159,35 @@ static int download( const char *hostname, const char *uri, const char *fn, Down return -3; } + time_t tile_age = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "download_tile_age")->u; + /* Get the modified time of this file */ + struct stat buf; + g_stat ( fn, &buf ); + time_t file_time = buf.st_mtime; + if ( (time(NULL) - file_time) < tile_age ) { + /* File cache is too recent, so return */ + return -3; + } + if (options->check_file_server_time) { - time_t tile_age = a_preferences_get(VIKING_PREFERENCES_NAMESPACE "download_tile_age")->u; - /* Get the modified time of this file */ - struct stat buf; - g_stat ( fn, &buf ); - file_options.time_condition = buf.st_mtime; - if ( (time(NULL) - file_options.time_condition) < tile_age ) - /* File cache is too recent, so return */ - return -3; + file_options.time_condition = file_time; } if (options->use_etag) { - file_options.etag = g_strdup_printf (""); + gchar *etag_filename = g_strdup_printf("%s.etag", fn); + gsize etag_length = 0; + g_file_get_contents (etag_filename, &(file_options.etag), &etag_length, NULL); + g_free (etag_filename); + etag_filename = NULL; + + /* check if etag is short enough */ + if (etag_length > 100) { + g_free(file_options.etag); + file_options.etag = NULL; + } + + /* TODO: should check that etag is a valid string */ } + } else { gchar *dir = g_path_get_dirname ( fn ); g_mkdir_with_parents ( dir , 0777 ); @@ -182,12 +199,16 @@ static int download( const char *hostname, const char *uri, const char *fn, Down { g_debug("%s: Couldn't take lock on temporary file \"%s\"\n", __FUNCTION__, tmpfilename); g_free ( tmpfilename ); + if (options->use_etag) + g_free ( file_options.etag ); return -4; } f = g_fopen ( tmpfilename, "w+b" ); /* truncate file and open it */ if ( ! f ) { g_warning("Couldn't open temporary file \"%s\": %s", tmpfilename, g_strerror(errno)); g_free ( tmpfilename ); + if (options->use_etag) + g_free ( file_options.etag ); return -4; } @@ -224,7 +245,10 @@ static int download( const char *hostname, const char *uri, const char *fn, Down if (options->use_etag) { if (file_options.new_etag) { /* server returned an etag value */ - printf("got etag %s\n", file_options.new_etag); + gchar *etag_filename = g_strdup_printf("%s.etag", fn); + g_file_set_contents (etag_filename, file_options.new_etag, -1, NULL); + g_free (etag_filename); + etag_filename = NULL; } } @@ -235,8 +259,9 @@ static int download( const char *hostname, const char *uri, const char *fn, Down #else utimes ( fn, NULL ); /* update mtime of local copy */ #endif - } else + } else { g_rename ( tmpfilename, fn ); /* move completely-downloaded file to permanent location */ + } unlock_file ( tmpfilename ); g_free ( tmpfilename );