]> git.street.me.uk Git - andy/viking.git/blob - src/modules.c
Add a preference to control the number of recent files made available.
[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
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"
58 #include "vikroutingwebengine.h"
59
60 #include "vikgobjectbuilder.h"
61
62 #define VIKING_MAPS_FILE "maps.xml"
63 #define VIKING_EXTTOOLS_FILE "external_tools.xml"
64 #define VIKING_DATASOURCES_FILE "datasources.xml"
65 #define VIKING_GOTOTOOLS_FILE "goto_tools.xml"
66 #define VIKING_ROUTING_FILE "routing.xml"
67
68 static void
69 modules_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
77 static void
78 modules_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
85 static void
86 modules_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
93 static void
94 modules_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
101 static void
102 modules_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
109 static void
110 modules_load_config_dir(const gchar *dir)
111 {
112   g_debug("Loading configurations from directory %s", dir);
113
114   /* Maps sources */
115   gchar *maps = g_build_filename(dir, VIKING_MAPS_FILE, NULL);
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   }
123   g_free ( maps );
124
125   /* External tools */
126   gchar *tools = g_build_filename(dir, VIKING_EXTTOOLS_FILE, NULL);
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   }
134   g_free ( tools );
135
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   }
144   g_free ( datasources );
145
146   /* Go-to search engines */
147   gchar *go_to = g_build_filename(dir, VIKING_GOTOTOOLS_FILE, NULL);
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   }
155   g_free ( go_to );
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   }
166   g_free ( routing );
167 }
168
169 static void
170 modules_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
205 static void
206 register_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
229   /* kill 'unused variable' + argument type warnings */
230   g_debug("%d types loaded", (int)sizeof(types)/(int)sizeof(GType));
231 }
232
233 void modules_init()
234 {
235 #ifdef VIK_CONFIG_BING
236   bing_init();
237 #endif
238 #ifdef VIK_CONFIG_GOOGLE 
239   google_init();
240 #endif
241 #ifdef VIK_CONFIG_EXPEDIA
242   expedia_init();
243 #endif
244 #ifdef VIK_CONFIG_TERRASERVER
245   terraserver_init();
246 #endif
247 #ifdef VIK_CONFIG_OPENSTREETMAP
248   osm_init();
249   osm_traces_init();
250 #endif
251 #ifdef VIK_CONFIG_BLUEMARBLE
252   bluemarble_init();
253 #endif
254 #ifdef VIK_CONFIG_GEONAMES
255   geonames_init();
256 #endif
257 #ifdef VIK_CONFIG_SPOTMAPS
258   spotmaps_init();
259 #endif
260
261   register_loadable_types ();
262
263   /* As modules are loaded, we can load configuration files */
264   modules_load_config ();
265 }
266