]> git.street.me.uk Git - andy/viking.git/blobdiff - src/file.c
Fix CPU usage going to 100% when statusbar items update is called.
[andy/viking.git] / src / file.c
index bfc1fc5436ab0a90975e112560609015c538fd04..06406b89e19bf22dc27c60a3ed3645d76bc66060 100644 (file)
@@ -2,6 +2,7 @@
  * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
  *
  * Copyright (C) 2003-2005, Evan Battaglia <gtoevan@gmx.net>
+ * Copyright (C) 2012, Guilhem Bonnefille <guilhem.bonnefille@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
@@ -565,10 +566,12 @@ static void xfclose ( FILE *f )
  */
 gboolean check_file_magic_vik ( const gchar *filename )
 {
-  gboolean result;
+  gboolean result = FALSE;
   FILE *ff = xfopen ( filename, "r" );
-  result = check_magic ( ff, VIK_MAGIC );
-  xfclose ( ff );
+  if ( ff ) {
+    result = check_magic ( ff, VIK_MAGIC );
+    xfclose ( ff );
+  }
   return result;
 }
 
@@ -595,28 +598,41 @@ VikLoadType_t a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar
   }
   else
   {
+    gboolean success = TRUE;
     VikLayer *vtl = vik_layer_create ( VIK_LAYER_TRW, vp, NULL, FALSE );
-    vik_layer_rename ( vtl, a_file_basename ( filename ) );
 
     // In fact both kml & gpx files start the same as they are in xml
     if ( check_file_ext ( filename, ".kml" ) && check_magic ( f, GPX_MAGIC ) ) {
       // Implicit Conversion
-      if ( ! a_babel_convert_from ( VIK_TRW_LAYER(vtl), "-i kml", NULL, filename, NULL ) ) {
+      if ( ! a_babel_convert_from ( VIK_TRW_LAYER(vtl), "-i kml", filename, NULL, NULL ) ) {
        // Probably want to remove the vtl, but I'm not sure how yet...
        xfclose(f);
        return LOAD_TYPE_GPSBABEL_FAILURE;
       }
     }
     else if ( is_gpx_file || check_magic ( f, GPX_MAGIC ) ) {
-      a_gpx_read_file ( VIK_TRW_LAYER(vtl), f );
+      success = a_gpx_read_file ( VIK_TRW_LAYER(vtl), f );
+      if ( ! success ) {
+        // free up layer
+        g_object_unref ( vtl );
+        xfclose(f);
+        return LOAD_TYPE_GPX_FAILURE;
+      }
     }
     else
-      a_gpspoint_read_file ( VIK_TRW_LAYER(vtl), f );
+      success = a_gpspoint_read_file ( VIK_TRW_LAYER(vtl), f );
 
-    vik_layer_post_read ( vtl, vp, TRUE );
+    // Refuse to load file types not supported
+    if ( ! success ) {
+      // free up layer
+      g_object_unref ( vtl );
+      xfclose(f);
+      return LOAD_TYPE_UNSUPPORTED_FAILURE;
+    }
 
+    vik_layer_rename ( vtl, a_file_basename ( filename ) );
+    vik_layer_post_read ( vtl, vp, TRUE );
     vik_aggregate_layer_add_layer ( top, vtl );
-
     vik_trw_layer_auto_set_view ( VIK_TRW_LAYER(vtl), vp );
 
     xfclose(f);
@@ -674,16 +690,15 @@ gboolean check_file_ext ( const gchar *filename, const gchar *fileext )
   return FALSE;
 }
 
-gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, VikFileType_t file_type, const gchar *trackname )
+gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, VikFileType_t file_type, VikTrack *trk )
 {
   FILE *f = g_fopen ( filename, "w" );
   if ( f )
   {
-    if (trackname) {
-      VikTrack *vt = vik_trw_layer_get_track ( vtl, trackname );
+    if ( trk ) {
       switch ( file_type ) {
         case FILE_TYPE_GPX:
-          a_gpx_write_track_file ( trackname, vt, f );
+          a_gpx_write_track_file ( trk, f );
           break;
         default:
           g_critical("Houston, we've had a problem. file_type=%d", file_type);
@@ -702,8 +717,19 @@ gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, VikFileType_t
         case FILE_TYPE_KML:
          fclose ( f );
          f = NULL;
-          return a_babel_convert_to ( vtl, "-o kml", NULL, filename, NULL );
-          break;
+         switch ( a_vik_get_kml_export_units () ) {
+           case VIK_KML_EXPORT_UNITS_STATUTE:
+             return a_babel_convert_to ( vtl, "-o kml", filename, NULL, NULL );
+             break;
+           case VIK_KML_EXPORT_UNITS_NAUTICAL:
+             return a_babel_convert_to ( vtl, "-o kml,units=n", filename, NULL, NULL );
+             break;
+           default:
+             // VIK_KML_EXPORT_UNITS_METRIC:
+             return a_babel_convert_to ( vtl, "-o kml,units=m", filename, NULL, NULL );
+             break;
+         }
+         break;
         default:
           g_critical("Houston, we've had a problem. file_type=%d", file_type);
       }
@@ -715,36 +741,3 @@ gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, VikFileType_t
   return FALSE;
 }
 
-const gchar *a_get_viking_dir()
-{
-  static gchar *viking_dir = NULL;
-
-  // TODO: use g_get_user_config_dir ?
-
-  if (!viking_dir) {
-    const gchar *home = g_getenv("HOME");
-    if (!home || g_access(home, W_OK))
-      home = g_get_home_dir ();
-#ifdef HAVE_MKDTEMP
-    if (!home || g_access(home, W_OK))
-    {
-      static gchar temp[] = {"/tmp/vikXXXXXX"};
-      home = mkdtemp(temp);
-    }
-#endif
-    if (!home || g_access(home, W_OK))
-      /* Fatal error */
-      g_critical("Unable to find a base directory");
-
-    /* Build the name of the directory */
-#ifdef __APPLE__
-    viking_dir = g_build_filename(home, "/Library/Application Support/Viking", NULL);
-#else
-    viking_dir = g_build_filename(home, ".viking", NULL);
-#endif
-    if (g_file_test(viking_dir, G_FILE_TEST_EXISTS) == FALSE)
-      g_mkdir(viking_dir, 0755);
-  }
-
-  return viking_dir;
-}