/*
* 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 "modules.h"
+#include "bing.h"
#include "google.h"
#include "terraserver.h"
#include "expedia.h"
#include "osm.h"
#include "osm-traces.h"
#include "bluemarble.h"
-#include "openaerial.h"
-#include "file.h"
+#include "geonames.h"
+#include "dir.h"
+#include "datasources.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"
+#ifdef HAVE_LIBMAPNIK
+#include "vikmapniklayer.h"
+#endif
+
+#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)
}
static void
-modules_load_config(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);
+ }
+ g_free ( maps );
+
/* External tools */
- gchar *tools = g_build_filename(a_get_viking_dir(), VIKING_EXTTOOLS_FILE, NULL);
+ gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
if (g_access (tools, R_OK) == 0)
{
VikGobjectBuilder *builder = vik_gobject_builder_new ();
vik_gobject_builder_parse (builder, tools);
g_object_unref (builder);
}
+ g_free ( tools );
+
+ 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);
+ }
+ g_free ( datasources );
+
+ /* 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);
+ }
+ g_free ( go_to );
+
+ /* 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);
+ }
+ g_free ( routing );
+}
+
+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. */
+ int nb_data_dirs = g_strv_length ( data_dirs );
+ 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' + argument type warnings */
+ g_debug("%d types loaded", (int)sizeof(types)/(int)sizeof(GType));
}
void modules_init()
{
+#ifdef VIK_CONFIG_BING
+ bing_init();
+#endif
#ifdef VIK_CONFIG_GOOGLE
google_init();
#endif
#ifdef VIK_CONFIG_BLUEMARBLE
bluemarble_init();
#endif
-#ifdef VIK_CONFIG_OPENAERIAL
- openaerial_init();
+#ifdef VIK_CONFIG_GEONAMES
+ geonames_init();
+#endif
+#ifdef VIK_CONFIG_GEOCACHES
+ a_datasource_gc_init();
+#endif
+
+#ifdef HAVE_LIBMAPNIK
+ vik_mapnik_layer_init();
#endif
-
+
+ register_loadable_types ();
+
/* As modules are loaded, we can load configuration files */
modules_load_config ();
}
+/**
+ *
+ */
+void modules_uninit()
+{
+#ifdef VIK_CONFIG_OPENSTREETMAP
+ osm_traces_uninit();
+#endif
+#ifdef HAVE_LIBMAPNIK
+ vik_mapnik_layer_uninit();
+#endif
+}