]> git.street.me.uk Git - andy/viking.git/blame - src/modules.c
Ensure highlight for a single track or waypoint is always shown on top.
[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"
dd84b6d1 35#include "spotmaps.h"
cdcaf41c 36#include "google.h"
cdcaf41c 37#include "terraserver.h"
cdcaf41c 38#include "expedia.h"
67209ca8 39#include "osm.h"
843b99df 40#include "osm-traces.h"
7363caa7 41#include "bluemarble.h"
bf5cef41 42#include "geonames.h"
29f1598c 43#include "dir.h"
df82a41c 44#include "vikmapslayer.h"
54b5d793 45#include "vikexttools.h"
82993cc7 46#include "vikexttool_datasources.h"
4c629122 47#include "vikgoto.h"
b44a5ac5 48#include "vikrouting.h"
82c4d692
GB
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"
b44a5ac5 58#include "vikroutingwebengine.h"
82c4d692 59
54b5d793
GB
60#include "vikgobjectbuilder.h"
61
df82a41c 62#define VIKING_MAPS_FILE "maps.xml"
54b5d793 63#define VIKING_EXTTOOLS_FILE "external_tools.xml"
82993cc7 64#define VIKING_DATASOURCES_FILE "datasources.xml"
4c629122 65#define VIKING_GOTOTOOLS_FILE "goto_tools.xml"
b44a5ac5 66#define VIKING_ROUTING_FILE "routing.xml"
54b5d793 67
df82a41c
GB
68static void
69modules_register_map_source(VikGobjectBuilder *self, GObject *object)
70{
71 g_debug (__FUNCTION__);
72 VikMapSource *mapsource = VIK_MAP_SOURCE (object);
73 /* FIXME label should be hosted by object */
74 maps_layer_register_map_source (mapsource);
75}
76
54b5d793
GB
77static void
78modules_register_exttools(VikGobjectBuilder *self, GObject *object)
79{
80 g_debug (__FUNCTION__);
81 VikExtTool *tool = VIK_EXT_TOOL (object);
82 vik_ext_tools_register (tool);
83}
84
82993cc7
RN
85static void
86modules_register_datasources(VikGobjectBuilder *self, GObject *object)
87{
88 g_debug (__FUNCTION__);
89 VikExtTool *tool = VIK_EXT_TOOL (object);
90 vik_ext_tool_datasources_register (tool);
91}
92
4c629122
GB
93static void
94modules_register_gototools(VikGobjectBuilder *self, GObject *object)
95{
96 g_debug (__FUNCTION__);
97 VikGotoTool *tool = VIK_GOTO_TOOL (object);
98 vik_goto_register (tool);
99}
100
b44a5ac5
GB
101static void
102modules_register_routing_engine(VikGobjectBuilder *self, GObject *object)
103{
104 g_debug (__FUNCTION__);
105 VikRoutingEngine *engine = VIK_ROUTING_ENGINE (object);
106 vik_routing_register (engine);
107}
108
54b5d793 109static void
29f1598c 110modules_load_config_dir(const gchar *dir)
54b5d793 111{
29f1598c
GB
112 g_debug("Loading configurations from directory %s", dir);
113
df82a41c 114 /* Maps sources */
29f1598c 115 gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL);
df82a41c
GB
116 if (g_access (maps, R_OK) == 0)
117 {
118 VikGobjectBuilder *builder = vik_gobject_builder_new ();
119 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_map_source), NULL);
120 vik_gobject_builder_parse (builder, maps);
121 g_object_unref (builder);
122 }
644eea0e 123 g_free ( maps );
df82a41c 124
54b5d793 125 /* External tools */
29f1598c 126 gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
54b5d793
GB
127 if (g_access (tools, R_OK) == 0)
128 {
129 VikGobjectBuilder *builder = vik_gobject_builder_new ();
130 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_exttools), NULL);
131 vik_gobject_builder_parse (builder, tools);
132 g_object_unref (builder);
133 }
644eea0e 134 g_free ( tools );
4c629122 135
82993cc7
RN
136 gchar *datasources = g_build_filename(dir, VIKING_DATASOURCES_FILE, NULL);
137 if (g_access (datasources, R_OK) == 0)
138 {
139 VikGobjectBuilder *builder = vik_gobject_builder_new ();
140 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_datasources), NULL);
141 vik_gobject_builder_parse (builder, datasources);
142 g_object_unref (builder);
143 }
644eea0e 144 g_free ( datasources );
82993cc7 145
4c629122 146 /* Go-to search engines */
29f1598c 147 gchar *go_to = g_build_filename(dir, VIKING_GOTOTOOLS_FILE, NULL);
4c629122
GB
148 if (g_access (go_to, R_OK) == 0)
149 {
150 VikGobjectBuilder *builder = vik_gobject_builder_new ();
151 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_gototools), NULL);
152 vik_gobject_builder_parse (builder, go_to);
153 g_object_unref (builder);
154 }
644eea0e 155 g_free ( go_to );
b44a5ac5
GB
156
157 /* Routing engines */
158 gchar *routing = g_build_filename(dir, VIKING_ROUTING_FILE, NULL);
159 if (g_access (routing, R_OK) == 0)
160 {
161 VikGobjectBuilder *builder = vik_gobject_builder_new ();
162 g_signal_connect (builder, "new-object", G_CALLBACK (modules_register_routing_engine), NULL);
163 vik_gobject_builder_parse (builder, routing);
164 g_object_unref (builder);
165 }
644eea0e 166 g_free ( routing );
54b5d793 167}
cdcaf41c 168
29f1598c
GB
169static void
170modules_load_config(void)
171{
172 /* Look in the directories of data path */
173 gchar * * data_dirs = a_get_viking_data_path();
174 /* Priority is standard one:
175 left element is more important than right one.
176 But our logic is to load all existing files and overwrite
177 overlapping config with last recent one.
178 So, we have to process directories in reverse order. */
179 /* First: find the last element */
180 gchar * * ptr = data_dirs;
181 while (*ptr != NULL) ptr++;
182 /* Second: deduce the number of directories */
183 int nb_data_dirs = 0;
184 nb_data_dirs = ptr - data_dirs;
185 /* Last: parse them in reverse order */
186 for (; nb_data_dirs > 0 ; nb_data_dirs--)
187 {
188 modules_load_config_dir(data_dirs[nb_data_dirs-1]);
189 }
190 g_strfreev(data_dirs);
191
192 /* Check if system config is set */
193 modules_load_config_dir(VIKING_SYSCONFDIR);
194
195 const gchar *data_home = a_get_viking_data_home ();
196 if (data_home)
197 {
198 modules_load_config_dir(data_home);
199 }
200
201 /* Check user's home config */
202 modules_load_config_dir(a_get_viking_dir());
203}
204
82c4d692
GB
205static void
206register_loadable_types(void)
207{
208 /* Force registering of loadable types */
209 volatile GType types[] = {
210 /* Maps */
211 VIK_TYPE_SLIPPY_MAP_SOURCE,
212 VIK_TYPE_TMS_MAP_SOURCE,
213 VIK_TYPE_WMSC_MAP_SOURCE,
214
215 /* Goto */
216 VIK_GOTO_XML_TOOL_TYPE,
217
218 /* Tools */
219 VIK_WEBTOOL_CENTER_TYPE,
220 VIK_WEBTOOL_BOUNDS_TYPE,
221
222 /* Datasource */
223 VIK_WEBTOOL_DATASOURCE_TYPE,
224
225 /* Routing */
226 VIK_ROUTING_WEB_ENGINE_TYPE
227 };
228
e36bb2f5
RN
229 /* kill 'unused variable' + argument type warnings */
230 g_debug("%d types loaded", (int)sizeof(types)/(int)sizeof(GType));
82c4d692
GB
231}
232
cdcaf41c
QT
233void modules_init()
234{
9f58c4b4
GB
235#ifdef VIK_CONFIG_BING
236 bing_init();
237#endif
36c78d6d
QT
238#ifdef VIK_CONFIG_GOOGLE
239 google_init();
240#endif
cdcaf41c
QT
241#ifdef VIK_CONFIG_EXPEDIA
242 expedia_init();
243#endif
244#ifdef VIK_CONFIG_TERRASERVER
245 terraserver_init();
246#endif
ca9eb04a 247#ifdef VIK_CONFIG_OPENSTREETMAP
67209ca8 248 osm_init();
843b99df 249 osm_traces_init();
ca9eb04a 250#endif
7363caa7
GB
251#ifdef VIK_CONFIG_BLUEMARBLE
252 bluemarble_init();
253#endif
bf5cef41
GB
254#ifdef VIK_CONFIG_GEONAMES
255 geonames_init();
256#endif
dd84b6d1
GB
257#ifdef VIK_CONFIG_SPOTMAPS
258 spotmaps_init();
259#endif
260
82c4d692 261 register_loadable_types ();
b44a5ac5 262
54b5d793
GB
263 /* As modules are loaded, we can load configuration files */
264 modules_load_config ();
cdcaf41c
QT
265}
266