#include "viking.h"
+#include "gpx.h"
+
#include <string.h>
#include <stdlib.h>
#define TEST_BOOLEAN(str) (! ((str)[0] == '\0' || (str)[0] == '0' || (str)[0] == 'n' || (str)[0] == 'N' || (str)[0] == 'f' || (str)[0] == 'F') )
#define VIK_MAGIC "#VIK"
+#define GPX_MAGIC "<?xm"
#define VIK_MAGIC_LEN 4
#ifdef WINDOWS
*stack = tmp;
}
-static gboolean is_viking_file ( FILE *f )
+static gboolean check_magic ( FILE *f, const gchar *magic_number )
{
gchar magic[VIK_MAGIC_LEN];
gboolean rv = FALSE;
gint8 i;
if ( fread(magic, 1, sizeof(magic), f) == sizeof(magic) &&
- strncmp(magic, VIK_MAGIC, sizeof(magic)) == 0 )
+ strncmp(magic, magic_number, sizeof(magic)) == 0 )
rv = TRUE;
for ( i = sizeof(magic)-1; i >= 0; i-- ) /* the ol' pushback */
ungetc(magic[i],f);
fprintf ( f, "%s=", params[i].name );
switch ( params[i].type )
{
- case VIK_LAYER_PARAM_DOUBLE: fprintf ( f, "%f\n", data.d ); break;
+ case VIK_LAYER_PARAM_DOUBLE: {
+// char buf[15]; /* locale independent */
+// fprintf ( f, "%s\n", (char *) g_dtostr (data.d, buf, sizeof (buf)) ); break;
+ fprintf ( f, "%f\n", data.d );
+ break;
+ }
case VIK_LAYER_PARAM_UINT: fprintf ( f, "%d\n", data.u ); break;
case VIK_LAYER_PARAM_INT: fprintf ( f, "%d\n", data.i ); break;
case VIK_LAYER_PARAM_BOOLEAN: fprintf ( f, "%c\n", data.b ? 't' : 'f' ); break;
default: modestring = "mercator";
}
- fprintf ( f, "#VIKING GPS Data file http://gpsmaps.org/viking/\n\nxmpp=%f\nympp=%f\nlat=%f\nlon=%f\nmode=%s\ncolor=%s\n",
+ fprintf ( f, "#VIKING GPS Data file " VIKING_URL "\n\nxmpp=%f\nympp=%f\nlat=%f\nlon=%f\nmode=%s\ncolor=%s\ndrawscale=%s\n",
vik_viewport_get_xmpp ( VIK_VIEWPORT(vp) ), vik_viewport_get_ympp ( VIK_VIEWPORT(vp) ), ll.lat, ll.lon,
- modestring, vik_viewport_get_background_color(VIK_VIEWPORT(vp)) );
+ modestring, vik_viewport_get_background_color(VIK_VIEWPORT(vp)),
+ vik_viewport_get_draw_scale(VIK_VIEWPORT(vp)) ? "t" : "f" );
if ( ! VIK_LAYER(top)->visible )
fprintf ( f, "visible=f\n" );
vik_viewport_set_drawmode ( VIK_VIEWPORT(vp), VIK_VIEWPORT_DRAWMODE_MERCATOR );
else if ( stack->under == NULL && eq_pos == 5 && strncasecmp ( line, "color", eq_pos ) == 0 )
vik_viewport_set_background_color ( VIK_VIEWPORT(vp), line+6 );
+ else if ( stack->under == NULL && eq_pos == 9 && strncasecmp ( line, "drawscale", eq_pos ) == 0 )
+ vik_viewport_set_draw_scale ( VIK_VIEWPORT(vp), TEST_BOOLEAN(line+10) );
else if ( stack->under && eq_pos == 4 && strncasecmp ( line, "name", eq_pos ) == 0 )
vik_layer_rename ( VIK_LAYER(stack->data), line+5 );
else if ( eq_pos == 7 && strncasecmp ( line, "visible", eq_pos ) == 0 )
break;
}
if ( ! found_match )
- g_warning ( "Line %ld: Unknown parameter", line_num );
+ g_warning ( "Line %ld: Unknown parameter. Line:\n%s", line_num, line );
}
else
g_warning ( "Line %ld: Invalid parameter or parameter outside of layer.", line_num );
if ( ! f )
return 0;
- if ( is_viking_file ( f ) )
+ if ( check_magic ( f, VIK_MAGIC ) )
{
file_read ( top, f, vp );
if ( f != stdin )
VikCoord new_center;
VikLayer *vtl = vik_layer_create ( VIK_LAYER_TRW, vp, NULL, FALSE );
vik_layer_rename ( vtl, a_file_basename ( filename ) );
- // a_gpspoint_read_file ( VIK_TRW_LAYER(vtl), f );
- a_gpx_read_file ( VIK_TRW_LAYER(vtl), f );
+
+ if ( check_magic ( f, GPX_MAGIC ) )
+ a_gpx_read_file ( VIK_TRW_LAYER(vtl), f );
+ else
+ a_gpspoint_read_file ( VIK_TRW_LAYER(vtl), f );
vik_layer_post_read ( vtl, vp );
{
if ( file_type == FILE_TYPE_GPSMAPPER )
a_gpsmapper_write_file ( vtl, f );
+ else if ( file_type == FILE_TYPE_GPX )
+ a_gpx_write_file ( vtl, f );
else
a_gpspoint_write_file ( vtl, f );
fclose ( f );