]> git.street.me.uk Git - andy/viking.git/blame - src/modules.c
Merge commit 'ToolbarConfig'
[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. */
e2e65875 178 int nb_data_dirs = g_strv_length ( data_dirs );
29f1598c
GB
179 for (; nb_data_dirs > 0 ; nb_data_dirs--)
180 {
181 modules_load_config_dir(data_dirs[nb_data_dirs-1]);
182 }
183 g_strfreev(data_dirs);
e2e65875 184
29f1598c
GB
185 /* Check if system config is set */
186 modules_load_config_dir(VIKING_SYSCONFDIR);
187
188 const gchar *data_home = a_get_viking_data_home ();
189 if (data_home)
190 {
191 modules_load_config_dir(data_home);
192 }
e2e65875 193
29f1598c
GB
194 /* Check user's home config */
195 modules_load_config_dir(a_get_viking_dir());
196}
197
82c4d692
GB
198static void
199register_loadable_types(void)
200{
201 /* Force registering of loadable types */
202 volatile GType types[] = {
203 /* Maps */
204 VIK_TYPE_SLIPPY_MAP_SOURCE,
205 VIK_TYPE_TMS_MAP_SOURCE,
206 VIK_TYPE_WMSC_MAP_SOURCE,
207
208 /* Goto */
209 VIK_GOTO_XML_TOOL_TYPE,
210
211 /* Tools */
212 VIK_WEBTOOL_CENTER_TYPE,
213 VIK_WEBTOOL_BOUNDS_TYPE,
214
215 /* Datasource */
216 VIK_WEBTOOL_DATASOURCE_TYPE,
217
218 /* Routing */
219 VIK_ROUTING_WEB_ENGINE_TYPE
220 };
221
e36bb2f5
RN
222 /* kill 'unused variable' + argument type warnings */
223 g_debug("%d types loaded", (int)sizeof(types)/(int)sizeof(GType));
82c4d692
GB
224}
225
cdcaf41c
QT
226void modules_init()
227{
9f58c4b4
GB
228#ifdef VIK_CONFIG_BING
229 bing_init();
230#endif
36c78d6d
QT
231#ifdef VIK_CONFIG_GOOGLE
232 google_init();
233#endif
cdcaf41c
QT
234#ifdef VIK_CONFIG_EXPEDIA
235 expedia_init();
236#endif
237#ifdef VIK_CONFIG_TERRASERVER
238 terraserver_init();
239#endif
ca9eb04a 240#ifdef VIK_CONFIG_OPENSTREETMAP
67209ca8 241 osm_init();
843b99df 242 osm_traces_init();
ca9eb04a 243#endif
7363caa7
GB
244#ifdef VIK_CONFIG_BLUEMARBLE
245 bluemarble_init();
246#endif
bf5cef41
GB
247#ifdef VIK_CONFIG_GEONAMES
248 geonames_init();
249#endif
dd84b6d1 250
82c4d692 251 register_loadable_types ();
b44a5ac5 252
54b5d793
GB
253 /* As modules are loaded, we can load configuration files */
254 modules_load_config ();
cdcaf41c
QT
255}
256