X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/a7023a1b43a8052fccc4ded7fbfc3a7e1132002f..50843c96920d8d1a56140deed00bb3d1792038ed:/src/download.c?ds=sidebyside diff --git a/src/download.c b/src/download.c index 1da110d0..3660fa18 100644 --- a/src/download.c +++ b/src/download.c @@ -1,8 +1,10 @@ +/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */ /* * viking -- GPS Data and Topo Analyzer, Explorer, and Manager * * Copyright (C) 2003-2005, Evan Battaglia * Copyright (C) 2007, Guilhem Bonnefille + * Copyright (C) 2013, Rob Norris * * 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 @@ -38,6 +40,10 @@ #include #include +#ifdef HAVE_MAGIC_H +#include +#endif +#include "compression.h" #include "download.h" @@ -104,18 +110,30 @@ static GList *file_list = NULL; static GMutex *file_list_mutex = NULL; /* spin button scales */ -VikLayerParamScale params_scales[] = { - {1, 86400*7, 60, 0}, /* download_tile_age */ +static VikLayerParamScale params_scales[] = { + {1, 365, 1, 0}, /* download_tile_age */ }; +static VikLayerParamData convert_to_display ( VikLayerParamData value ) +{ + // From seconds into days + return VIK_LPD_UINT ( value.u / 86400 ); +} + +static VikLayerParamData convert_to_internal ( VikLayerParamData value ) +{ + // From days into seconds + return VIK_LPD_UINT ( 86400 * value.u ); +} + static VikLayerParam prefs[] = { - { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "download_tile_age", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Tile age (s):"), VIK_LAYER_WIDGET_SPINBUTTON, ¶ms_scales[0], NULL, NULL }, + { VIK_LAYER_NUM_TYPES, VIKING_PREFERENCES_NAMESPACE "download_tile_age", VIK_LAYER_PARAM_UINT, VIK_LAYER_GROUP_NONE, N_("Tile age (days):"), VIK_LAYER_WIDGET_SPINBUTTON, ¶ms_scales[0], NULL, NULL, NULL, convert_to_display, convert_to_internal }, }; void a_download_init (void) { VikLayerParamData tmp; - tmp.u = VIK_CONFIG_DEFAULT_TILE_AGE; + tmp.u = VIK_CONFIG_DEFAULT_TILE_AGE / 86400; // Now in days a_preferences_register(prefs, tmp, VIKING_PREFERENCES_GROUP_KEY); file_list_mutex = g_mutex_new(); @@ -142,6 +160,83 @@ static void unlock_file(const char *fn) g_mutex_unlock(file_list_mutex); } + +static void uncompress_zip ( gchar *name ) +{ + GError *error = NULL; + GMappedFile *mf; + + if ((mf = g_mapped_file_new ( name, FALSE, &error )) == NULL) { + g_critical(_("Couldn't map file %s: %s"), name, error->message); + g_error_free(error); + return; + } + gchar *file_contents = g_mapped_file_get_contents ( mf ); + + void *unzip_mem = NULL; + gulong ucsize; + + if ((unzip_mem = unzip_file (file_contents, &ucsize)) == NULL) { + g_mapped_file_unref ( mf ); + return; + } + + // This overwrires any previous file contents + if ( ! g_file_set_contents ( name, unzip_mem, ucsize, &error ) ) { + g_critical ( "Couldn't write file '%s', because of %s", name, error->message ); + g_error_free ( error ); + } +} + +/** + * a_try_decompress_file: + * @name: The potentially compressed filename + * + * Perform magic to decide how which type of decompression to attempt + */ +void a_try_decompress_file (gchar *name) +{ +#ifdef HAVE_MAGIC_H + magic_t myt = magic_open ( MAGIC_CONTINUE|MAGIC_ERROR|MAGIC_MIME ); + 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 ); + + if ( g_strcmp0 (magic, "application/zip; charset=binary") == 0 ) + zip = TRUE; + + if ( g_strcmp0 (magic, "application/x-bzip2; charset=binary") == 0 ) + bzip2 = TRUE; + + magic_close ( myt ); + } + + if ( !(zip || bzip2) ) + return; + + if ( zip ) { + uncompress_zip ( name ); + } + else if ( bzip2 ) { + gchar* bz2_name = uncompress_bzip2 ( name ); + g_remove ( name ); + g_rename ( bz2_name, name ); + } + + return; +#endif +} + static int download( const char *hostname, const char *uri, const char *fn, DownloadMapOptions *options, gboolean ftp, void *handle) { FILE *f; @@ -241,6 +336,9 @@ static int download( const char *hostname, const char *uri, const char *fn, Down return -1; } + if ( options->convert_file ) + options->convert_file ( tmpfilename ); + if (options->use_etag) { if (file_options.new_etag) { /* server returned an etag value */