]> git.street.me.uk Git - andy/viking.git/blobdiff - src/vikroutingwebengine.c
Tidy up type usage
[andy/viking.git] / src / vikroutingwebengine.c
index 4377a2232f436c1b21007254cbcb60eb2939dad7..62909907bf3205cb1a941843849f199f13675df9 100644 (file)
 
 static void vik_routing_web_engine_finalize ( GObject *gob );
 
-static int vik_routing_web_engine_find ( VikRoutingEngine *self, VikTrwLayer *vtl, struct LatLon start, struct LatLon end );
-static gchar *vik_routing_web_engine_get_cmd_from_directions(VikRoutingEngine *self, const gchar *start, const gchar *end);
+static gboolean vik_routing_web_engine_find ( VikRoutingEngine *self, VikTrwLayer *vtl, struct LatLon start, struct LatLon end );
+static gchar *vik_routing_web_engine_get_url_from_directions(VikRoutingEngine *self, const gchar *start, const gchar *end);
 static gboolean vik_routing_web_engine_supports_direction(VikRoutingEngine *self);
+static gboolean vik_routing_web_engine_refine ( VikRoutingEngine *self, VikTrwLayer *vtl, VikTrack *vt );
+static gboolean vik_routing_web_engine_supports_refine ( VikRoutingEngine *self );
 
 typedef struct _VikRoutingWebEnginePrivate VikRoutingWebEnginePrivate;
 struct _VikRoutingWebEnginePrivate
@@ -60,7 +62,7 @@ struct _VikRoutingWebEnginePrivate
        gchar *url_start_dir_fmt;
        gchar *url_stop_dir_fmt;
 
-       DownloadMapOptions options;
+       DownloadFileOptions options;
 };
 
 #define VIK_ROUTING_WEB_ENGINE_PRIVATE(o)  (G_TYPE_INSTANCE_GET_PRIVATE ((o), VIK_ROUTING_WEB_ENGINE_TYPE, VikRoutingWebEnginePrivate))
@@ -208,7 +210,9 @@ static void vik_routing_web_engine_class_init ( VikRoutingWebEngineClass *klass
 
   parent_class->find = vik_routing_web_engine_find;
   parent_class->supports_direction = vik_routing_web_engine_supports_direction;
-  parent_class->get_cmd_from_directions = vik_routing_web_engine_get_cmd_from_directions;
+  parent_class->get_url_from_directions = vik_routing_web_engine_get_url_from_directions;
+  parent_class->refine = vik_routing_web_engine_refine;
+  parent_class->supports_refine = vik_routing_web_engine_supports_refine;
 
   /**
    * VikRoutingWebEngine:url-base:
@@ -311,7 +315,7 @@ static void vik_routing_web_engine_class_init ( VikRoutingWebEngineClass *klass
                              "Specifies the number of retries to follow a redirect while downloading a page",
                              0  /* minimum value */,
                              G_MAXLONG /* maximum value */,
-                             0  /* default value */,
+                             2  /* default value */,
                              G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE);
   g_object_class_install_property (object_class, PROP_FOLLOW_LOCATION, pspec);
 
@@ -367,7 +371,7 @@ static void vik_routing_web_engine_finalize ( GObject *gob )
   G_OBJECT_CLASS (vik_routing_web_engine_parent_class)->finalize(gob);
 }
 
