]> git.street.me.uk Git - andy/viking.git/blame_incremental - src/modules.c
Remove unused define
[andy/viking.git] / src / modules.c
... / ...
CommitLineData
1/*
2 * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
3 *
4 * Copyright (C) 2006-2012, Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
5 *
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.
10 *
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.
15 *
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
19 *
20 */
21
22#ifdef HAVE_CONFIG_H
23#include "config.h"
24#endif
25
26#include <glib.h>
27#include <glib/gstdio.h>
28#ifdef HAVE_UNISTD_H
29#include <unistd.h>
30#endif
31
32#include "modules.h"
33
34#include "bing.h"
35#include "google.h"
36#include "terraserver.h"
37#include "expedia.h"
38#include "osm.h"
39#include "osm-traces.h"
40#include "bluemarble.h"
41#include "geonames.h"
42#include "dir.h"
43#include "datasources.h"
44#include "vikmapslayer.h"
45#include "vikexttools.h"
46#include "vikexttool_datasources.h"
47#include "vikgoto.h"
48#include "vikrouting.h"
49
50/* Loadable types */
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"
59
60#include "vikgobjectbuilder.h"
61
62#ifdef HAVE_LIBMAPNIK
63#include "vikmapniklayer.h"
64#endif
65
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"
71
72static void
73modules_register_map_source(VikGobjectBuilder *self, GObject *object)
74{
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);
79}
80
81static void
82modules_register_exttools(VikGobjectBuilder *self, GObject *object)
83{
84 g_debug (__FUNCTION__);
85 VikExtTool *tool = VIK_EXT_TOOL (object);
86 vik_ext_tools_register (tool);
87}
88
89static void
90modules_register_datasources(VikGobjectBuilder *self, GObject *object)
91{
92 g_debug (__FUNCTION__);
93 VikExtTool *tool = VIK_EXT_TOOL (object);
94 vik_ext_tool_datasources_register (tool);
95}
96
97static void
98modules_register_gototools(VikGobjectBuilder *self, GObject *object)
99{
100 g_debug (__FUNCTION__);
101 VikGotoTool *tool = VIK_GOTO_TOOL (object);
102 vik_goto_register (tool);
103}
104
105static void
106modules_register_routing_engine(VikGobjectBuilder *self, GObject *object)
107{
108 g_debug (__FUNCTION__);
109 VikRoutingEngine *engine = VIK_ROUTING_ENGINE (object);
110 vik_routing_register (engine);
111}
112
113static void
114modules_load_config_dir(const gchar *dir)
115{
116 g_debug("Loading configurations from directory %s", dir);
117
118 /* Maps sources */
119 gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL);
120 if (g_access (maps, R_OK) == 0)
121 {
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);
126 }
127 g_free ( maps );
128
129 /* External tools */
130 gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
131 if (g_access (tools, R_OK) == 0)
132 {
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);
137 }
138 g_free ( tools );
139
140 gchar *datasources = g_build_filename(dir, VIKING_DATASOURCES_FILE, NULL);
141 if (g_access (datasources, R_OK) == 0)
142 {
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);
147 }
148 g_free ( datasources );
149
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)
153 {
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);
158 }
159 g_free ( go_to );
160
161 /* Routing engines */
162 gchar *routing = g_build_filename(dir, VIKING_ROUTING_FILE, NULL);
163 if (g_access (routing, R_OK) == 0)
164 {
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);
169 }
170 g_free ( routing );
171}
172
173static void
174modules_load_config(void)
175{
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--)
185 {
186 modules_load_config_dir(data_dirs[nb_data_dirs-1]);
187 }
188 g_strfreev(data_dirs);
189
190 /* Check if system config is set */
191 modules_load_config_dir(VIKING_SYSCONFDIR);
192
193 const gchar *data_home = a_get_viking_data_home ();
194 if (data_home)
195 {
196 modules_load_config_dir(data_home);
197 }
198
199 /* Check user's home config */
200 modules_load_config_dir(a_get_viking_dir());
201}
202
203static void
204register_loadable_types(void)
205{
206 /* Force registering of loadable types */
207 volatile GType types[] = {
208 /* Maps */
209 VIK_TYPE_SLIPPY_MAP_SOURCE,
210 VIK_TYPE_TMS_MAP_SOURCE,
211 VIK_TYPE_WMSC_MAP_SOURCE,
212
213 /* Goto */
214 VIK_GOTO_XML_TOOL_TYPE,
215
216 /* Tools */
217 VIK_WEBTOOL_CENTER_TYPE,
218 VIK_WEBTOOL_BOUNDS_TYPE,
219
220 /* Datasource */
221 VIK_WEBTOOL_DATASOURCE_TYPE,
222
223 /* Routing */
224 VIK_ROUTING_WEB_ENGINE_TYPE
225 };
226
227 /* kill 'unused variable' + argument type warnings */
228 g_debug("%d types loaded", (int)sizeof(types)/(int)sizeof(GType));
229}
230
231/**
232 * First stage initialization
233 * Can not use a_get_preferences() yet...
234 * See comment in main.c
235 */
236void modules_init()
237{
238// OSM done first so this will be the default service for searching/routing/etc...
239#ifdef VIK_CONFIG_OPENSTREETMAP
240 osm_init();
241 osm_traces_init();
242#endif
243#ifdef VIK_CONFIG_BING
244 bing_init();
245#endif
246#ifdef VIK_CONFIG_GOOGLE
247 google_init();
248#endif
249#ifdef VIK_CONFIG_EXPEDIA
250 expedia_init();
251#endif
252#ifdef VIK_CONFIG_TERRASERVER
253 terraserver_init();
254#endif
255#ifdef VIK_CONFIG_BLUEMARBLE
256 bluemarble_init();
257#endif
258#ifdef VIK_CONFIG_GEONAMES
259 geonames_init();
260#endif
261#ifdef VIK_CONFIG_GEOCACHES
262 a_datasource_gc_init();
263#endif
264
265#ifdef HAVE_LIBMAPNIK
266 vik_mapnik_layer_init();
267#endif
268
269 register_loadable_types ();
270
271 /* As modules are loaded, we can load configuration files */
272 modules_load_config ();
273}
274
275/**
276 * modules_post_init:
277 *
278 * Secondary stage initialization
279 * Can now use a_get_preferences() and a_babel_available()
280 */
281void modules_post_init ()
282{
283#ifdef VIK_CONFIG_GOOGLE
284 google_post_init();
285#endif
286#ifdef HAVE_LIBMAPNIK
287 vik_mapnik_layer_post_init();
288#endif
289}
290
291/**
292 *
293 */
294void modules_uninit()
295{
296#ifdef VIK_CONFIG_OPENSTREETMAP
297 osm_traces_uninit();
298#endif
299#ifdef HAVE_LIBMAPNIK
300 vik_mapnik_layer_uninit();
301#endif
302}