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>
37 #include "terraserver.h"
40 #include "osm-traces.h"
41 #include "bluemarble.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"
62 #define VIKING_MAPS_FILE "maps.xml"
63 #define VIKING_EXTTOOLS_FILE "external_tools.xml"
64 #define VIKING_DATASOURCES_FILE "datasources.xml"
65 #define VIKING_GOTOTOOLS_FILE "goto_tools.xml"
66 #define VIKING_ROUTING_FILE "routing.xml"
69 modules_register_map_source(VikGobjectBuilder *self, GObject *object)
71 g_debug (__FUNCTION__);
72 VikMapSource *mapsource = VIK_MAP_SOURCE (object);
73 /* FIXME label should be hosted by object */
74 maps_layer_register_map_source (mapsource);
78 modules_register_exttools(VikGobjectBuilder *self, GObject *object)
80 g_debug (__FUNCTION__);
81 VikExtTool *tool = VIK_EXT_TOOL (object);
82 vik_ext_tools_register (tool);
86 modules_register_datasources(VikGobjectBuilder *self, GObject *object)
88 g_debug (__FUNCTION__);
89 VikExtTool *tool = VIK_EXT_TOOL (object);
90 vik_ext_tool_datasources_register (tool);
94 modules_register_gototools(VikGobjectBuilder *self, GObject *object)
96 g_debug (__FUNCTION__);
97 VikGotoTool *tool = VIK_GOTO_TOOL (object);
98 vik_goto_register (tool);
102 modules_register_routing_engine(VikGobjectBuilder *self, GObject *object)
104 g_debug (__FUNCTION__);
105 VikRoutingEngine *engine = VIK_ROUTING_ENGINE (object);
106 vik_routing_register (engine);
110 modules_load_config_dir(const gchar *dir)
112 g_debug("Loading configurations from directory %s", dir);
115 gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL);
116 if (g_access (maps, R_OK) == 0)
118 VikGobjectBuilder *builder = vik_gobject_builder_new ();
119 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_map_source), NULL);
120 vik_gobject_builder_parse (builder, maps);
121 g_object_unref (builder);
126 gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
127 if (g_access (tools, R_OK) == 0)
129 VikGobjectBuilder *builder = vik_gobject_builder_new ();
130 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_exttools), NULL);
131 vik_gobject_builder_parse (builder, tools);
132 g_object_unref (builder);
136 gchar *datasources = g_build_filename(dir, VIKING_DATASOURCES_FILE, NULL);
137 if (g_access (datasources, R_OK) == 0)
139 VikGobjectBuilder *builder = vik_gobject_builder_new ();
140 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_datasources), NULL);
141 vik_gobject_builder_parse (builder, datasources);
142 g_object_unref (builder);
144 g_free ( datasources );
146 /* Go-to search engines */
147 gchar *go_to = g_build_filename(dir, VIKING_GOTOTOOLS_FILE, NULL);
148 if (g_access (go_to, R_OK) == 0)
150 VikGobjectBuilder *builder = vik_gobject_builder_new ();
151 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_gototools), NULL);
152 vik_gobject_builder_parse (builder, go_to);
153 g_object_unref (builder);
157 /* Routing engines */
158 gchar *routing = g_build_filename(dir, VIKING_ROUTING_FILE, NULL);
159 if (g_access (routing, R_OK) == 0)
161 VikGobjectBuilder *builder = vik_gobject_builder_new ();
162 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_routing_engine), NULL);
163 vik_gobject_builder_parse (builder, routing);
164 g_object_unref (builder);
170 modules_load_config(void)
172 /* Look in the directories of data path */
173 gchar * * data_dirs = a_get_viking_data_path();
174 /* Priority is standard one:
175 left element is more important than right one.
176 But our logic is to load all existing files and overwrite
177 overlapping config with last recent one.
178 So, we have to process directories in reverse order. */
179 /* First: find the last element */
180 gchar * * ptr = data_dirs;
181 while (*ptr != NULL) ptr++;
182 /* Second: deduce the number of directories */
183 int nb_data_dirs = 0;
184 nb_data_dirs = ptr - data_dirs;
185 /* Last: parse them in reverse order */
186 for (; nb_data_dirs > 0 ; nb_data_dirs--)
188 modules_load_config_dir(data_dirs[nb_data_dirs-1]);
190 g_strfreev(data_dirs);
192 /* Check if system config is set */
193 modules_load_config_dir(VIKING_SYSCONFDIR);
195 const gchar *data_home = a_get_viking_data_home ();
198 modules_load_config_dir(data_home);
201 /* Check user's home config */
202 modules_load_config_dir(a_get_viking_dir());
206 register_loadable_types(void)
208 /* Force registering of loadable types */
209 volatile GType types[] = {
211 VIK_TYPE_SLIPPY_MAP_SOURCE,
212 VIK_TYPE_TMS_MAP_SOURCE,
213 VIK_TYPE_WMSC_MAP_SOURCE,
216 VIK_GOTO_XML_TOOL_TYPE,
219 VIK_WEBTOOL_CENTER_TYPE,
220 VIK_WEBTOOL_BOUNDS_TYPE,
223 VIK_WEBTOOL_DATASOURCE_TYPE,
226 VIK_ROUTING_WEB_ENGINE_TYPE
229 /* kill 'unused variable' warning */
230 g_debug("%ld types loaded", sizeof(types)/sizeof(GType));
235 #ifdef VIK_CONFIG_BING
238 #ifdef VIK_CONFIG_GOOGLE
241 #ifdef VIK_CONFIG_EXPEDIA
244 #ifdef VIK_CONFIG_TERRASERVER
247 #ifdef VIK_CONFIG_OPENSTREETMAP
251 #ifdef VIK_CONFIG_BLUEMARBLE
254 #ifdef VIK_CONFIG_GEONAMES
257 #ifdef VIK_CONFIG_SPOTMAPS
261 register_loadable_types ();
263 /* As modules are loaded, we can load configuration files */
264 modules_load_config ();