X-Git-Url: https://git.street.me.uk/andy/viking.git/blobdiff_plain/cdcaf41c6bb6275fb40f59ad1b32a4485525c489..32f1d63afba85360dca182e0ba80fd2c8ff3363e:/src/modules.c?ds=sidebyside diff --git a/src/modules.c b/src/modules.c index 2b56aeff..638fae70 100644 --- a/src/modules.c +++ b/src/modules.c @@ -1,7 +1,7 @@ /* * viking -- GPS Data and Topo Analyzer, Explorer, and Manager * - * Copyright (C) 2006-2007, Guilhem Bonnefille + * Copyright (C) 2006-2012, Guilhem Bonnefille * * 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 @@ -23,20 +23,215 @@ #include "config.h" #endif +#include +#include +#ifdef HAVE_UNISTD_H +#include +#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_BING + bing_init(); +#endif #ifdef VIK_CONFIG_GOOGLE google_init(); - googlemaps_init(); - khmaps_init(); #endif #ifdef VIK_CONFIG_EXPEDIA expedia_init(); @@ -44,5 +239,23 @@ void modules_init() #ifdef VIK_CONFIG_TERRASERVER terraserver_init(); #endif +#ifdef VIK_CONFIG_OPENSTREETMAP + 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 (); }