-static DownloadMapOptions *
+static DownloadFileOptions *
 vik_routing_web_engine_get_download_options ( VikRoutingEngine *self )
 {
        g_return_val_if_fail (VIK_IS_ROUTING_WEB_ENGINE(self), NULL);
@@ -413,18 +417,16 @@ vik_routing_web_engine_get_url_for_coords ( VikRoutingEngine *self, struct LatLo
        return url;
 }
 
-static int
+static gboolean
 vik_routing_web_engine_find ( VikRoutingEngine *self, VikTrwLayer *vtl, struct LatLon start, struct LatLon end )
 {
-  gchar *uri;
-  int ret = 0;  /* OK */
-
-  uri = vik_routing_web_engine_get_url_for_coords(self, start, end);
+  gchar *uri = vik_routing_web_engine_get_url_for_coords(self, start, end);
 
-  DownloadMapOptions *options = vik_routing_web_engine_get_download_options(self);
+  DownloadFileOptions *options = vik_routing_web_engine_get_download_options(self);
   
   gchar *format = vik_routing_engine_get_format ( self );
-  a_babel_convert_from_url ( vtl, uri, format, NULL, NULL, options );
+  ProcessOptions po = { NULL, NULL, format, uri, NULL, NULL };
+  gboolean ret = a_babel_convert_from ( vtl, &po, NULL, NULL, options );
 
   g_free(uri);
 
@@ -432,7 +434,7 @@ vik_routing_web_engine_find ( VikRoutingEngine *self, VikTrwLayer *vtl, struct L
 }
 
 static gchar *
-vik_routing_web_engine_get_cmd_from_directions ( VikRoutingEngine *self, const gchar *start, const gchar *end )
+vik_routing_web_engine_get_url_from_directions ( VikRoutingEngine *self, const gchar *start, const gchar *end )
 {
   g_return_val_if_fail ( VIK_IS_ROUTING_WEB_ENGINE (self), NULL);
 
@@ -475,3 +477,103 @@ vik_routing_web_engine_supports_direction ( VikRoutingEngine *self )
 
   return (priv->url_start_dir_fmt) != NULL;
 }
+
+struct _append_ctx {
+  VikRoutingWebEnginePrivate *priv;
+  gchar **urlParts;
+  int nb;
+};
+
+static void
+_append_stringified_coords ( gpointer data, gpointer user_data )
+{
+  VikTrackpoint *vtp = (VikTrackpoint*)data;
+  struct _append_ctx *ctx = (struct _append_ctx*)user_data;
+  
+  /* Stringify coordinate */
+  struct LatLon position;
+  vik_coord_to_latlon ( &(vtp->coord), &position );
+  gchar *string = substitute_latlon ( ctx->priv->url_via_ll_fmt, position );
+  
+  /* Append */
+  ctx->urlParts[ctx->nb] = string;
+  ctx->nb++;
+}
+
+static gchar *
+vik_routing_web_engine_get_url_for_track ( VikRoutingEngine *self, VikTrack *vt )
+{
+  gchar **urlParts;
+  gchar *url;
+
+  VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE ( self );
+
+  g_return_val_if_fail ( priv->url_base != NULL, NULL );
+  g_return_val_if_fail ( priv->url_start_ll_fmt != NULL, NULL );
+  g_return_val_if_fail ( priv->url_stop_ll_fmt != NULL, NULL );
+  g_return_val_if_fail ( priv->url_via_ll_fmt != NULL, NULL );
+
+  /* Init temporary storage */
+  gsize len = 1 + g_list_length ( vt->trackpoints ) + 1; /* base + trackpoints + NULL */
+  urlParts = g_malloc ( sizeof(gchar*)*len );
+  urlParts[0] = g_strdup ( priv->url_base );
+  urlParts[len-1] = NULL;
+
+  struct _append_ctx ctx;
+  ctx.priv = priv;
+  ctx.urlParts = urlParts;
+  ctx.nb = 1; /* First cell available, previous used for base URL */
+
+  /* Append all trackpoints to URL */
+  g_list_foreach ( vt->trackpoints, _append_stringified_coords, &ctx );
+
+  /* Override first and last positions with associated formats */
+  struct LatLon position;
+  VikTrackpoint *vtp;
+  g_free ( urlParts[1] );
+  vtp = g_list_first ( vt->trackpoints )->data;
+  vik_coord_to_latlon ( &(vtp->coord ), &position );
+  urlParts[1] = substitute_latlon ( priv->url_start_ll_fmt, position );
+  g_free ( urlParts[len-2] );
+  vtp = g_list_last ( vt->trackpoints )->data;
+  vik_coord_to_latlon ( &(vtp->coord), &position );
+  urlParts[len-2] = substitute_latlon ( priv->url_stop_ll_fmt, position );
+
+  /* Concat */
+  url = g_strjoinv ( NULL, urlParts );
+  g_debug ( "%s: %s", __FUNCTION__, url );
+
+  /* Free */
+  g_strfreev ( urlParts );
+
+  return url;
+}
+
+static gboolean
+vik_routing_web_engine_refine ( VikRoutingEngine *self, VikTrwLayer *vtl, VikTrack *vt )
+{
+  /* Compute URL */
+  gchar *uri = vik_routing_web_engine_get_url_for_track ( self, vt );
+
+  /* Download data */
+  DownloadFileOptions *options = vik_routing_web_engine_get_download_options ( self );
+
+  /* Convert and insert data in model */
+  gchar *format = vik_routing_engine_get_format ( self );
+  ProcessOptions po = { NULL, NULL, format, uri, NULL, NULL };
+  gboolean ret = a_babel_convert_from ( vtl, &po, NULL, NULL, options );
+
+  g_free(uri);
+
+  return ret;
+}
+
+static gboolean
+vik_routing_web_engine_supports_refine ( VikRoutingEngine *self )
+{
+  g_return_val_if_fail ( VIK_IS_ROUTING_WEB_ENGINE (self), FALSE);
+
+  VikRoutingWebEnginePrivate *priv = VIK_ROUTING_WEB_ENGINE_PRIVATE ( self );
+
+  return priv->url_via_ll_fmt != NULL;
+}