]> git.street.me.uk Git - andy/viking.git/blobdiff - src/file.c
SF Feature#49: Export via GPSBabel
[andy/viking.git] / src / file.c
index f3f9b4c0ce146a48199b9859a4c775d382f5511d..ec9e4f33ec361d2dabcc86bc3b7e1efb97de90f7 100644 (file)
@@ -603,6 +603,44 @@ gboolean check_file_magic_vik ( const gchar *filename )
   return result;
 }
 
+/**
+ * append_file_ext:
+ *
+ * Append a file extension, if not already present.
+ *
+ * Returns: a newly allocated string
+ */
+gchar *append_file_ext ( const gchar *filename, VikLoadType_t type )
+{
+  gchar *new_name = NULL;
+  const gchar *ext = NULL;
+
+  /* Select an extension */
+  switch (type)
+  {
+  case FILE_TYPE_GPX:
+    ext = ".gpx";
+    break;
+  case FILE_TYPE_KML:
+    ext = ".kml";
+    break;
+  case FILE_TYPE_GPSMAPPER:
+  case FILE_TYPE_GPSPOINT:
+  default:
+    /* Do nothing, ext already set to NULL */
+    break;
+  }
+
+  /* Do */
+  if ( ext != NULL && ! check_file_ext ( filename, ext ) )
+    new_name = g_strconcat ( filename, ext, NULL );
+  else
+    /* Simply duplicate */
+    new_name = g_strdup ( filename );
+
+  return new_name;
+}
+
 VikLoadType_t a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar *filename_or_uri )
 {
   g_return_val_if_fail ( vp != NULL, LOAD_TYPE_READ_FAILURE );
@@ -620,25 +658,33 @@ VikLoadType_t a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar
   if ( ! f )
     return LOAD_TYPE_READ_FAILURE;
 
-  // Enables relative paths in a .vik file to work
-  // Also allows us to remember what directory we where using
-  gchar *dir = g_path_get_dirname ( filename );
-  if ( dir ) {
-    if ( g_chdir ( dir ) ) {
-      g_warning ( "Could not change directory to %s", dir );
-    }
-    g_free (dir);
-  }
-
   VikLoadType_t load_answer = LOAD_TYPE_OTHER_SUCCESS;
 
   // Attempt loading the primary file type first - our internal .vik file:
   if ( check_magic ( f, VIK_MAGIC ) )
   {
+    // Enables relative paths in a .vik file to work
+    gchar *cwd = g_get_current_dir();
+    gchar *dir = g_path_get_dirname ( filename );
+    if ( dir ) {
+      if ( g_chdir ( dir ) ) {
+        g_warning ( "Could not change directory to %s", dir );
+      }
+      g_free (dir);
+    }
+
     if ( file_read ( top, f, vp ) )
       load_answer = LOAD_TYPE_VIK_SUCCESS;
     else
       load_answer = LOAD_TYPE_VIK_FAILURE_NON_FATAL;
+
+    // Restore previous working directory
+    if ( cwd ) {
+      if ( g_chdir ( cwd ) ) {
+        g_warning ( "Could not return to directory %s", cwd );
+      }
+      g_free (cwd);
+    }
   }
   else
   {
@@ -700,7 +746,7 @@ gboolean a_file_save ( VikAggregateLayer *top, gpointer vp, const gchar *filenam
     return FALSE;
 
   // Enable relative paths in .vik files to work
-  // Also allows us to remember what directory we where using
+  gchar *cwd = g_get_current_dir();
   gchar *dir = g_path_get_dirname ( filename );
   if ( dir ) {
     if ( g_chdir ( dir ) ) {
@@ -711,6 +757,14 @@ gboolean a_file_save ( VikAggregateLayer *top, gpointer vp, const gchar *filenam
 
   file_write ( top, f, vp );
 
+  // Restore previous working directory
+  if ( cwd ) {
+    if ( g_chdir ( cwd ) ) {
+      g_warning ( "Could not return to directory %s", cwd );
+    }
+    g_free (cwd);
+  }
+
   fclose(f);
   f = NULL;
 
@@ -812,6 +866,22 @@ gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, VikFileType_t
   return FALSE;
 }
 
+/**
+ * a_file_export_babel:
+ */
+gboolean a_file_export_babel ( VikTrwLayer *vtl, const gchar *filename, const gchar *format,
+                               gboolean tracks, gboolean routes, gboolean waypoints )
+{
+  gchar *args = g_strdup_printf("%s %s %s -o %s",
+                                tracks ? "-t" : "",
+                                routes ? "-r" : "",
+                                waypoints ? "-w" : "",
+                                format);
+  gboolean result = a_babel_convert_to ( vtl, NULL, args, filename, NULL, NULL );
+  g_free(args);
+  return result;
+}
+
 /**
  * Just a wrapper around realpath, which itself is platform dependent
  */