]> git.street.me.uk Git - andy/viking.git/blobdiff - src/dem.c
Fix: Improve internal redrawing method for layer panel updates.
[andy/viking.git] / src / dem.c
index 19b3486ac6e9a811fd384f41c49897713b9f83cc..007a5353ddabdf0065f5947ab13356ccf0f7a1f0 100644 (file)
--- a/src/dem.c
+++ b/src/dem.c
@@ -2,6 +2,7 @@
  * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
  *
  * Copyright (C) 2003-2008, Evan Battaglia <gtoevan@gmx.net>
+ * Copyright (C) 2007, Quy Tonthat <qtonthat@gmail.com>
  *
  * 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
  *
  */
 
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
 #include <stdio.h>
+#ifdef HAVE_STRING_H
 #include <string.h>
+#endif
 #include <glib.h>
+#ifdef HAVE_MATH_H
 #include <math.h>
+#endif
+#ifdef HAVE_STDLIB_H
 #include <stdlib.h>
+#endif
 #include <zlib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include "dem.h"
 #include "file.h"
 
+/* Compatibility */
+#if ! GLIB_CHECK_VERSION(2,22,0)
+#define g_mapped_file_unref g_mapped_file_free
+#endif
+
 #define DEM_BLOCK_SIZE 1024
 #define GET_COLUMN(dem,n) ((VikDEMColumn *)g_ptr_array_index( (dem)->columns, (n) ))
 
@@ -319,6 +335,7 @@ static VikDEM *vik_dem_read_srtm_hgt(const gchar *file_name, const gchar *basena
   gint num_rows;
   GMappedFile *mf;
   gint arcsec;
+  GError *error = NULL;
 
   dem = g_malloc(sizeof(VikDEM));
 
@@ -339,8 +356,9 @@ static VikDEM *vik_dem_read_srtm_hgt(const gchar *file_name, const gchar *basena
   dem->columns = g_ptr_array_new();
   dem->n_columns = 0;
 
-  if ((mf = g_mapped_file_new(file_name, FALSE, NULL)) == NULL) {
-    g_error("%s(): couldn't map temp file\n", __PRETTY_FUNCTION__);
+  if ((mf = g_mapped_file_new(file_name, FALSE, &error)) == NULL) {
+    g_critical(_("Couldn't map file %s: %s"), file_name, error->message);
+    g_error_free(error);
     g_free(dem);
     return NULL;
   }
@@ -352,7 +370,7 @@ static VikDEM *vik_dem_read_srtm_hgt(const gchar *file_name, const gchar *basena
     gulong ucsize;
 
     if ((unzip_mem = unzip_hgt_file(dem_file, &ucsize)) == NULL) {
-      g_mapped_file_free(mf);
+      g_mapped_file_unref(mf);
       g_ptr_array_free(dem->columns, TRUE);
       g_free(dem);
       return NULL;
@@ -368,7 +386,7 @@ static VikDEM *vik_dem_read_srtm_hgt(const gchar *file_name, const gchar *basena
     arcsec = 1;
   else {
     g_warning("%s(): file %s does not have right size", __PRETTY_FUNCTION__, basename);
-    g_mapped_file_free(mf);
+    g_mapped_file_unref(mf);
     g_free(dem);
     return NULL;
   }
@@ -396,7 +414,7 @@ static VikDEM *vik_dem_read_srtm_hgt(const gchar *file_name, const gchar *basena
 
   if (zip)
     g_free(dem_mem);
-  g_mapped_file_free(mf);
+  g_mapped_file_unref(mf);
   return dem;
 }
 
@@ -429,11 +447,14 @@ VikDEM *vik_dem_new_from_file(const gchar *file)
 
       /* Header */
   f = g_fopen(file, "r");
-  if ( !f )
+  if ( !f ) {
+    g_free ( rv );
     return NULL;
+  }
   buffer[fread(buffer, 1, DEM_BLOCK_SIZE, f)] = '\0';
   if ( ! dem_parse_header ( buffer, rv ) ) {
     g_free ( rv );
+    fclose(f);
     return NULL;
   }
   /* TODO: actually use header -- i.e. GET # OF COLUMNS EXPECTED */