]> git.street.me.uk Git - andy/viking.git/blob - src/modules.c
Make OSM services the default by including these modules first.
[andy/viking.git] / src / modules.c
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
72 static void
73 modules_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
81 static void
82 modules_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
89 static void
90 modules_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
97 static void
98 modules_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
105 static void
106 modules_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
113 static void
114 modules_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
173 static void
174 modules_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
203 static void
204 register_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  */
236 void 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  */
281 void 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  */
294 void 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 }