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 "vikmapslayer.h"
44 #include "vikexttools.h"
45 #include "vikexttool_datasources.h"
47 #include "vikrouting.h"
50 #include "vikslippymapsource.h"
51 #include "viktmsmapsource.h"
52 #include "vikwmscmapsource.h"
53 #include "vikwebtoolcenter.h"
54 #include "vikwebtoolbounds.h"
55 #include "vikgotoxmltool.h"
56 #include "vikwebtool_datasource.h"
57 #include "vikroutingwebengine.h"
59 #include "vikgobjectbuilder.h"
61 #define VIKING_MAPS_FILE "maps.xml"
62 #define VIKING_EXTTOOLS_FILE "external_tools.xml"
63 #define VIKING_DATASOURCES_FILE "datasources.xml"
64 #define VIKING_GOTOTOOLS_FILE "goto_tools.xml"
65 #define VIKING_ROUTING_FILE "routing.xml"
68 modules_register_map_source(VikGobjectBuilder *self, GObject *object)
70 g_debug (__FUNCTION__);
71 VikMapSource *mapsource = VIK_MAP_SOURCE (object);
72 /* FIXME label should be hosted by object */
73 maps_layer_register_map_source (mapsource);
77 modules_register_exttools(VikGobjectBuilder *self, GObject *object)
79 g_debug (__FUNCTION__);
80 VikExtTool *tool = VIK_EXT_TOOL (object);
81 vik_ext_tools_register (tool);
85 modules_register_datasources(VikGobjectBuilder *self, GObject *object)
87 g_debug (__FUNCTION__);
88 VikExtTool *tool = VIK_EXT_TOOL (object);
89 vik_ext_tool_datasources_register (tool);
93 modules_register_gototools(VikGobjectBuilder *self, GObject *object)
95 g_debug (__FUNCTION__);
96 VikGotoTool *tool = VIK_GOTO_TOOL (object);
97 vik_goto_register (tool);
101 modules_register_routing_engine(VikGobjectBuilder *self, GObject *object)
103 g_debug (__FUNCTION__);
104 VikRoutingEngine *engine = VIK_ROUTING_ENGINE (object);
105 vik_routing_register (engine);
109 modules_load_config_dir(const gchar *dir)
111 g_debug("Loading configurations from directory %s", dir);
114 gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL);
115 if (g_access (maps, R_OK) == 0)
117 VikGobjectBuilder *builder = vik_gobject_builder_new ();
118 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_map_source), NULL);
119 vik_gobject_builder_parse (builder, maps);
120 g_object_unref (builder);
125 gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
126 if (g_access (tools, R_OK) == 0)
128 VikGobjectBuilder *builder = vik_gobject_builder_new ();
129 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_exttools), NULL);
130 vik_gobject_builder_parse (builder, tools);
131 g_object_unref (builder);
135 gchar *datasources = g_build_filename(dir, VIKING_DATASOURCES_FILE, NULL);
136 if (g_access (datasources, R_OK) == 0)
138 VikGobjectBuilder *builder = vik_gobject_builder_new ();
139 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_datasources), NULL);
140 vik_gobject_builder_parse (builder, datasources);
141 g_object_unref (builder);
143 g_free ( datasources );
145 /* Go-to search engines */
146 gchar *go_to = g_build_filename(dir, VIKING_GOTOTOOLS_FILE, NULL);
147 if (g_access (go_to, R_OK) == 0)
149 VikGobjectBuilder *builder = vik_gobject_builder_new ();
150 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_gototools), NULL);
151 vik_gobject_builder_parse (builder, go_to);
152 g_object_unref (builder);
156 /* Routing engines */
157 gchar *routing = g_build_filename(dir, VIKING_ROUTING_FILE, NULL);
158 if (g_access (routing, R_OK) == 0)
160 VikGobjectBuilder *builder = vik_gobject_builder_new ();
161 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_routing_engine), NULL);
162 vik_gobject_builder_parse (builder, routing);
163 g_object_unref (builder);
169 modules_load_config(void)
171 /* Look in the directories of data path */
172 gchar * * data_dirs = a_get_viking_data_path();
173 /* Priority is standard one:
174 left element is more important than right one.
175 But our logic is to load all existing files and overwrite
176 overlapping config with last recent one.
177 So, we have to process directories in reverse order. */
178 /* First: find the last element */
179 gchar * * ptr = data_dirs;
180 while (*ptr != NULL) ptr++;
181 /* Second: deduce the number of directories */
182 int nb_data_dirs = 0;
183 nb_data_dirs = ptr - data_dirs;
184 /* Last: parse them in reverse order */
185 for (; nb_data_dirs > 0 ; nb_data_dirs--)
187 modules_load_config_dir(data_dirs[nb_data_dirs-1]);
189 g_strfreev(data_dirs);
191 /* Check if system config is set */
192 modules_load_config_dir(VIKING_SYSCONFDIR);
194 const gchar *data_home = a_get_viking_data_home ();
197 modules_load_config_dir(data_home);
200 /* Check user's home config */
201 modules_load_config_dir(a_get_viking_dir());
205 register_loadable_types(void)
207 /* Force registering of loadable types */
208 volatile GType types[] = {
210 VIK_TYPE_SLIPPY_MAP_SOURCE,
211 VIK_TYPE_TMS_MAP_SOURCE,
212 VIK_TYPE_WMSC_MAP_SOURCE,
215 VIK_GOTO_XML_TOOL_TYPE,
218 VIK_WEBTOOL_CENTER_TYPE,
219 VIK_WEBTOOL_BOUNDS_TYPE,
222 VIK_WEBTOOL_DATASOURCE_TYPE,
225 VIK_ROUTING_WEB_ENGINE_TYPE
228 /* kill 'unused variable' + argument type warnings */
229 g_debug("%d types loaded", (int)sizeof(types)/(int)sizeof(GType));
234 #ifdef VIK_CONFIG_BING
237 #ifdef VIK_CONFIG_GOOGLE
240 #ifdef VIK_CONFIG_EXPEDIA
243 #ifdef VIK_CONFIG_TERRASERVER
246 #ifdef VIK_CONFIG_OPENSTREETMAP
250 #ifdef VIK_CONFIG_BLUEMARBLE
253 #ifdef VIK_CONFIG_GEONAMES
257 register_loadable_types ();
259 /* As modules are loaded, we can load configuration files */
260 modules_load_config ();