* 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
*/
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;
}
}
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);
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);
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);
}
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;
-}