]> git.street.me.uk Git - andy/viking.git/blame - src/modules.c
Show distance axis grids on distance graphs.
[andy/viking.git] / src / modules.c
CommitLineData
cdcaf41c
QT
1/*
2 * viking -- GPS Data and Topo Analyzer, Explorer, and Manager
3 *
29f1598c 4 * Copyright (C) 2006-2012, Guilhem Bonnefille <guilhem.bonnefille@gmail.com>
cdcaf41c
QT
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
54b5d793
GB
26#include <glib.h>
27#include <glib/gstdio.h>
28#ifdef HAVE_UNISTD_H
29#include <unistd.h>
30#endif
31
cdcaf41c
QT
32#include "modules.h"
33
9f58c4b4 34#include "bing.h"
cdcaf41c 35#include "google.h"
cdcaf41c 36#include "terraserver.h"
cdcaf41c 37#include "expedia.h"
67209ca8 38#include "osm.h"
843b99df 39#include "osm-traces.h"
7363caa7 40#include "bluemarble.h"
bf5cef41 41#include "geonames.h"
29f1598c 42#include "dir.h"
df82a41c 43#include "vikmapslayer.h"
54b5d793 44#include "vikexttools.h"
82993cc7 45#include "vikexttool_datasources.h"
4c629122 46#include "vikgoto.h"
b44a5ac5 47#include "vikrouting.h"
82c4d692
GB
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"
b44a5ac5 57#include "vikroutingwebengine.h"
82c4d692 58
54b5d793
GB
59#include "vikgobjectbuilder.h"
60
df82a41c 61#define VIKING_MAPS_FILE "maps.xml"
54b5d793 62#define VIKING_EXTTOOLS_FILE "external_tools.xml"
82993cc7 63#define VIKING_DATASOURCES_FILE "datasources.xml"
4c629122 64#define VIKING_GOTOTOOLS_FILE "goto_tools.xml"
b44a5ac5 65#define VIKING_ROUTING_FILE "routing.xml"
54b5d793 66
df82a41c
GB
67static void
68modules_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
54b5d793
GB
76static void
77modules_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
82993cc7
RN
84static void
85modules_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
4c629122
GB
92static void
93modules_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
b44a5ac5
GB
100static void
101modules_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
54b5d793 108static void
29f1598c 109modules_load_config_dir(const gchar *dir)
54b5d793 110{
29f1598c
GB
111 g_debug("Loading configurations from directory %s", dir);
112
df82a41c 113 /* Maps sources */
29f1598c 114 gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL);
df82a41c
GB
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 }
644eea0e 122 g_free ( maps );
df82a41c 123
54b5d793 124 /* External tools */
29f1598c 125 gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
54b5d793
GB
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 }
644eea0e 133 g_free ( tools );
4c629122 134
82993cc7
RN
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 }
644eea0e 143 g_free ( datasources );
82993cc7 144
4c629122 145 /* Go-to search engines */
29f1598c 146 gchar *go_to = g_build_filename(dir, VIKING_GOTOTOOLS_FILE, NULL);
4c629122
GB
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 }
644eea0e 154 g_free ( go_to );
b44a5ac5
GB
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 }
644eea0e 165 g_free ( routing );
54b5d793 166}
cdcaf41c 167
29f1598c
GB
168static void
169modules_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
82c4d692
GB
204static void
205register_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
e36bb2f5
RN
228 /* kill 'unused variable' + argument type warnings */
229 g_debug("%d types loaded", (int)sizeof(types)/(int)sizeof(GType));
82c4d692
GB
230}
231
cdcaf41c
QT
232void modules_init()
233{
9f58c4b4
GB
234#ifdef VIK_CONFIG_BING
235 bing_init();
236#endif
36c78d6d
QT
237#ifdef VIK_CONFIG_GOOGLE
238 google_init();
239#endif
cdcaf41c
QT
240#ifdef VIK_CONFIG_EXPEDIA
241 expedia_init();
242#endif
243#ifdef VIK_CONFIG_TERRASERVER
244 terraserver_init();
245#endif
ca9eb04a 246#ifdef VIK_CONFIG_OPENSTREETMAP
67209ca8 247 osm_init();
843b99df 248 osm_traces_init();
ca9eb04a 249#endif
7363caa7
GB
250#ifdef VIK_CONFIG_BLUEMARBLE
251 bluemarble_init();
252#endif
bf5cef41
GB
253#ifdef VIK_CONFIG_GEONAMES
254 geonames_init();
255#endif
dd84b6d1 256
82c4d692 257 register_loadable_types ();
b44a5ac5 258
54b5d793
GB
259 /* As modules are loaded, we can load configuration files */
260 modules_load_config ();
cdcaf41c
QT
261}
262