X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/34e71b99e03119ecc9b644595f66d2c0f86f9ac2..e8bab170981ff0e1cd572107ca4de122d4aafe8c:/src/vikgototool.c diff --git a/src/vikgototool.c b/src/vikgototool.c index e5692e02..fa5d263d 100644 --- a/src/vikgototool.c +++ b/src/vikgototool.c @@ -24,18 +24,19 @@ #endif #include "vikgototool.h" +#include "util.h" #include +#include #include - -static void goto_tool_class_init ( VikGotoToolClass *klass ); -static void goto_tool_init ( VikGotoTool *vlp ); +#include static GObjectClass *parent_class; static void goto_tool_finalize ( GObject *gob ); static gchar *goto_tool_get_label ( VikGotoTool *vw ); +static DownloadMapOptions *goto_tool_get_download_options ( VikGotoTool *self ); typedef struct _VikGotoToolPrivate VikGotoToolPrivate; @@ -49,29 +50,7 @@ struct _VikGotoToolPrivate VIK_GOTO_TOOL_TYPE, \ VikGotoToolPrivate)) -GType vik_goto_tool_get_type() -{ - static GType w_type = 0; - - if (!w_type) - { - static const GTypeInfo w_info = - { - sizeof (VikGotoToolClass), - NULL, /* base_init */ - NULL, /* base_finalize */ - (GClassInitFunc) goto_tool_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (VikGotoTool), - 0, - (GInstanceInitFunc) goto_tool_init, - }; - w_type = g_type_register_static ( G_TYPE_OBJECT, "VikGotoTool", &w_info, G_TYPE_FLAG_ABSTRACT ); - } - - return w_type; -} +G_DEFINE_ABSTRACT_TYPE (VikGotoTool, vik_goto_tool, G_TYPE_OBJECT) enum { @@ -136,7 +115,7 @@ goto_tool_get_property (GObject *object, } } -static void goto_tool_class_init ( VikGotoToolClass *klass ) +static void vik_goto_tool_class_init ( VikGotoToolClass *klass ) { GObjectClass *gobject_class; GParamSpec *pspec; @@ -167,6 +146,7 @@ static void goto_tool_class_init ( VikGotoToolClass *klass ) pspec); klass->get_label = goto_tool_get_label; + klass->get_download_options = goto_tool_get_download_options; parent_class = g_type_class_peek_parent (klass); @@ -178,7 +158,7 @@ VikGotoTool *vik_goto_tool_new () return VIK_GOTO_TOOL ( g_object_new ( VIK_GOTO_TOOL_TYPE, NULL ) ); } -static void goto_tool_init ( VikGotoTool *self ) +static void vik_goto_tool_init ( VikGotoTool *self ) { VikGotoToolPrivate *priv = GOTO_TOOL_GET_PRIVATE (self); priv->label = NULL; @@ -198,12 +178,61 @@ static gchar *goto_tool_get_label ( VikGotoTool *self ) return g_strdup ( priv->label ); } -gchar *vik_goto_tool_get_label ( VikGotoTool *w ) +static DownloadMapOptions *goto_tool_get_download_options ( VikGotoTool *self ) +{ + // Default: return NULL + return NULL; +} + +gchar *vik_goto_tool_get_label ( VikGotoTool *self ) +{ + return VIK_GOTO_TOOL_GET_CLASS( self )->get_label( self ); +} + +gchar *vik_goto_tool_get_url_format ( VikGotoTool *self ) { - return VIK_GOTO_TOOL_GET_CLASS( w )->get_label( w ); + return VIK_GOTO_TOOL_GET_CLASS( self )->get_url_format( self ); +} + +DownloadMapOptions *vik_goto_tool_get_download_options ( VikGotoTool *self ) +{ + return VIK_GOTO_TOOL_GET_CLASS( self )->get_download_options( self ); +} + +gboolean vik_goto_tool_parse_file_for_latlon (VikGotoTool *self, gchar *filename, struct LatLon *ll) +{ + return VIK_GOTO_TOOL_GET_CLASS( self )->parse_file_for_latlon( self, filename, ll ); } int vik_goto_tool_get_coord ( VikGotoTool *self, VikWindow *vw, VikViewport *vvp, gchar *srch_str, VikCoord *coord ) { - return VIK_GOTO_TOOL_GET_CLASS( self )->get_coord( self, vw, vvp, srch_str, coord ); + gchar *tmpname; + gchar *uri; + gchar *escaped_srch_str; + int ret = 0; /* OK */ + struct LatLon ll; + + g_debug("%s: raw goto: %s", __FUNCTION__, srch_str); + + escaped_srch_str = uri_escape(srch_str); + + g_debug("%s: escaped goto: %s", __FUNCTION__, escaped_srch_str); + + uri = g_strdup_printf(vik_goto_tool_get_url_format(self), escaped_srch_str); + + tmpname = a_download_uri_to_tmp_file ( uri, vik_goto_tool_get_download_options(self) ); + + g_debug("%s: %s", __FILE__, tmpname); + if (!vik_goto_tool_parse_file_for_latlon(self, tmpname, &ll)) { + ret = -1; + goto done; + } + vik_coord_load_from_latlon ( coord, vik_viewport_get_coord_mode(vvp), &ll ); + +done: + g_free(escaped_srch_str); + g_free(uri); + util_remove(tmpname); + g_free(tmpname); + return ret; }