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"
49 #include "vikroutingwebengine.h"
50 #include "vikgobjectbuilder.h"
52 #define VIKING_MAPS_FILE "maps.xml"
53 #define VIKING_EXTTOOLS_FILE "external_tools.xml"
54 #define VIKING_DATASOURCES_FILE "datasources.xml"
55 #define VIKING_GOTOTOOLS_FILE "goto_tools.xml"
56 #define VIKING_ROUTING_FILE "routing.xml"
59 modules_register_map_source(VikGobjectBuilder *self, GObject *object)
61 g_debug (__FUNCTION__);
62 VikMapSource *mapsource = VIK_MAP_SOURCE (object);
63 /* FIXME label should be hosted by object */
64 maps_layer_register_map_source (mapsource);
68 modules_register_exttools(VikGobjectBuilder *self, GObject *object)
70 g_debug (__FUNCTION__);
71 VikExtTool *tool = VIK_EXT_TOOL (object);
72 vik_ext_tools_register (tool);
76 modules_register_datasources(VikGobjectBuilder *self, GObject *object)
78 g_debug (__FUNCTION__);
79 VikExtTool *tool = VIK_EXT_TOOL (object);
80 vik_ext_tool_datasources_register (tool);
84 modules_register_gototools(VikGobjectBuilder *self, GObject *object)
86 g_debug (__FUNCTION__);
87 VikGotoTool *tool = VIK_GOTO_TOOL (object);
88 vik_goto_register (tool);
92 modules_register_routing_engine(VikGobjectBuilder *self, GObject *object)
94 g_debug (__FUNCTION__);
95 VikRoutingEngine *engine = VIK_ROUTING_ENGINE (object);
96 vik_routing_register (engine);
100 modules_load_config_dir(const gchar *dir)
102 g_debug("Loading configurations from directory %s", dir);
105 gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL);
106 if (g_access (maps, R_OK) == 0)
108 VikGobjectBuilder *builder = vik_gobject_builder_new ();
109 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_map_source), NULL);
110 vik_gobject_builder_parse (builder, maps);
111 g_object_unref (builder);
115 gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
116 if (g_access (tools, R_OK) == 0)
118 VikGobjectBuilder *builder = vik_gobject_builder_new ();
119 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_exttools), NULL);
120 vik_gobject_builder_parse (builder, tools);
121 g_object_unref (builder);
124 gchar *datasources = g_build_filename(dir, VIKING_DATASOURCES_FILE, NULL);
125 if (g_access (datasources, R_OK) == 0)
127 VikGobjectBuilder *builder = vik_gobject_builder_new ();
128 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_datasources), NULL);
129 vik_gobject_builder_parse (builder, datasources);
130 g_object_unref (builder);
133 /* Go-to search engines */
134 gchar *go_to = g_build_filename(dir, VIKING_GOTOTOOLS_FILE, NULL);
135 if (g_access (go_to, R_OK) == 0)
137 VikGobjectBuilder *builder = vik_gobject_builder_new ();
138 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_gototools), NULL);
139 vik_gobject_builder_parse (builder, go_to);
140 g_object_unref (builder);
143 /* Routing engines */
144 gchar *routing = g_build_filename(dir, VIKING_ROUTING_FILE, NULL);
145 if (g_access (routing, R_OK) == 0)
147 VikGobjectBuilder *builder = vik_gobject_builder_new ();
148 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_routing_engine), NULL);
149 vik_gobject_builder_parse (builder, routing);
150 g_object_unref (builder);
155 modules_load_config(void)
157 /* Look in the directories of data path */
158 gchar * * data_dirs = a_get_viking_data_path();
159 /* Priority is standard one:
160 left element is more important than right one.
161 But our logic is to load all existing files and overwrite
162 overlapping config with last recent one.
163 So, we have to process directories in reverse order. */
164 /* First: find the last element */
165 gchar * * ptr = data_dirs;
166 while (*ptr != NULL) ptr++;
167 /* Second: deduce the number of directories */
168 int nb_data_dirs = 0;
169 nb_data_dirs = ptr - data_dirs;
170 /* Last: parse them in reverse order */
171 for (; nb_data_dirs > 0 ; nb_data_dirs--)
173 modules_load_config_dir(data_dirs[nb_data_dirs-1]);
175 g_strfreev(data_dirs);
177 /* Check if system config is set */
178 modules_load_config_dir(VIKING_SYSCONFDIR);
180 const gchar *data_home = a_get_viking_data_home ();
183 modules_load_config_dir(data_home);
186 /* Check user's home config */
187 modules_load_config_dir(a_get_viking_dir());
192 #ifdef VIK_CONFIG_BING
195 #ifdef VIK_CONFIG_GOOGLE
198 #ifdef VIK_CONFIG_EXPEDIA
201 #ifdef VIK_CONFIG_TERRASERVER
204 #ifdef VIK_CONFIG_OPENSTREETMAP
208 #ifdef VIK_CONFIG_BLUEMARBLE
211 #ifdef VIK_CONFIG_GEONAMES
214 #ifdef VIK_CONFIG_SPOTMAPS
218 /* Force registering of loadable types */
219 VIK_ROUTING_WEB_ENGINE_TYPE;
221 /* As modules are loaded, we can load configuration files */
222 modules_load_config ();