]> git.street.me.uk Git - andy/viking.git/blobdiff - src/modules.c
Fix usage of default maps cache directory when it does not end in a separator.
[andy/viking.git] / src / modules.c
index 020c677e5b2ba60623f57808933b85e2a6c7264b..638fae70331a41e5094d0a9e6ef3c5aa7159a5f0 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
  *
- * Copyright (C) 2006-2007, Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
+ * Copyright (C) 2006-2012, Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
 #include "config.h"
 #endif
 
+#include <glib.h>
+#include <glib/gstdio.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
 #include "modules.h"
 
+#include "bing.h"
+#include "spotmaps.h"
 #include "google.h"
-#include "googlemaps.h"
 #include "terraserver.h"
-#include "khmaps.h"
 #include "expedia.h"
 #include "osm.h"
 #include "osm-traces.h"
+#include "bluemarble.h"
+#include "geonames.h"
+#include "dir.h"
+#include "vikmapslayer.h"
+#include "vikexttools.h"
+#include "vikexttool_datasources.h"
+#include "vikgoto.h"
+#include "vikrouting.h"
+
+/* Loadable types */
+#include "vikslippymapsource.h"
+#include "viktmsmapsource.h"
+#include "vikwmscmapsource.h"
+#include "vikwebtoolcenter.h"
+#include "vikwebtoolbounds.h"
+#include "vikgotoxmltool.h"
+#include "vikwebtool_datasource.h"
+#include "vikroutingwebengine.h"
+
+#include "vikgobjectbuilder.h"
+
+#define VIKING_MAPS_FILE "maps.xml"
+#define VIKING_EXTTOOLS_FILE "external_tools.xml"
+#define VIKING_DATASOURCES_FILE "datasources.xml"
+#define VIKING_GOTOTOOLS_FILE "goto_tools.xml"
+#define VIKING_ROUTING_FILE "routing.xml"
+
+static void
+modules_register_map_source(VikGobjectBuilder *self, GObject *object)
+{
+  g_debug (__FUNCTION__);
+  VikMapSource *mapsource = VIK_MAP_SOURCE (object);
+  /* FIXME label should be hosted by object */
+  maps_layer_register_map_source (mapsource);
+}
+
+static void
+modules_register_exttools(VikGobjectBuilder *self, GObject *object)
+{
+  g_debug (__FUNCTION__);
+  VikExtTool *tool = VIK_EXT_TOOL (object);
+  vik_ext_tools_register (tool);
+}
+
+static void
+modules_register_datasources(VikGobjectBuilder *self, GObject *object)
+{
+  g_debug (__FUNCTION__);
+  VikExtTool *tool = VIK_EXT_TOOL (object);
+  vik_ext_tool_datasources_register (tool);
+}
+
+static void
+modules_register_gototools(VikGobjectBuilder *self, GObject *object)
+{
+  g_debug (__FUNCTION__);
+  VikGotoTool *tool = VIK_GOTO_TOOL (object);
+  vik_goto_register (tool);
+}
+
+static void
+modules_register_routing_engine(VikGobjectBuilder *self, GObject *object)
+{
+  g_debug (__FUNCTION__);
+  VikRoutingEngine *engine = VIK_ROUTING_ENGINE (object);
+  vik_routing_register (engine);
+}
+
+static void
+modules_load_config_dir(const gchar *dir)
+{
+  g_debug("Loading configurations from directory %s", dir);
+
+  /* Maps sources */
+  gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL);
+  if (g_access (maps, R_OK) == 0)
+  {
+       VikGobjectBuilder *builder = vik_gobject_builder_new ();
+       g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_map_source), NULL);
+       vik_gobject_builder_parse (builder, maps);
+       g_object_unref (builder);
+  }
+
+  /* External tools */
+  gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
+  if (g_access (tools, R_OK) == 0)
+  {
+       VikGobjectBuilder *builder = vik_gobject_builder_new ();
+       g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_exttools), NULL);
+       vik_gobject_builder_parse (builder, tools);
+       g_object_unref (builder);
+  }
+
+  gchar *datasources = g_build_filename(dir, VIKING_DATASOURCES_FILE, NULL);
+  if (g_access (datasources, R_OK) == 0)
+  {
+       VikGobjectBuilder *builder = vik_gobject_builder_new ();
+       g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_datasources), NULL);
+       vik_gobject_builder_parse (builder, datasources);
+       g_object_unref (builder);
+  }
+
+  /* Go-to search engines */
+  gchar *go_to = g_build_filename(dir, VIKING_GOTOTOOLS_FILE, NULL);
+  if (g_access (go_to, R_OK) == 0)
+  {
+       VikGobjectBuilder *builder = vik_gobject_builder_new ();
+       g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_gototools), NULL);
+       vik_gobject_builder_parse (builder, go_to);
+       g_object_unref (builder);
+  }
+
+  /* Routing engines */
+  gchar *routing = g_build_filename(dir, VIKING_ROUTING_FILE, NULL);
+  if (g_access (routing, R_OK) == 0)
+  {
+       VikGobjectBuilder *builder = vik_gobject_builder_new ();
+       g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_routing_engine), NULL);
+       vik_gobject_builder_parse (builder, routing);
+       g_object_unref (builder);
+  }
+}
+
+static void
+modules_load_config(void)
+{
+  /* Look in the directories of data path */
+  gchar * * data_dirs = a_get_viking_data_path();
+  /* Priority is standard one:
+     left element is more important than right one.
+     But our logic is to load all existing files and overwrite
+     overlapping config with last recent one.
+     So, we have to process directories in reverse order. */
+  /* First: find the last element */
+  gchar * * ptr = data_dirs;
+  while (*ptr != NULL) ptr++;
+  /* Second: deduce the number of directories */
+  int nb_data_dirs = 0;
+  nb_data_dirs = ptr - data_dirs;
+  /* Last: parse them in reverse order */
+  for (; nb_data_dirs > 0 ; nb_data_dirs--)
+  {
+    modules_load_config_dir(data_dirs[nb_data_dirs-1]);
+  }
+  g_strfreev(data_dirs);
+       
+  /* Check if system config is set */
+  modules_load_config_dir(VIKING_SYSCONFDIR);
+
+  const gchar *data_home = a_get_viking_data_home ();
+  if (data_home)
+  {
+    modules_load_config_dir(data_home);
+  }
+       
+  /* Check user's home config */
+  modules_load_config_dir(a_get_viking_dir());
+}
+
+static void
+register_loadable_types(void)
+{
+  /* Force registering of loadable types */
+  volatile GType types[] = {
+    /* Maps */
+    VIK_TYPE_SLIPPY_MAP_SOURCE,
+    VIK_TYPE_TMS_MAP_SOURCE,
+    VIK_TYPE_WMSC_MAP_SOURCE,
+
+    /* Goto */
+    VIK_GOTO_XML_TOOL_TYPE,
+
+    /* Tools */
+    VIK_WEBTOOL_CENTER_TYPE,
+    VIK_WEBTOOL_BOUNDS_TYPE,
+
+    /* Datasource */
+    VIK_WEBTOOL_DATASOURCE_TYPE,
+
+    /* Routing */
+    VIK_ROUTING_WEB_ENGINE_TYPE
+  };
+
+  /* kill 'unused variable'  warning */
+  g_debug("%ld types loaded", sizeof(types)/sizeof(GType));
+}
 
 void modules_init()
 {
-#ifdef VIK_CONFIG_OLD_GOOGLE 
-  googlemaps_init();
-  khmaps_init();
+#ifdef VIK_CONFIG_BING
+  bing_init();
 #endif
 #ifdef VIK_CONFIG_GOOGLE 
   google_init();
@@ -52,5 +243,19 @@ void modules_init()
   osm_init();
   osm_traces_init();
 #endif
+#ifdef VIK_CONFIG_BLUEMARBLE
+  bluemarble_init();
+#endif
+#ifdef VIK_CONFIG_GEONAMES
+  geonames_init();
+#endif
+#ifdef VIK_CONFIG_SPOTMAPS
+  spotmaps_init();
+#endif
+
+  register_loadable_types ();
+
+  /* As modules are loaded, we can load configuration files */
+  modules_load_config ();
 }