Hi,

I hope the following is a reasonable solution for bug 2163652 (GPX
file with byte order mark not parsed).
It simply treats files with ".gpx" extention as gpx files. All other
files, including gpx files without gpx extentions, receive the same
treatment as before.



>From 618510b95c77a6026173b4e6e19196b17ec986dd Mon Sep 17 00:00:00 2001
From: Tal B <tal....@gmail.com>
Date: Sun, 3 May 2009 19:32:35 +0300
Subject: [PATCH] viking bug 2163652 gpx with bom
when loading a file, first check for gpx extention. if no gpx file
extention, follow the previous method of magic numbers.

---
src/file.c | 23 +++++++++++++++++++++--
src/file.h | 1 +
2 files changed, 22 insertions(+), 2 deletions(-)

diff --git a/src/file.c b/src/file.c
index 9978f81..2075de9 100644
--- a/src/file.c
+++ b/src/file.c
@@ -564,6 +564,7 @@ static void xfclose ( FILE *f )
/* 0 on failure, 1 on success (vik file) 2 on success (other file) */
gshort a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar
*filename )
{
+ gboolean is_gpx_file = check_file_ext ( filename, ".gpx" );
FILE *f = xfopen ( filename, "r" );

g_assert ( vp );
@@ -571,7 +572,7 @@ gshort a_file_load ( VikAggregateLayer *top,
VikViewport *vp, const gchar *filen
if ( ! f )
return 0;

- if ( check_magic ( f, VIK_MAGIC ) )
+ if ( !is_gpx_file && check_magic ( f, VIK_MAGIC ) )
{
file_read ( top, f, vp );
if ( f != stdin )
@@ -584,7 +585,7 @@ gshort a_file_load ( VikAggregateLayer *top,
VikViewport *vp, const gchar *filen
VikLayer *vtl = vik_layer_create ( VIK_LAYER_TRW, vp, NULL, FALSE );
vik_layer_rename ( vtl, a_file_basename ( filename ) );

- if ( check_magic ( f, GPX_MAGIC ) )
+ if ( is_gpx_file || check_magic ( f, GPX_MAGIC ) )
a_gpx_read_file ( VIK_TRW_LAYER(vtl), f );
else
a_gpspoint_read_file ( VIK_TRW_LAYER(vtl), f );
@@ -627,6 +628,24 @@ const gchar *a_file_basename ( const gchar *filename
)
return filename;
}

+/* example:
+ gboolean is_gpx = check_file_ext ( "a/b/c.gpx", ".gpx" );
+*/
+gboolean check_file_ext ( const gchar *filename, const gchar *fileext )
+{
+ const gchar *basename = a_file_basename(filename);
+ g_assert( filename );
+ g_assert( fileext && fileext[0]=='.' );
+ if (!basename)
+ return FALSE;
+
+ const char * dot = strrchr(basename, '.');
+ if (dot && !strcmp(dot, fileext))
+ return TRUE;
+
+ return FALSE;
+}
+
gboolean a_file_export ( VikTrwLayer *vtl, const gchar *filename, gshort
file_type )
{
FILE *f = g_fopen ( filename, "w" );
diff --git a/src/file.h b/src/file.h
index 5c06c4a..bbaf230 100644
--- a/src/file.h
+++ b/src/file.h
@@ -33,6 +33,7 @@
#define FILE_TYPE_GPX 3

const gchar *a_file_basename ( const gchar *filename );
+gboolean check_file_ext ( const gchar *filename, const gchar *fileext );

/* 0 on failure, 1 on success (vik file) 2 on success (other file) */
gshort a_file_load ( VikAggregateLayer *top, VikViewport *vp, const gchar
*filename );
-- 
1.6.0.4

------------------------------------------------------------------------------
Register Now & Save for Velocity, the Web Performance & Operations 
Conference from O'Reilly Media. Velocity features a full day of 
expert-led, hands-on workshops and two days of sessions from industry 
leaders in dedicated Performance & Operations tracks. Use code vel09scf 
and Save an extra 15% before 5/3. http://p.sf.net/sfu/velocityconf
_______________________________________________
Viking-devel mailing list
Viking-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/viking-devel
Viking home page: http://viking.sf.net/

Reply via email to