]> err.no Git - mapper/blob - src/config-gconf.c
Move some variables and enums around
[mapper] / src / config-gconf.c
1 /*
2  * This file is part of mapper
3  *
4  * Copyright (C) 2007 Kaj-Michael Lang
5  * Copyright (C) 2006-2007 John Costigan.
6  *
7  * POI and GPS-Info code originally written by Cezary Jackiewicz.
8  *
9  * Default map data provided by http://www.openstreetmap.org/
10  *
11  * This program is free software; you can redistribute it and/or modify
12  * it under the terms of the GNU General Public License as published by
13  * the Free Software Foundation; either version 2 of the License, or
14  * (at your option) any later version.
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19  * GNU General Public License for more details.
20  *
21  * You should have received a copy of the GNU General Public License along
22  * with this program; if not, write to the Free Software Foundation, Inc.,
23  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24  */
25
26 #include <config.h>
27
28 #include <unistd.h>
29 #include <stdlib.h>
30 #include <string.h>
31 #include <strings.h>
32 #include <stddef.h>
33 #include <math.h>
34 #include <errno.h>
35 #include <sys/wait.h>
36 #include <libintl.h>
37 #include <locale.h>
38 #include <glib/gstdio.h>
39 #include <gtk/gtk.h>
40 #include <libgnomevfs/gnome-vfs.h>
41 #include <curl/multi.h>
42 #include <gconf/gconf-client.h>
43
44 #include "config-gconf.h"
45 #include "utils.h"
46 #include "mapper-types.h"
47 #include "latlon.h"
48 #include "map.h"
49 #include "route.h"
50 #include "db.h"
51 #include "poi.h"
52 #include "gps.h"
53 #include "ui-common.h"
54 #include "settings.h"
55 #include "gpx.h"
56 #include "filter.h"
57 #include "dialogs.h"
58
59 #define PROXY_PORT (8080)
60
61 gint mapper_gconf_get_bound_int(const gchar *path, gint def, gint min, gint max);
62 gint mapper_gconf_get_int(const gchar *path, gint def);
63 gfloat mapper_gconf_get_float(const gchar *path, gfloat def);
64
65 void 
66 config_update_proxy(void)
67 {
68 if (_http_proxy_host)
69         g_free(_http_proxy_host);
70
71 _http_proxy_host=NULL;
72 _http_proxy_port=0;
73
74 /* Get proxy data and register for updates. */
75 if (gconf_client_get_bool(gconf_client, GCONF_KEY_HTTP_PROXY_ON, NULL)) {
76         _http_proxy_host=gconf_client_get_string(gconf_client, GCONF_KEY_HTTP_PROXY_HOST, NULL);
77         _http_proxy_port=mapper_gconf_get_int(GCONF_KEY_HTTP_PROXY_PORT, PROXY_PORT);
78 }
79 }
80
81 static void 
82 path_save(Path *path, const gchar *config_dir, const gchar *file)
83 {
84 GnomeVFSHandle *handle;
85 gchar *tfile;
86 tfile=gnome_vfs_uri_make_full_from_relative(config_dir, file);
87 if (GNOME_VFS_OK == gnome_vfs_create(&handle, tfile, GNOME_VFS_OPEN_WRITE, FALSE, 0600)) {
88         write_gpx(path, handle);
89         gnome_vfs_close(handle);
90 }
91 g_free(tfile);
92 }
93
94 gboolean
95 config_save_repo(void)
96 {
97 GList *curr = _repo_list;
98 GSList *temp_list = NULL;
99 gint curr_repo_index = 0;
100
101 g_assert(gconf_client);
102 /* Save the repositories. */
103 for (curr = _repo_list; curr != NULL; curr = curr->next) {
104         /* Build from each part of a repo, delimited by newline characters:
105          * 1. url
106          * 2. cache_dir
107          * 3. dl_zoom_steps
108          * 4. view_zoom_steps
109          */
110         RepoData *rd = curr->data;
111         gchar buffer[BUFFER_SIZE];
112         g_snprintf(buffer, sizeof(buffer),
113                  "%s\t%s\t%s\t%d\t%d\t%d\t%d",
114                  rd->name,
115                  rd->url,
116                  rd->cache_dir,
117                  rd->dl_zoom_steps,
118                  rd->view_zoom_steps,
119                  rd->double_size, rd->nextable);
120         temp_list = g_slist_append(temp_list, g_strdup(buffer));
121         if (rd == _curr_repo)
122                 gconf_client_set_int(gconf_client, GCONF_KEY_CURRREPO, curr_repo_index, NULL);
123         curr_repo_index++;
124 }
125 gconf_client_set_list(gconf_client, GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, temp_list, NULL);
126
127 g_slist_free(temp_list);
128
129 return TRUE;
130 }
131
132 RepoData *
133 config_parse_repo(gchar * str)
134 {
135         /* Parse each part of a repo, delimited by newline characters:
136          * 1. name
137          * 2. url
138          * 3. cache_dir
139          * 4. dl_zoom_steps
140          * 5. view_zoom_steps
141          */
142 gchar *token, *error_check;
143
144 RepoData *rd = g_new0(RepoData, 1);
145
146 /* Parse name. */
147 token = strsep(&str, "\n\t");
148 if (token)
149         rd->name = g_strdup(token);
150
151 /* Parse URL format. */
152 token = strsep(&str, "\n\t");
153 if (token)
154         rd->url = g_strdup(token);
155
156 /* Parse cache dir. */
157 token = strsep(&str, "\n\t");
158 if (token)
159         rd->cache_dir = gnome_vfs_expand_initial_tilde(token);
160
161 /* Parse download zoom steps. */
162 token = strsep(&str, "\n\t");
163 if (!token || !*token || !(rd->dl_zoom_steps = atoi(token)))
164         rd->dl_zoom_steps = 2;
165
166 /* Parse view zoom steps. */
167 token = strsep(&str, "\n\t");
168 if (!token || !*token || !(rd->view_zoom_steps = atoi(token)))
169         rd->view_zoom_steps = 1;
170
171 /* Parse double-size. */
172 token = strsep(&str, "\n\t");
173 if (token)
174         rd->double_size = atoi(token);  /* Default is zero (FALSE) */
175
176 /* Parse next-able. */
177 token = strsep(&str, "\n\t");
178 if (!token || !*token
179     || (rd->nextable = strtol(token, &error_check, 10), token == str))
180                 rd->nextable = TRUE;
181
182 set_repo_type(rd);
183 return rd;
184 }
185
186 static void
187 config_default_repo(void)
188 {
189 g_assert(gconf_client);
190
191 /* We have no repositories - create a default one. */
192 RepoData *repo = g_new(RepoData, 1);
193
194 /* Get Map Cache Dir.  Default is REPO_DEFAULT_CACHE_DIR. */
195 repo->cache_dir = gconf_client_get_string(gconf_client, GCONF_KEY_MAP_DIR_NAME, NULL);
196
197 if (!repo->cache_dir)
198         repo->cache_dir = gnome_vfs_expand_initial_tilde(REPO_DEFAULT_CACHE_DIR);
199
200 /* Get Map Download URL Format.  Default is "". */
201 repo->url = gconf_client_get_string(gconf_client, GCONF_KEY_MAP_URI_FORMAT, NULL);
202 if (!repo->url)
203         repo->url = g_strdup(REPO_DEFAULT_MAP_URI);
204
205 /* Get Map Download Zoom Steps.  Default is 1. */
206 repo->dl_zoom_steps = gconf_client_get_int(gconf_client, GCONF_KEY_MAP_ZOOM_STEPS, NULL);
207 if (!repo->dl_zoom_steps)
208         repo->dl_zoom_steps = REPO_DEFAULT_DL_ZOOM_STEPS;
209
210 repo->name = g_strdup(REPO_DEFAULT_NAME);
211 repo->view_zoom_steps = REPO_DEFAULT_VIEW_ZOOM_STEPS;
212 repo->double_size = FALSE;
213 repo->nextable = TRUE;
214 set_repo_type(repo);
215
216 _repo_list = g_list_append(_repo_list, repo);
217 repo_set_curr(repo);
218 }
219
220 gboolean
221 config_load_repo(void)
222 {
223 GSList *list, *curr;
224 GConfValue *value;
225 guint curr_repo_index;
226
227 g_assert(gconf_client);
228 curr_repo_index = gconf_client_get_int(gconf_client, GCONF_KEY_CURRREPO, NULL);
229 list = gconf_client_get_list(gconf_client, GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, NULL);
230
231 for (curr = list; curr != NULL; curr = curr->next) {
232         RepoData *rd = config_parse_repo(curr->data);
233         _repo_list = g_list_append(_repo_list, rd);
234         if (!curr_repo_index--)
235                 repo_set_curr(rd);
236         g_free(curr->data);
237 }
238 g_slist_free(list);
239
240 if (_repo_list == NULL)
241         config_default_repo();
242
243 return TRUE;
244 }
245
246 gboolean
247 config_save_home(void)
248 {
249 g_assert(gconf_client);
250
251 /* Save home lat/lon. */
252 gconf_client_set_float(gconf_client, GCONF_KEY_HOME_LAT, _home.lat, NULL);
253 gconf_client_set_float(gconf_client, GCONF_KEY_HOME_LON, _home.lon, NULL);
254
255 gconf_client_suggest_sync(gconf_client, NULL);
256 return TRUE;
257 }
258
259 gboolean
260 config_save_filter(GpsTrackFilter *f)
261 {
262 g_assert(gconf_client);
263
264 /* Filtering */
265 gconf_client_set_bool(gconf_client, GCONF_KEY_GPS_FILTER, f->enabled, NULL);
266 gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_HDOP, f->hdop, NULL);
267 gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_VDOP, f->vdop, NULL);
268 gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_ANGLE, f->angle, NULL);
269 gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, f->osm, NULL);
270 gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_MAXDROP, f->maxdrop, NULL);
271
272 gconf_client_suggest_sync(gconf_client, NULL);
273 return TRUE;
274 }
275
276 /**
277  * Save all configuration data to GCONF.
278  */
279 gboolean
280 config_save(void)
281 {
282 gchar *config_dir;
283 gchar buffer[16];
284 gfloat center_lat, center_lon;
285 gint i;
286
287 g_assert(gconf_client);
288
289 /* Initialize config_dir. */
290 config_dir = gnome_vfs_expand_initial_tilde(CONFIG_DIR_NAME);
291 g_mkdir_with_parents(config_dir, 0700);
292
293 /* Save Receiver MAC from GConf. */
294 if (_gps->io.address)
295         gconf_client_set_string(gconf_client, GCONF_KEY_GPS_MAC, _gps->io.address, NULL);
296 else
297         gconf_client_unset(gconf_client, GCONF_KEY_GPS_MAC, NULL);
298
299 gconf_client_set_int(gconf_client, GCONF_KEY_GPS_TYPE, _gps->io.type, NULL);
300 gconf_client_set_int(gconf_client, GCONF_KEY_GPS_PORT, _gps->io.port, NULL);
301
302 /* Save Auto-Download. */
303 gconf_client_set_bool(gconf_client, GCONF_KEY_AUTO_DOWNLOAD, _auto_download, NULL);
304
305 /* Save Auto-Center Sensitivity. */
306 gconf_client_set_int(gconf_client, GCONF_KEY_CENTER_SENSITIVITY, _center_ratio, NULL);
307
308 /* Save Auto-Center Lead Amount. */
309 gconf_client_set_int(gconf_client, GCONF_KEY_LEAD_AMOUNT, _lead_ratio, NULL);
310
311 /* Save Draw Line Width. */
312 gconf_client_set_int(gconf_client, GCONF_KEY_DRAW_WIDTH, _draw_width, NULL);
313
314 /* Save Announce Advance Notice Ratio. */
315 gconf_client_set_int(gconf_client, GCONF_KEY_ANNOUNCE_NOTICE, _announce_notice_ratio, NULL);
316
317 /* Save Enable Voice flag. */
318 gconf_client_set_bool(gconf_client, GCONF_KEY_ENABLE_VOICE, _enable_voice, NULL);
319
320 /* Save Keep On When Fullscreen flag. */
321 gconf_client_set_bool(gconf_client, GCONF_KEY_ALWAYS_KEEP_ON, _always_keep_on, NULL);
322
323 /* Save Units. */
324 gconf_client_set_string(gconf_client, GCONF_KEY_UNITS, UNITS_TEXT[_units], NULL);
325
326 /* Save Custom Key Actions. */
327 for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
328         gconf_client_set_string(gconf_client, CUSTOM_KEY_GCONF[i], CUSTOM_ACTION_TEXT[_action[i]], NULL);
329
330 /* Save Deg Format. */
331 gconf_client_set_string(gconf_client, GCONF_KEY_DEG_FORMAT,     DEG_FORMAT_TEXT[_degformat], NULL);
332
333 /* Save Speed Limit On flag. */
334 gconf_client_set_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, _speed_on, NULL);
335
336 /* Save Speed Limit. */
337 gconf_client_set_int(gconf_client, GCONF_KEY_SPEED_LIMIT, _speed_limit, NULL);
338
339 /* Save Info Font Size. */
340 gconf_client_set_string(gconf_client, GCONF_KEY_INFO_FONT_SIZE, INFO_FONT_TEXT[_info_font_size], NULL);
341
342 /* Save last latitude/longiture. */
343 gconf_client_set_float(gconf_client, GCONF_KEY_LAT, _gps->data.lat, NULL);
344 gconf_client_set_float(gconf_client, GCONF_KEY_LON, _gps->data.lon, NULL);
345
346 /* Save last center latitude/longitude. */
347 unit2latlon(_center.unitx, _center.unity, center_lat, center_lon);
348 gconf_client_set_float(gconf_client, GCONF_KEY_CENTER_LAT, center_lat, NULL);
349 gconf_client_set_float(gconf_client, GCONF_KEY_CENTER_LON, center_lon, NULL);
350
351 /* Save last Zoom Level. */
352 gconf_client_set_int(gconf_client, GCONF_KEY_ZOOM, _zoom, NULL);
353
354 /* Save Route Directory. */
355 if (_route_dir_uri)
356         gconf_client_set_string(gconf_client, GCONF_KEY_ROUTEDIR, _route_dir_uri, NULL);
357
358 /* Save Last Track File. */
359 if (_track_file_uri)
360         gconf_client_set_string(gconf_client, GCONF_KEY_TRACKFILE, _track_file_uri, NULL);
361
362 /* Save Auto-Center Mode. */
363 gconf_client_set_int(gconf_client, GCONF_KEY_AUTOCENTER_MODE, _center_mode, NULL);
364
365 /* Save Show Scale flag. */
366 gconf_client_set_bool(gconf_client, GCONF_KEY_SHOWSCALE, _show_scale, NULL);
367
368 /* Save Show Tracks flag. */
369 gconf_client_set_bool(gconf_client, GCONF_KEY_SHOWTRACKS, _show_tracks & TRACKS_MASK, NULL);
370
371 /* Save Show Routes flag. */
372 gconf_client_set_bool(gconf_client, GCONF_KEY_SHOWROUTES, _show_tracks & ROUTES_MASK, NULL);
373
374 /* Save Show Velocity Vector flag. */
375 gconf_client_set_bool(gconf_client, GCONF_KEY_SHOWVELVEC, _show_velvec, NULL);
376
377 /* Save Show POIs flag. */
378 gconf_client_set_bool(gconf_client, GCONF_KEY_SHOWPOIS, _show_poi, NULL);
379
380 /* Save Enable GPS flag. */
381 gconf_client_set_bool(gconf_client, GCONF_KEY_ENABLE_GPS, _enable_gps, NULL);
382
383 /* Save Route Locations. */
384 gconf_client_set_list(gconf_client, GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, _loc_list, NULL);
385
386 /* Save GPS Info flag. */
387 gconf_client_set_bool(gconf_client, GCONF_KEY_GPS_INFO, _gps_info, NULL);
388
389 /* Save Route Download URL Format. */
390 gconf_client_set_string(gconf_client, GCONF_KEY_ROUTE_DL_URL, _route_dl_url, NULL);
391
392 /* Save Route Download Radius. */
393 gconf_client_set_int(gconf_client, GCONF_KEY_ROUTE_DL_RADIUS, _route_dl_radius, NULL);
394
395 /* Save Colors. */
396 for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
397         g_snprintf(buffer, sizeof(buffer), "#%02x%02x%02x",
398                  _color[i].red >> 8, _color[i].green >> 8, _color[i].blue >> 8);
399         gconf_client_set_string(gconf_client, COLORABLE_GCONF[i], buffer, NULL);
400 }
401
402 /* Save Mapper database. */
403 if (_mapper_db)
404         gconf_client_set_string(gconf_client, GCONF_KEY_MAPPER_DB, _mapper_db, NULL);
405 else
406         gconf_client_unset(gconf_client, GCONF_KEY_MAPPER_DB, NULL);
407
408 /* Save Show POI below zoom. */
409 gconf_client_set_int(gconf_client, GCONF_KEY_POI_ZOOM, _poi_zoom, NULL);
410
411 gconf_client_suggest_sync(gconf_client, NULL);
412 #if 0
413 gconf_client_clear_cache(gconf_client);
414 #endif
415 g_free(config_dir);
416 return TRUE;
417 }
418
419 static void
420 path_load(Path *path, const gchar *config_dir, const gchar *file)
421 {
422 gchar *pfile;
423 gchar *bytes;
424 gint size;
425
426 pfile = gnome_vfs_uri_make_full_from_relative(config_dir, file);
427 if (GNOME_VFS_OK == gnome_vfs_read_entire_file(pfile, &size, &bytes))
428         parse_gpx(path, bytes, size, 0);        /* 0 to replace track. */
429 g_free(pfile);
430 }
431
432 /**
433  * Initialize all configuration from GCONF.  This should not be called more
434  * than once during execution.
435  */
436 void config_init(void)
437 {
438 GConfValue *value;
439 gchar *config_dir;
440 gchar *str;
441 gint i;
442
443 gconf_client=gconf_client_get_default();
444 if (!gconf_client) {
445         popup_error(_window, _("Failed to initialize GConf. Quitting."));
446         exit(1);
447 }
448
449 /* Preload configuration */
450 gconf_client_add_dir (gconf_client, GCONF_KEY_PREFIX, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
451
452 CenterMode _center_mode = CENTER_LEAD;
453 UnitType _units = UNITS_KM;
454 guint _degformat = DDPDDDDD;
455 InfoFontSize _info_font_size = INFO_FONT_MEDIUM;
456
457 /* Initialize config_dir. */
458 config_dir = gnome_vfs_expand_initial_tilde(CONFIG_DIR_NAME);
459 g_mkdir_with_parents(config_dir, 0700);
460
461 /* Get Receiver MAC from GConf.  Default is scanned via hci_inquiry. */
462 _gps->io.address=gconf_client_get_string(gconf_client, GCONF_KEY_GPS_MAC, NULL);
463 _gps->io.port=mapper_gconf_get_int(GCONF_KEY_GPS_PORT, 2497);
464 _gps->io.type=(GpsIOSourceType)mapper_gconf_get_bound_int(GCONF_KEY_GPS_TYPE, GPS_IO_SIMULATION, GPS_IO_TYPE_MIN+1, GPS_IO_TYPE_MAX-1);
465
466 /* Get Auto-Download.  Default is FALSE. */
467 _auto_download = gconf_client_get_bool(gconf_client, GCONF_KEY_AUTO_DOWNLOAD, NULL);
468
469 _center_ratio=mapper_gconf_get_int(GCONF_KEY_CENTER_SENSITIVITY, 7);
470 _lead_ratio=mapper_gconf_get_int(GCONF_KEY_LEAD_AMOUNT, 5);
471 _draw_width=mapper_gconf_get_int(GCONF_KEY_DRAW_WIDTH, 4);
472
473 /* Invalidate destination */
474 _dest.valid=FALSE;
475
476 /* Get Announce Advance Notice - Default is 30. */
477 _announce_notice_ratio=mapper_gconf_get_int(GCONF_KEY_ANNOUNCE_NOTICE, 8);
478
479 /* Get Enable Voice flag.  Default is TRUE. */
480 value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_VOICE, NULL);
481 if (value) {
482         _enable_voice = gconf_value_get_bool(value);
483         gconf_value_free(value);
484 } else {
485         _enable_voice = TRUE;
486 }
487
488 _voice_pitch=mapper_gconf_get_bound_int(GCONF_KEY_VOICE_PITCH, 50, 10, 99);
489 _voice_speed=mapper_gconf_get_bound_int(GCONF_KEY_VOICE_SPEED, 120, 80, 370);
490
491 /* Get Always Keep On flag.  Default is FALSE. */
492 _always_keep_on = gconf_client_get_bool(gconf_client,GCONF_KEY_ALWAYS_KEEP_ON, NULL);
493
494 filter.enabled = gconf_client_get_bool(gconf_client, GCONF_KEY_GPS_FILTER, NULL);
495 filter.hdop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_HDOP, NULL);
496 filter.vdop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_VDOP, NULL);
497 filter.angle = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_ANGLE, NULL);
498 filter.osm = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, NULL);
499 filter.maxdrop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_MAXDROP, NULL);
500 filter.drop_cnt=0;
501 BOUND(filter.maxdrop, 0, 60);
502 BOUND(filter.hdop, 0, 50);
503 BOUND(filter.vdop, 0, 50);
504 BOUND(filter.angle, 0, 45);
505
506 /* Get Units.  Default is UNITS_KM. */
507 {
508         gchar *units_str = gconf_client_get_string(gconf_client, GCONF_KEY_UNITS, NULL);
509         guint i = 0;
510         if (units_str)
511                 for (i = UNITS_ENUM_COUNT - 1; i > 0; i--)
512                         if (!strcmp(units_str, UNITS_TEXT[i]))
513                                 break;
514         _units = i;
515 }
516
517         /* Get Custom Key Actions. */
518 {
519         gint i;
520         for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++) {
521                 gint j = CUSTOM_KEY_DEFAULT[i];
522                 gchar *str = gconf_client_get_string(gconf_client, CUSTOM_KEY_GCONF[i], NULL);
523                 if (str)
524                         for (j = CUSTOM_ACTION_ENUM_COUNT - 1; j > 0; j--)
525                                 if (!strcmp(str, CUSTOM_ACTION_TEXT[j]))
526                                         break;
527                 _action[i] = j;
528         }
529 }
530
531 /* Get Deg format.  Default is DDPDDDDD. */
532 {
533         gchar *degformat_key_str = gconf_client_get_string(gconf_client,
534                                                            GCONF_KEY_DEG_FORMAT,
535                                                            NULL);
536         guint i = 0;
537         if (degformat_key_str)
538                 for (i = DEG_FORMAT_ENUM_COUNT - 1; i > 0; i--)
539                         if (!strcmp(degformat_key_str, DEG_FORMAT_TEXT[i]))
540                                 break;
541         _degformat = i;
542 }
543
544 /* Get Speed Limit On flag.  Default is FALSE. */
545 _speed_on = gconf_client_get_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, NULL);
546
547 /* Get Speed Limit */
548 _speed_limit = gconf_client_get_int(gconf_client, GCONF_KEY_SPEED_LIMIT, NULL);
549 BOUND(_speed_limit, 1, 200);
550
551 /* Get Info Font Size.  Default is INFO_FONT_MEDIUM. */
552 {
553         gchar *info_font_size_str = gconf_client_get_string(gconf_client, GCONF_KEY_INFO_FONT_SIZE, NULL);
554         guint i = -1;
555         if (info_font_size_str)
556                 for (i = INFO_FONT_ENUM_COUNT - 1; i >= 0; i--)
557                         if (!strcmp(info_font_size_str, INFO_FONT_TEXT[i]))
558                                 break;
559         if (i == -1)
560                 i = INFO_FONT_MEDIUM;
561         _info_font_size = i;
562 }
563
564 /* Get Auto-Download.  Default is FALSE. */
565 _auto_download = gconf_client_get_bool(gconf_client, GCONF_KEY_AUTO_DOWNLOAD, NULL);
566
567 /* Get saved location */
568 _gps->data.lat = gconf_client_get_float(gconf_client, GCONF_KEY_LAT, NULL);
569 _gps->data.lon = gconf_client_get_float(gconf_client, GCONF_KEY_LON, NULL);
570 if (_gps->data.lat==0.0) _gps->data.lat=60.20;
571 if (_gps->data.lon==0.0) _gps->data.lon=22.20;
572
573 /* Home */
574 _home.valid=TRUE;
575 value = gconf_client_get(gconf_client, GCONF_KEY_HOME_LAT, NULL);
576 if (value) {
577         _home.lat = gconf_value_get_float(value);
578         gconf_value_free(value);
579 } else {
580         _home.valid=FALSE;
581 }
582
583 value = gconf_client_get(gconf_client, GCONF_KEY_HOME_LON, NULL);
584 if (value) {
585         _home.lon = gconf_value_get_float(value);
586         gconf_value_free(value);
587 } else {
588         _home.valid=FALSE;
589 }
590
591 /* Turku is default */
592 if (_home.valid==FALSE) {
593         _home.lat=64.20;
594         _home.lon=22.20;
595         _home.valid=TRUE;
596 }
597
598 /* Get last center point. */
599 {
600         gfloat center_lat, center_lon;
601
602         /* Get last saved latitude.  Default is last saved latitude. */
603         value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LAT, NULL);
604         if (value) {
605                 center_lat = gconf_value_get_float(value);
606                 gconf_value_free(value);
607         } else {
608                 center_lat = _gps->data.lat;
609         }
610
611         /* Get last saved longitude.  Default is last saved longitude. */
612         value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LON, NULL);
613         if (value) {
614                 center_lon = gconf_value_get_float(value);
615                 gconf_value_free(value);
616         } else {
617                 center_lon = _gps->data.lon;
618         }
619
620         latlon2unit(center_lat, center_lon, _center.unitx, _center.unity);
621 }
622
623 config_load_repo();
624
625 /* Get last Zoom Level.  Default is 12. */
626 value = gconf_client_get(gconf_client, GCONF_KEY_ZOOM, NULL);
627 if (value) {
628         _zoom = gconf_value_get_int(value) / _curr_repo->view_zoom_steps * _curr_repo->view_zoom_steps;
629         gconf_value_free(value);
630 } else {
631         _zoom = 12 / _curr_repo->view_zoom_steps * _curr_repo->view_zoom_steps;
632 }
633 BOUND(_zoom, 0, MAX_ZOOM - 1);
634 _world_size_tiles = unit2tile(WORLD_SIZE_UNITS);
635
636 /* Get Route Directory.  Default is NULL. */
637 _route_dir_uri = gconf_client_get_string(gconf_client, GCONF_KEY_ROUTEDIR, NULL);
638
639 /* Get Last Track File.  Default is NULL. */
640 _track_file_uri = gconf_client_get_string(gconf_client, GCONF_KEY_TRACKFILE, NULL);
641
642 _center_mode=mapper_gconf_get_int(GCONF_KEY_AUTOCENTER_MODE, CENTER_LEAD);
643
644 /* Get Show Scale flag.  Default is TRUE. */
645 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWSCALE, NULL);
646 if (value) {
647         _show_scale = gconf_value_get_bool(value);
648         gconf_value_free(value);
649 } else {
650         _show_scale = TRUE;
651 }
652
653 /* Get Show Tracks flag.  Default is TRUE. */
654 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWTRACKS, NULL);
655 if (value) {
656         _show_tracks |= (gconf_value_get_bool(value) ? TRACKS_MASK : 0);
657         gconf_value_free(value);
658 } else {
659         _show_tracks |= TRACKS_MASK;
660 }
661
662 /* Get Show Routes flag.  Default is TRUE. */
663 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWROUTES, NULL);
664 if (value) {
665         _show_tracks |= (gconf_value_get_bool(value) ? ROUTES_MASK : 0);
666         gconf_value_free(value);
667 } else {
668         _show_tracks |= ROUTES_MASK;
669 }
670
671 /* Get Show Velocity Vector flag.  Default is TRUE. */
672 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWVELVEC, NULL);
673 if (value) {
674         _show_velvec = gconf_value_get_bool(value);
675         gconf_value_free(value);
676 } else {
677         _show_velvec = TRUE;
678 }
679
680 /* Get Show Velocity Vector flag.  Default is TRUE. */
681 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWPOIS, NULL);
682 if (value) {
683         _show_poi = gconf_value_get_bool(value);
684         gconf_value_free(value);
685 } else {
686         _show_poi = TRUE;
687 }
688
689 /* Get Enable GPS flag. Default is FALSE. */
690 value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_GPS, NULL);
691 if (value) {
692         _enable_gps = gconf_value_get_bool(value);
693         gconf_value_free(value);
694 } else {
695         _enable_gps = FALSE;
696 }
697
698 /* Initialize _conn_state based on _enable_gps-> */
699 _gps->io.conn = (_enable_gps ? RCVR_DOWN : RCVR_OFF);
700
701 /* Load the route locations. */
702 {
703         GSList *curr;
704         _loc_list = gconf_client_get_list(gconf_client, GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, NULL);
705         _loc_model = gtk_list_store_new(1, G_TYPE_STRING);
706         for (curr = _loc_list; curr != NULL; curr = curr->next) {
707                 GtkTreeIter iter;
708                 gtk_list_store_insert_with_values(_loc_model, &iter, INT_MAX, 0, curr->data, -1);
709         }
710 }
711
712 /* Get Mapper Database. Default is in REPO_DEFAULT_CACHE_BASE */
713 _mapper_db = gconf_client_get_string(gconf_client, GCONF_KEY_MAPPER_DB, NULL);
714 if (_mapper_db == NULL) {
715         gchar *db_base = gnome_vfs_expand_initial_tilde(REPO_DEFAULT_CACHE_BASE);
716         _mapper_db = gnome_vfs_uri_make_full_from_relative(db_base, "mapper.db");
717         g_free(db_base);
718 }
719
720 _poi_zoom = mapper_gconf_get_int(GCONF_KEY_POI_ZOOM, 6);
721
722 /* Get GPS Info flag. Default is FALSE. */
723 value = gconf_client_get(gconf_client, GCONF_KEY_GPS_INFO, NULL);
724 if (value) {
725         _gps_info = gconf_value_get_bool(value);
726         gconf_value_free(value);
727 } else {
728         _gps_info = FALSE;
729 }
730
731 /* Get Route Download URL. Default is:
732  * "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s" */
733 _route_dl_url = gconf_client_get_string(gconf_client, GCONF_KEY_ROUTE_DL_URL, NULL);
734 if (_route_dl_url == NULL)
735         _route_dl_url = g_strdup("http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s");
736
737 /* Get Route Download Radius.  Default is 4. */
738 _route_dl_radius = mapper_gconf_get_int(GCONF_KEY_ROUTE_DL_RADIUS, 4);
739
740 /* Get Colors. */
741 for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
742         str = gconf_client_get_string(gconf_client, COLORABLE_GCONF[i], NULL);
743         if (!str || !gdk_color_parse(str, &_color[i]))
744                 _color[i] = COLORABLE_DEFAULT[i];
745 }
746
747 /* Get current proxy settings. */
748 config_update_proxy();
749
750 gconf_client_clear_cache(gconf_client);
751 g_free(config_dir);
752 }
753
754 /**
755  *
756  */
757 gint 
758 mapper_gconf_get_int(const gchar *path, gint def)
759 {
760 GConfValue *value;
761 gint v;
762
763 g_assert(gconf_client);
764 value=gconf_client_get(gconf_client, path, NULL);
765 if (value) {
766         v=gconf_value_get_int(value);
767         gconf_value_free(value);
768 } else {
769         v=def;
770 }
771 return v;
772 }
773
774 /**
775  *
776  */
777 gint
778 mapper_gconf_get_bound_int(const gchar *path, gint def, gint min, gint max)
779 {
780 gint r;
781
782 r=mapper_gconf_get_int(path, def);
783 BOUND(r, min, max);
784 return r;
785 }
786
787 gfloat
788 mapper_gconf_get_float(const gchar *path, gfloat def)
789 {
790 GConfValue *value;
791 gfloat v;
792
793 g_assert(gconf_client);
794 value=gconf_client_get(gconf_client, path, NULL);
795 if (value) {
796         v=gconf_value_get_float(value);
797         gconf_value_free(value);
798 } else {
799         v=def;
800 }
801 return v;
802 }