]> git.street.me.uk Git - andy/viking.git/blob - src/modules.c
Generalize routing engine
[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 "spotmaps.h"
36 #include "google.h"
37 #include "terraserver.h"
38 #include "expedia.h"
39 #include "osm.h"
40 #include "osm-traces.h"
41 #include "bluemarble.h"
42 #include "geonames.h"
43 #include "dir.h"
44 #include "vikmapslayer.h"
45 #include "vikexttools.h"
46 #include "vikexttool_datasources.h"
47 #include "vikgoto.h"
48 #include "vikrouting.h"
49 #include "vikroutingwebengine.h"
50 #include "vikgobjectbuilder.h"
51
52 #define VIKING_MAPS_FILE "maps.xml"
53 #define VIKING_EXTTOOLS_FILE "external_tools.xml"
54 #define VIKING_DATASOURCES_FILE "datasources.xml"
55 #define VIKING_GOTOTOOLS_FILE "goto_tools.xml"
56 #define VIKING_ROUTING_FILE "routing.xml"
57
58 static void
59 modules_register_map_source(VikGobjectBuilder *self, GObject *object)
60 {
61   g_debug (__FUNCTION__);
62   VikMapSource *mapsource = VIK_MAP_SOURCE (object);
63   /* FIXME label should be hosted by object */
64   maps_layer_register_map_source (mapsource);
65 }
66
67 static void
68 modules_register_exttools(VikGobjectBuilder *self, GObject *object)
69 {
70   g_debug (__FUNCTION__);
71   VikExtTool *tool = VIK_EXT_TOOL (object);
72   vik_ext_tools_register (tool);
73 }
74
75 static void
76 modules_register_datasources(VikGobjectBuilder *self, GObject *object)
77 {
78   g_debug (__FUNCTION__);
79   VikExtTool *tool = VIK_EXT_TOOL (object);
80   vik_ext_tool_datasources_register (tool);
81 }
82
83 static void
84 modules_register_gototools(VikGobjectBuilder *self, GObject *object)
85 {
86   g_debug (__FUNCTION__);
87   VikGotoTool *tool = VIK_GOTO_TOOL (object);
88   vik_goto_register (tool);
89 }
90
91 static void
92 modules_register_routing_engine(VikGobjectBuilder *self, GObject *object)
93 {
94   g_debug (__FUNCTION__);
95   VikRoutingEngine *engine = VIK_ROUTING_ENGINE (object);
96   vik_routing_register (engine);
97 }
98
99 static void
100 modules_load_config_dir(const gchar *dir)
101 {
102   g_debug("Loading configurations from directory %s", dir);
103
104   /* Maps sources */
105   gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL);
106   if (g_access (maps, R_OK) == 0)
107   {
108         VikGobjectBuilder *builder = vik_gobject_builder_new ();
109         g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_map_source), NULL);
110         vik_gobject_builder_parse (builder, maps);
111         g_object_unref (builder);
112   }
113
114   /* External tools */
115   gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
116   if (g_access (tools, R_OK) == 0)
117   {
118         VikGobjectBuilder *builder = vik_gobject_builder_new ();
119         g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_exttools), NULL);
120         vik_gobject_builder_parse (builder, tools);
121         g_object_unref (builder);
122   }
123
124   gchar *datasources = g_build_filename(dir, VIKING_DATASOURCES_FILE, NULL);
125   if (g_access (datasources, R_OK) == 0)
126   {
127         VikGobjectBuilder *builder = vik_gobject_builder_new ();
128         g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_datasources), NULL);
129         vik_gobject_builder_parse (builder, datasources);
130         g_object_unref (builder);
131   }
132
133   /* Go-to search engines */
134   gchar *go_to = g_build_filename(dir, VIKING_GOTOTOOLS_FILE, NULL);
135   if (g_access (go_to, R_OK) == 0)
136   {
137         VikGobjectBuilder *builder = vik_gobject_builder_new ();
138         g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_gototools), NULL);
139         vik_gobject_builder_parse (builder, go_to);
140         g_object_unref (builder);
141   }
142
143   /* Routing engines */
144   gchar *routing = g_build_filename(dir, VIKING_ROUTING_FILE, NULL);
145   if (g_access (routing, R_OK) == 0)
146   {
147         VikGobjectBuilder *builder = vik_gobject_builder_new ();
148         g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_routing_engine), NULL);
149         vik_gobject_builder_parse (builder, routing);
150         g_object_unref (builder);
151   }
152 }
153
154 static void
155 modules_load_config(void)
156 {
157   /* Look in the directories of data path */
158   gchar * * data_dirs = a_get_viking_data_path();
159   /* Priority is standard one:
160      left element is more important than right one.
161      But our logic is to load all existing files and overwrite
162      overlapping config with last recent one.
163      So, we have to process directories in reverse order. */
164   /* First: find the last element */
165   gchar * * ptr = data_dirs;
166   while (*ptr != NULL) ptr++;
167   /* Second: deduce the number of directories */
168   int nb_data_dirs = 0;
169   nb_data_dirs = ptr - data_dirs;
170   /* Last: parse them in reverse order */
171   for (; nb_data_dirs > 0 ; nb_data_dirs--)
172   {
173     modules_load_config_dir(data_dirs[nb_data_dirs-1]);
174   }
175   g_strfreev(data_dirs);
176         
177   /* Check if system config is set */
178   modules_load_config_dir(VIKING_SYSCONFDIR);
179
180   const gchar *data_home = a_get_viking_data_home ();
181   if (data_home)
182   {
183     modules_load_config_dir(data_home);
184   }
185         
186   /* Check user's home config */
187   modules_load_config_dir(a_get_viking_dir());
188 }
189
190 void modules_init()
191 {
192 #ifdef VIK_CONFIG_BING
193   bing_init();
194 #endif
195 #ifdef VIK_CONFIG_GOOGLE 
196   google_init();
197 #endif
198 #ifdef VIK_CONFIG_EXPEDIA
199   expedia_init();
200 #endif
201 #ifdef VIK_CONFIG_TERRASERVER
202   terraserver_init();
203 #endif
204 #ifdef VIK_CONFIG_OPENSTREETMAP
205   osm_init();
206   osm_traces_init();
207 #endif
208 #ifdef VIK_CONFIG_BLUEMARBLE
209   bluemarble_init();
210 #endif
211 #ifdef VIK_CONFIG_GEONAMES
212   geonames_init();
213 #endif
214 #ifdef VIK_CONFIG_SPOTMAPS
215   spotmaps_init();
216 #endif
217
218   /* Force registering of loadable types */
219   VIK_ROUTING_WEB_ENGINE_TYPE;
220
221   /* As modules are loaded, we can load configuration files */
222   modules_load_config ();
223 }
224