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 int nb_data_dirs = g_strv_length ( data_dirs );
179 for (; nb_data_dirs > 0 ; nb_data_dirs--)
181 modules_load_config_dir(data_dirs[nb_data_dirs-1]);
183 g_strfreev(data_dirs);
185 /* Check if system config is set */
186 modules_load_config_dir(VIKING_SYSCONFDIR);
188 const gchar *data_home = a_get_viking_data_home ();
191 modules_load_config_dir(data_home);
194 /* Check user's home config */
195 modules_load_config_dir(a_get_viking_dir());
199 register_loadable_types(void)
201 /* Force registering of loadable types */
202 volatile GType types[] = {
204 VIK_TYPE_SLIPPY_MAP_SOURCE,
205 VIK_TYPE_TMS_MAP_SOURCE,
206 VIK_TYPE_WMSC_MAP_SOURCE,
209 VIK_GOTO_XML_TOOL_TYPE,
212 VIK_WEBTOOL_CENTER_TYPE,
213 VIK_WEBTOOL_BOUNDS_TYPE,
216 VIK_WEBTOOL_DATASOURCE_TYPE,
219 VIK_ROUTING_WEB_ENGINE_TYPE
222 /* kill 'unused variable' + argument type warnings */
223 g_debug("%d types loaded", (int)sizeof(types)/(int)sizeof(GType));
228 #ifdef VIK_CONFIG_BING
231 #ifdef VIK_CONFIG_GOOGLE
234 #ifdef VIK_CONFIG_EXPEDIA
237 #ifdef VIK_CONFIG_TERRASERVER
240 #ifdef VIK_CONFIG_OPENSTREETMAP
244 #ifdef VIK_CONFIG_BLUEMARBLE
247 #ifdef VIK_CONFIG_GEONAMES
251 register_loadable_types ();
253 /* As modules are loaded, we can load configuration files */
254 modules_load_config ();