2 * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
4 * Copyright (C) 2006-2012, Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #include <glib/gstdio.h>
36 #include "terraserver.h"
39 #include "osm-traces.h"
40 #include "bluemarble.h"
43 #include "datasources.h"
44 #include "vikmapslayer.h"
45 #include "vikexttools.h"
46 #include "vikexttool_datasources.h"
48 #include "vikrouting.h"
51 #include "vikslippymapsource.h"
52 #include "viktmsmapsource.h"
53 #include "vikwmscmapsource.h"
54 #include "vikwebtoolcenter.h"
55 #include "vikwebtoolbounds.h"
56 #include "vikgotoxmltool.h"
57 #include "vikwebtool_datasource.h"
58 #include "vikroutingwebengine.h"
60 #include "vikgobjectbuilder.h"
63 #include "vikmapniklayer.h"
66 #define VIKING_MAPS_FILE "maps.xml"
67 #define VIKING_EXTTOOLS_FILE "external_tools.xml"
68 #define VIKING_DATASOURCES_FILE "datasources.xml"
69 #define VIKING_GOTOTOOLS_FILE "goto_tools.xml"
70 #define VIKING_ROUTING_FILE "routing.xml"
73 modules_register_map_source(VikGobjectBuilder *self, GObject *object)
75 g_debug (__FUNCTION__);
76 VikMapSource *mapsource = VIK_MAP_SOURCE (object);
77 /* FIXME label should be hosted by object */
78 maps_layer_register_map_source (mapsource);
82 modules_register_exttools(VikGobjectBuilder *self, GObject *object)
84 g_debug (__FUNCTION__);
85 VikExtTool *tool = VIK_EXT_TOOL (object);
86 vik_ext_tools_register (tool);
90 modules_register_datasources(VikGobjectBuilder *self, GObject *object)
92 g_debug (__FUNCTION__);
93 VikExtTool *tool = VIK_EXT_TOOL (object);
94 vik_ext_tool_datasources_register (tool);
98 modules_register_gototools(VikGobjectBuilder *self, GObject *object)
100 g_debug (__FUNCTION__);
101 VikGotoTool *tool = VIK_GOTO_TOOL (object);
102 vik_goto_register (tool);
106 modules_register_routing_engine(VikGobjectBuilder *self, GObject *object)
108 g_debug (__FUNCTION__);
109 VikRoutingEngine *engine = VIK_ROUTING_ENGINE (object);
110 vik_routing_register (engine);
114 modules_load_config_dir(const gchar *dir)
116 g_debug("Loading configurations from directory %s", dir);
119 gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL);
120 if (g_access (maps, R_OK) == 0)
122 VikGobjectBuilder *builder = vik_gobject_builder_new ();
123 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_map_source), NULL);
124 vik_gobject_builder_parse (builder, maps);
125 g_object_unref (builder);
130 gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
131 if (g_access (tools, R_OK) == 0)
133 VikGobjectBuilder *builder = vik_gobject_builder_new ();
134 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_exttools), NULL);
135 vik_gobject_builder_parse (builder, tools);
136 g_object_unref (builder);
140 gchar *datasources = g_build_filename(dir, VIKING_DATASOURCES_FILE, NULL);
141 if (g_access (datasources, R_OK) == 0)
143 VikGobjectBuilder *builder = vik_gobject_builder_new ();
144 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_datasources), NULL);
145 vik_gobject_builder_parse (builder, datasources);
146 g_object_unref (builder);
148 g_free ( datasources );
150 /* Go-to search engines */
151 gchar *go_to = g_build_filename(dir, VIKING_GOTOTOOLS_FILE, NULL);
152 if (g_access (go_to, R_OK) == 0)
154 VikGobjectBuilder *builder = vik_gobject_builder_new ();
155 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_gototools), NULL);
156 vik_gobject_builder_parse (builder, go_to);
157 g_object_unref (builder);
161 /* Routing engines */
162 gchar *routing = g_build_filename(dir, VIKING_ROUTING_FILE, NULL);
163 if (g_access (routing, R_OK) == 0)
165 VikGobjectBuilder *builder = vik_gobject_builder_new ();
166 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_routing_engine), NULL);
167 vik_gobject_builder_parse (builder, routing);
168 g_object_unref (builder);
174 modules_load_config(void)
176 /* Look in the directories of data path */
177 gchar * * data_dirs = a_get_viking_data_path();
178 /* Priority is standard one:
179 left element is more important than right one.
180 But our logic is to load all existing files and overwrite
181 overlapping config with last recent one.
182 So, we have to process directories in reverse order. */
183 int nb_data_dirs = g_strv_length ( data_dirs );
184 for (; nb_data_dirs > 0 ; nb_data_dirs--)
186 modules_load_config_dir(data_dirs[nb_data_dirs-1]);
188 g_strfreev(data_dirs);
190 /* Check if system config is set */
191 modules_load_config_dir(VIKING_SYSCONFDIR);
193 const gchar *data_home = a_get_viking_data_home ();
196 modules_load_config_dir(data_home);
199 /* Check user's home config */
200 modules_load_config_dir(a_get_viking_dir());
204 register_loadable_types(void)
206 /* Force registering of loadable types */
207 volatile GType types[] = {
209 VIK_TYPE_SLIPPY_MAP_SOURCE,
210 VIK_TYPE_TMS_MAP_SOURCE,
211 VIK_TYPE_WMSC_MAP_SOURCE,
214 VIK_GOTO_XML_TOOL_TYPE,
217 VIK_WEBTOOL_CENTER_TYPE,
218 VIK_WEBTOOL_BOUNDS_TYPE,
221 VIK_WEBTOOL_DATASOURCE_TYPE,
224 VIK_ROUTING_WEB_ENGINE_TYPE
227 /* kill 'unused variable' + argument type warnings */
228 g_debug("%d types loaded", (int)sizeof(types)/(int)sizeof(GType));
232 * First stage initialization
233 * Can not use a_get_preferences() yet...
234 * See comment in main.c
238 // OSM done first so this will be the default service for searching/routing/etc...
239 #ifdef VIK_CONFIG_OPENSTREETMAP
243 #ifdef VIK_CONFIG_BING
246 #ifdef VIK_CONFIG_GOOGLE
249 #ifdef VIK_CONFIG_EXPEDIA
252 #ifdef VIK_CONFIG_TERRASERVER
255 #ifdef VIK_CONFIG_BLUEMARBLE
258 #ifdef VIK_CONFIG_GEONAMES
261 #ifdef VIK_CONFIG_GEOCACHES
262 a_datasource_gc_init();
265 #ifdef HAVE_LIBMAPNIK
266 vik_mapnik_layer_init();
269 register_loadable_types ();
271 /* As modules are loaded, we can load configuration files */
272 modules_load_config ();
278 * Secondary stage initialization
279 * Can now use a_get_preferences() and a_babel_available()
281 void modules_post_init ()
283 #ifdef VIK_CONFIG_GOOGLE
286 #ifdef HAVE_LIBMAPNIK
287 vik_mapnik_layer_post_init();
294 void modules_uninit()
296 #ifdef VIK_CONFIG_OPENSTREETMAP
299 #ifdef HAVE_LIBMAPNIK
300 vik_mapnik_layer_uninit();