]> git.street.me.uk Git - andy/viking.git/blobdiff - src/dems.c
Fix: crash when dealing with non-compressed DEM files
[andy/viking.git] / src / dems.c
index 5052411536c1024fead3bb25ade1ede49980356a..08605e0d263b64aa957177cda5c19429723740c1 100644 (file)
@@ -1,6 +1,28 @@
+/*
+ * 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
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ *
+ */
 #include <glib.h>
 
 #include "dems.h"
+#include "background.h"
 
 typedef struct {
   VikDEM *dem;
@@ -52,8 +74,11 @@ VikDEM *a_dems_load(const gchar *filename)
 void a_dems_unref(const gchar *filename)
 {
   LoadedDEM *ldem = (LoadedDEM *) g_hash_table_lookup ( loaded_dems, filename );
-  g_assert ( ldem );
-  ldem->ref_count --;
+  if ( !ldem ) {
+    /* This is fine - probably means the loaded list was aborted / not completed for some reason */
+    return;
+  }
+  ldem->ref_count--;
   if ( ldem->ref_count == 0 )
     g_hash_table_remove ( loaded_dems, filename );
 }
@@ -82,9 +107,11 @@ VikDEM *a_dems_get(const gchar *filename)
  * we need to know that they weren't referenced though when we
  * do the a_dems_list_free().
  */
-void a_dems_load_list ( GList **dems )
+int a_dems_load_list ( GList **dems, gpointer threaddata )
 {
   GList *iter = *dems;
+  guint dem_count = 0;
+  const guint dem_total = g_list_length ( *dems );
   while ( iter ) {
     if ( ! a_dems_load((const gchar *) (iter->data)) ) {
       GList *iter_temp = iter->next;
@@ -94,7 +121,16 @@ void a_dems_load_list ( GList **dems )
     } else {
       iter = iter->next;
     }
+    /* When running a thread - inform of progress */
+    if ( threaddata ) {
+      dem_count++;
+      /* NB Progress also detects abort request via the returned value */
+      int result = a_background_thread_progress ( threaddata, ((gdouble)dem_count) / dem_total );
+      if ( result != 0 )
+       return -1; /* Abort thread */
+    }
   }
+  return 0;
 }
 
 /* Takes a string list (GList of strings) of dems (filenames).