/** * 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 && ! a_file_check_ext ( filename, ext ) ) new_name = g_strconcat ( filename, ext, NULL ); else /* Simply duplicate */ new_name = g_strdup ( filename ); return new_name; }
/** * a_jpg_magic_check: * @filename: The file * * Returns: Whether the file is a JPG. * Uses Magic library if available to determine the jpgness. * Otherwise uses a rudimentary extension name check. */ gboolean a_jpg_magic_check ( const gchar *filename ) { gboolean is_jpg = FALSE; #ifdef HAVE_MAGIC_H magic_t myt = magic_open ( MAGIC_CONTINUE|MAGIC_ERROR|MAGIC_MIME ); if ( myt ) { #ifdef WINDOWS // We have to 'package' the magic database ourselves :( // --> %PROGRAM FILES%\Viking\magic.mgc magic_load ( myt, "magic.mgc" ); #else // Use system default magic_load ( myt, NULL ); #endif const char* magic = magic_file (myt, filename); g_debug ( "%s:%s", __FUNCTION__, magic ); if ( g_ascii_strncasecmp (magic, "image/jpeg", 10) == 0 ) is_jpg = TRUE; magic_close ( myt ); } else #endif is_jpg = a_file_check_ext ( filename, ".jpg" ); return is_jpg; }
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 ); char *filename = (char *)filename_or_uri; if (strncmp(filename, "file://", 7) == 0) { // Consider replacing this with: // filename = g_filename_from_uri ( entry, NULL, NULL ); // Since this doesn't support URIs properly (i.e. will failure if is it has %20 characters in it) filename = filename + 7; g_debug ( "Loading file %s from URI %s", filename, filename_or_uri ); } FILE *f = xfopen ( filename ); if ( ! f ) return LOAD_TYPE_READ_FAILURE; VikLoadType_t load_answer = LOAD_TYPE_OTHER_SUCCESS; gchar *dirpath = g_path_get_dirname ( filename ); // Attempt loading the primary file type first - our internal .vik file: if ( check_magic ( f, VIK_MAGIC ) ) { if ( file_read ( top, f, dirpath, vp ) ) load_answer = LOAD_TYPE_VIK_SUCCESS; else load_answer = LOAD_TYPE_VIK_FAILURE_NON_FATAL; } else if ( a_jpg_magic_check ( filename ) ) { if ( ! a_jpg_load_file ( top, filename, vp ) ) load_answer = LOAD_TYPE_UNSUPPORTED_FAILURE; } else { // For all other file types which consist of tracks, routes and/or waypoints, // must be loaded into a new TrackWaypoint layer (hence it be created) gboolean success = TRUE; // Detect load failures - mainly to remove the layer created as it's not required VikLayer *vtl = vik_layer_create ( VIK_LAYER_TRW, vp, FALSE ); vik_layer_rename ( vtl, a_file_basename ( filename ) ); // In fact both kml & gpx files start the same as they are in xml if ( a_file_check_ext ( filename, ".kml" ) && check_magic ( f, GPX_MAGIC ) ) { // Implicit Conversion if ( ! ( success = a_babel_convert_from ( VIK_TRW_LAYER(vtl), "-i kml", filename, NULL, NULL, NULL ) ) ) { load_answer = LOAD_TYPE_GPSBABEL_FAILURE; } } // NB use a extension check first, as a GPX file header may have a Byte Order Mark (BOM) in it // - which currently confuses our check_magic function else if ( a_file_check_ext ( filename, ".gpx" ) || check_magic ( f, GPX_MAGIC ) ) { if ( ! ( success = a_gpx_read_file ( VIK_TRW_LAYER(vtl), f ) ) ) { load_answer = LOAD_TYPE_GPX_FAILURE; } } else { // Try final supported file type if ( ! ( success = a_gpspoint_read_file ( VIK_TRW_LAYER(vtl), f, dirpath ) ) ) { // Failure here means we don't know how to handle the file load_answer = LOAD_TYPE_UNSUPPORTED_FAILURE; } } g_free ( dirpath ); // Clean up when we can't handle the file if ( ! success ) { // free up layer g_object_unref ( vtl ); } else { // Complete the setup from the successful load vik_layer_post_read ( vtl, vp, TRUE ); vik_aggregate_layer_add_layer ( top, vtl, FALSE ); vik_trw_layer_auto_set_view ( VIK_TRW_LAYER(vtl), vp ); } } xfclose(f); return load_answer; }