]> git.street.me.uk Git - andy/viking.git/blob - src/modules.c
[QA] Limit scope of includes of vikutils header.
[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 "vikmapslayer.h"
44 #include "vikexttools.h"
45 #include "vikexttool_datasources.h"
46 #include "vikgoto.h"
47 #include "vikrouting.h"
48
49 /* Loadable types */
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"
58
59 #include "vikgobjectbuilder.h"
60
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"
66
67 static void
68 modules_register_map_source(VikGobjectBuilder *self, GObject *object)
69 {
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);
74 }
75
76 static void
77 modules_register_exttools(VikGobjectBuilder *self, GObject *object)
78 {
79   g_debug (__FUNCTION__);
80   VikExtTool *tool = VIK_EXT_TOOL (object);
81   vik_ext_tools_register (tool);
82 }
83
84 static void
85 modules_register_datasources(VikGobjectBuilder *self, GObject *object)
86 {
87   g_debug (__FUNCTION__);
88   VikExtTool *tool = VIK_EXT_TOOL (object);
89   vik_ext_tool_datasources_register (tool);
90 }
91
92 static void
93 modules_register_gototools(VikGobjectBuilder *self, GObject *object)
94 {
95   g_debug (__FUNCTION__);
96   VikGotoTool *tool = VIK_GOTO_TOOL (object);
97   vik_goto_register (tool);
98 }
99
100 static void
101 modules_register_routing_engine(VikGobjectBuilder *self, GObject *object)
102 {
103   g_debug (__FUNCTION__);
104   VikRoutingEngine *engine = VIK_ROUTING_ENGINE (object);
105   vik_routing_register (engine);
106 }
107
108 static void
109 modules_load_config_dir(const gchar *dir)
110 {
111   g_debug("Loading configurations from directory %s", dir);
112
113   /* Maps sources */
114   gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL);
115   if (g_access (maps, R_OK) == 0)
116   {
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);
121   }
122   g_free ( maps );
123
124   /* External tools */
125   gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
126   if (g_access (tools, R_OK) == 0)
127   {
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);
132   }
133   g_free ( tools );
134
135   gchar *datasources = g_build_filename(dir, VIKING_DATASOURCES_FILE, NULL);
136   if (g_access (datasources, R_OK) == 0)
137   {
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);
142   }
143   g_free ( datasources );
144
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)
148   {
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);
153   }
154   g_free ( go_to );
155
156   /* Routing engines */
157   gchar *routing = g_build_filename(dir, VIKING_ROUTING_FILE, NULL);
158   if (g_access (routing, R_OK) == 0)
159   {
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);
164   }
165   g_free ( routing );
166 }
167
168 static void
169 modules_load_config(void)
170 {
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--)
186   {
187     modules_load_config_dir(data_dirs[nb_data_dirs-1]);
188   }
189   g_strfreev(data_dirs);
190         
191   /* Check if system config is set */
192   modules_load_config_dir(VIKING_SYSCONFDIR);
193
194   const gchar *data_home = a_get_viking_data_home ();
195   if (data_home)
196   {
197     modules_load_config_dir(data_home);
198   }
199         
200   /* Check user's home config */
201   modules_load_config_dir(a_get_viking_dir());
202 }
203
204 static void
205 register_loadable_types(void)
206 {
207   /* Force registering of loadable types */
208   volatile GType types[] = {
209     /* Maps */
210     VIK_TYPE_SLIPPY_MAP_SOURCE,
211     VIK_TYPE_TMS_MAP_SOURCE,
212     VIK_TYPE_WMSC_MAP_SOURCE,
213
214     /* Goto */
215     VIK_GOTO_XML_TOOL_TYPE,
216
217     /* Tools */
218     VIK_WEBTOOL_CENTER_TYPE,
219     VIK_WEBTOOL_BOUNDS_TYPE,
220
221     /* Datasource */
222     VIK_WEBTOOL_DATASOURCE_TYPE,
223
224     /* Routing */
225     VIK_ROUTING_WEB_ENGINE_TYPE
226   };
227
228   /* kill 'unused variable' + argument type warnings */
229   g_debug("%d types loaded", (int)sizeof(types)/(int)sizeof(GType));
230 }
231
232 void modules_init()
233 {
234 #ifdef VIK_CONFIG_BING
235   bing_init();
236 #endif
237 #ifdef VIK_CONFIG_GOOGLE 
238   google_init();
239 #endif
240 #ifdef VIK_CONFIG_EXPEDIA
241   expedia_init();
242 #endif
243 #ifdef VIK_CONFIG_TERRASERVER
244   terraserver_init();
245 #endif
246 #ifdef VIK_CONFIG_OPENSTREETMAP
247   osm_init();
248   osm_traces_init();
249 #endif
250 #ifdef VIK_CONFIG_BLUEMARBLE
251   bluemarble_init();
252 #endif
253 #ifdef VIK_CONFIG_GEONAMES
254   geonames_init();
255 #endif
256
257   register_loadable_types ();
258
259   /* As modules are loaded, we can load configuration files */
260   modules_load_config ();
261 }
262