X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/e0b9ef7a6cb4a0f130ead5a2a0bd78efebdf20a2..e6e277a8dade98b02fcda1b89af0e324156feffc:/src/vikgotoxmltool.c diff --git a/src/vikgotoxmltool.c b/src/vikgotoxmltool.c index 07800a46..2b0f6d51 100644 --- a/src/vikgotoxmltool.c +++ b/src/vikgotoxmltool.c @@ -18,7 +18,6 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * - * Created by Quy Tonthat */ #ifdef HAVE_CONFIG_H #include "config.h" @@ -27,7 +26,7 @@ #include #include #ifdef HAVE_MATH_H -#include "math.h" +#include #endif #include #include @@ -107,6 +106,7 @@ _goto_xml_tool_set_property (GObject *object, { VikGotoXmlTool *self = VIK_GOTO_XML_TOOL (object); VikGotoXmlToolPrivate *priv = GOTO_XML_TOOL_GET_PRIVATE (self); + gchar **splitted = NULL; switch (property_id) { @@ -116,23 +116,53 @@ _goto_xml_tool_set_property (GObject *object, break; case PROP_LAT_PATH: + splitted = g_strsplit (g_value_get_string (value), "@", 2); g_free (priv->lat_path); - priv->lat_path = g_value_dup_string (value); + priv->lat_path = splitted[0]; + if (splitted[1]) + { + g_object_set (object, "lat-attr", splitted[1], NULL); + g_free (splitted[1]); + } + /* only free the tab, not the strings */ + g_free (splitted); + splitted = NULL; break; case PROP_LAT_ATTR: - g_free (priv->lat_attr); - priv->lat_attr = g_value_dup_string (value); + /* Avoid to overwrite XPATH value */ + /* NB: This disable future overwriting, + but as property is CONSTRUCT_ONLY there is no matter */ + if (!priv->lat_attr || g_value_get_string (value)) + { + g_free (priv->lat_attr); + priv->lat_attr = g_value_dup_string (value); + } break; case PROP_LON_PATH: + splitted = g_strsplit (g_value_get_string (value), "@", 2); g_free (priv->lon_path); - priv->lon_path = g_value_dup_string (value); + priv->lon_path = splitted[0]; + if (splitted[1]) + { + g_object_set (object, "lon-attr", splitted[1], NULL); + g_free (splitted[1]); + } + /* only free the tab, not the strings */ + g_free (splitted); + splitted = NULL; break; case PROP_LON_ATTR: - g_free (priv->lon_attr); - priv->lon_attr = g_value_dup_string (value); + /* Avoid to overwrite XPATH value */ + /* NB: This disable future overwriting, + but as property is CONSTRUCT_ONLY there is no matter */ + if (!priv->lon_attr || g_value_get_string (value)) + { + g_free (priv->lon_attr); + priv->lon_attr = g_value_dup_string (value); + } break; default: @@ -367,11 +397,16 @@ static gboolean _goto_xml_tool_parse_file_for_latlon(VikGotoTool *self, gchar *filename, struct LatLon *ll) { GMarkupParser xml_parser; - GMarkupParseContext *xml_context; - GError *error; + GMarkupParseContext *xml_context = NULL; + GError *error = NULL; VikGotoXmlToolPrivate *priv = GOTO_XML_TOOL_GET_PRIVATE (self); g_return_val_if_fail(priv != NULL, FALSE); + g_debug ("%s: %s@%s, %s@%s", + __FUNCTION__, + priv->lat_path, priv->lat_attr, + priv->lon_path, priv->lon_attr); + FILE *file = g_fopen (filename, "r"); if (file == NULL) /* TODO emit warning */ @@ -400,16 +435,28 @@ _goto_xml_tool_parse_file_for_latlon(VikGotoTool *self, gchar *filename, struct gchar buff[BUFSIZ]; size_t nb; - while ((nb = fread (buff, sizeof(gchar), BUFSIZ, file)) > 0) + while (xml_context && + (nb = fread (buff, sizeof(gchar), BUFSIZ, file)) > 0) { if (!g_markup_parse_context_parse(xml_context, buff, nb, &error)) - fprintf(stderr, "%s: parsing error.\n", __FUNCTION__); + { + fprintf(stderr, "%s: parsing error: %s.\n", + __FUNCTION__, error->message); + g_markup_parse_context_free(xml_context); + xml_context = NULL; + } + g_clear_error (&error); } /* cleanup */ - if (!g_markup_parse_context_end_parse(xml_context, &error)) - fprintf(stderr, "%s: errors occurred reading file.\n", __FUNCTION__); + if (xml_context && + !g_markup_parse_context_end_parse(xml_context, &error)) + fprintf(stderr, "%s: errors occurred while reading file: %s.\n", + __FUNCTION__, error->message); + g_clear_error (&error); - g_markup_parse_context_free(xml_context); + if (xml_context) + g_markup_parse_context_free(xml_context); + xml_context = NULL; fclose (file); if (ll != NULL)