]> err.no Git - mapper/blob - src/config-gconf.c
Add a enum for the gpx path prepend/append/new modes instead of arbitrary numbers.
[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         gpx_write(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 gconf_client_set_int(gconf_client, GCONF_KEY_TRACK_DL_RADIUS, _track_dl_radius, NULL);
395
396 /* Save Colors. */
397 for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
398         g_snprintf(buffer, sizeof(buffer), "#%02x%02x%02x",
399                  _color[i].red >> 8, _color[i].green >> 8, _color[i].blue >> 8);
400         gconf_client_set_string(gconf_client, COLORABLE_GCONF[i], buffer, NULL);
401 }
402
403 /* Save Mapper database. */
404 if (_mapper_db)
405         gconf_client_set_string(gconf_client, GCONF_KEY_MAPPER_DB, _mapper_db, NULL);
406 else
407         gconf_client_unset(gconf_client, GCONF_KEY_MAPPER_DB, NULL);
408
409 /* Save Show POI below zoom. */
410 gconf_client_set_int(gconf_client, GCONF_KEY_POI_ZOOM, _poi_zoom, NULL);
411
412 gconf_client_suggest_sync(gconf_client, NULL);
413 #if 0
414 gconf_client_clear_cache(gconf_client);
415 #endif
416 g_free(config_dir);
417 return TRUE;
418 }
419
420 static void
421 path_load(Path *path, const gchar *config_dir, const gchar *file)
422 {
423 gchar *pfile;
424 gchar *bytes;
425 gint size;
426
427 pfile = gnome_vfs_uri_make_full_from_relative(config_dir, file);
428 if (GNOME_VFS_OK == gnome_vfs_read_entire_file(pfile, &size, &bytes))
429         gpx_parse(path, bytes, size, GPX_PATH_NEW);
430 g_free(pfile);
431 }
432
433 /**
434  * Initialize all configuration from GCONF.  This should not be called more
435  * than once during execution.
436  */
437 void config_init(void)
438 {
439 GConfValue *value;
440 gchar *config_dir;
441 gchar *str;
442 gint i;
443
444 gconf_client=gconf_client_get_default();
445 if (!gconf_client) {
446         popup_error(_window, _("Failed to initialize GConf. Quitting."));
447         exit(1);
448 }
449
450 /* Preload configuration */
451 gconf_client_add_dir (gconf_client, GCONF_KEY_PREFIX, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
452
453 CenterMode _center_mode = CENTER_LEAD;
454 UnitType _units = UNITS_KM;
455 guint _degformat = DDPDDDDD;
456 InfoFontSize _info_font_size = INFO_FONT_MEDIUM;
457
458 /* Initialize config_dir. */
459 config_dir = gnome_vfs_expand_initial_tilde(CONFIG_DIR_NAME);
460 g_mkdir_with_parents(config_dir, 0700);
461
462 /* Get Receiver MAC from GConf.  Default is scanned via hci_inquiry. */
463 _gps->io.address=gconf_client_get_string(gconf_client, GCONF_KEY_GPS_MAC, NULL);
464 _gps->io.port=mapper_gconf_get_int(GCONF_KEY_GPS_PORT, 2947);
465 _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);
466
467 /* Get Auto-Download.  Default is FALSE. */
468 _auto_download = gconf_client_get_bool(gconf_client, GCONF_KEY_AUTO_DOWNLOAD, NULL);
469
470 _center_ratio=mapper_gconf_get_int(GCONF_KEY_CENTER_SENSITIVITY, 7);
471 _lead_ratio=mapper_gconf_get_int(GCONF_KEY_LEAD_AMOUNT, 5);
472 _draw_width=mapper_gconf_get_int(GCONF_KEY_DRAW_WIDTH, 4);
473
474 /* Invalidate destination */
475 _dest.valid=FALSE;
476
477 /* Get Announce Advance Notice - Default is 30. */
478 _announce_notice_ratio=mapper_gconf_get_int(GCONF_KEY_ANNOUNCE_NOTICE, 8);
479
480 /* Get Enable Voice flag.  Default is TRUE. */
481 value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_VOICE, NULL);
482 if (value) {
483         _enable_voice = gconf_value_get_bool(value);
484         gconf_value_free(value);
485 } else {
486         _enable_voice = TRUE;
487 }
488
489 _voice_pitch=mapper_gconf_get_bound_int(GCONF_KEY_VOICE_PITCH, 50, 10, 99);
490 _voice_speed=mapper_gconf_get_bound_int(GCONF_KEY_VOICE_SPEED, 120, 80, 370);
491
492 /* Get Always Keep On flag.  Default is FALSE. */
493 _always_keep_on = gconf_client_get_bool(gconf_client,GCONF_KEY_ALWAYS_KEEP_ON, NULL);
494
495 filter.enabled = gconf_client_get_bool(gconf_client, GCONF_KEY_GPS_FILTER, NULL);
496 filter.hdop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_HDOP, NULL);
497 filter.vdop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_VDOP, NULL);
498 filter.angle = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_ANGLE, NULL);
499 filter.osm = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, NULL);
500 filter.maxdrop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_MAXDROP, NULL);
501 filter.drop_cnt=0;
502 BOUND(filter.maxdrop, 0, 60);
503 BOUND(filter.hdop, 0, 50);
504 BOUND(filter.vdop, 0, 50);
505 BOUND(filter.angle, 0, 45);
506
507 /* Get Units.  Default is UNITS_KM. */
508 {
509         gchar *units_str = gconf_client_get_string(gconf_client, GCONF_KEY_UNITS, NULL);
510         guint i = 0;
511         if (units_str)
512                 for (i = UNITS_ENUM_COUNT - 1; i > 0; i--)
513                         if (!strcmp(units_str, UNITS_TEXT[i]))
514                                 break;
515         _units = i;
516 }
517
518         /* Get Custom Key Actions. */
519 {
520         gint i;
521         for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++) {
522                 gint j = CUSTOM_KEY_DEFAULT[i];
523                 gchar *str = gconf_client_get_string(gconf_client, CUSTOM_KEY_GCONF[i], NULL);
524                 if (str)
525                         for (j = CUSTOM_ACTION_ENUM_COUNT - 1; j > 0; j--)
526                                 if (!strcmp(str, CUSTOM_ACTION_TEXT[j]))
527                                         break;
528                 _action[i] = j;
529         }
530 }
531
532 /* Get Deg format.  Default is DDPDDDDD. */
533 {
534         gchar *degformat_key_str = gconf_client_get_string(gconf_client,
535                                                            GCONF_KEY_DEG_FORMAT,
536                                                            NULL);
537         guint i = 0;
538         if (degformat_key_str)
539                 for (i = DEG_FORMAT_ENUM_COUNT - 1; i > 0; i--)
540                         if (!strcmp(degformat_key_str, DEG_FORMAT_TEXT[i]))
541                                 break;
542         _degformat = i;
543 }
544
545 /* Get Speed Limit On flag.  Default is FALSE. */
546 _speed_on = gconf_client_get_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, NULL);
547
548 /* Get Speed Limit */
549 _speed_limit = gconf_client_get_int(gconf_client, GCONF_KEY_SPEED_LIMIT, NULL);
550 BOUND(_speed_limit, 1, 200);
551
552 /* Get Info Font Size.  Default is INFO_FONT_MEDIUM. */
553 {
554         gchar *info_font_size_str = gconf_client_get_string(gconf_client, GCONF_KEY_INFO_FONT_SIZE, NULL);
555         guint i = -1;
556         if (info_font_size_str)
557                 for (i = INFO_FONT_ENUM_COUNT - 1; i >= 0; i--)
558                         if (!strcmp(info_font_size_str, INFO_FONT_TEXT[i]))
559                                 break;
560         if (i == -1)
561                 i = INFO_FONT_MEDIUM;
562         _info_font_size = i;
563 }
564
565 /* Get Auto-Download.  Default is FALSE. */
566 _auto_download = gconf_client_get_bool(gconf_client, GCONF_KEY_AUTO_DOWNLOAD, NULL);
567
568 /* Get saved location */
569 _gps->data.lat = gconf_client_get_float(gconf_client, GCONF_KEY_LAT, NULL);
570 _gps->data.lon = gconf_client_get_float(gconf_client, GCONF_KEY_LON, NULL);
571 if (_gps->data.lat==0.0) _gps->data.lat=60.20;
572 if (_gps->data.lon==0.0) _gps->data.lon=22.20;
573
574 /* Home */
575 _home.valid=TRUE;
576 value = gconf_client_get(gconf_client, GCONF_KEY_HOME_LAT, NULL);
577 if (value) {
578         _home.lat = gconf_value_get_float(value);
579         gconf_value_free(value);
580 } else {
581         _home.valid=FALSE;
582 }
583
584 value = gconf_client_get(gconf_client, GCONF_KEY_HOME_LON, NULL);
585 if (value) {
586         _home.lon = gconf_value_get_float(value);
587         gconf_value_free(value);
588 } else {
589         _home.valid=FALSE;
590 }
591
592 /* Turku is default */
593 if (_home.valid==FALSE) {
594         _home.lat=64.20;
595         _home.lon=22.20;
596         _home.valid=TRUE;
597 }
598
599 /* Get last center point. */
600 {
601         gfloat center_lat, center_lon;
602
603         /* Get last saved latitude.  Default is last saved latitude. */
604         value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LAT, NULL);
605         if (value) {
606                 center_lat = gconf_value_get_float(value);
607                 gconf_value_free(value);
608         } else {
609                 center_lat = _gps->data.lat;
610         }
611
612         /* Get last saved longitude.  Default is last saved longitude. */
613         value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LON, NULL);
614         if (value) {
615                 center_lon = gconf_value_get_float(value);
616                 gconf_value_free(value);
617         } else {
618                 center_lon = _gps->data.lon;
619         }
620
621         latlon2unit(center_lat, center_lon, _center.unitx, _center.unity);
622 }
623
624 config_load_repo();
625
626 /* Get last Zoom Level.  Default is 12. */
627 value = gconf_client_get(gconf_client, GCONF_KEY_ZOOM, NULL);
628 if (value) {
629         _zoom = gconf_value_get_int(value) / _curr_repo->view_zoom_steps * _curr_repo->view_zoom_steps;
630         gconf_value_free(value);
631 } else {
632         _zoom = 12 / _curr_repo->view_zoom_steps * _curr_repo->view_zoom_steps;
633 }
634 BOUND(_zoom, 0, MAX_ZOOM - 1);
635 _world_size_tiles = unit2tile(WORLD_SIZE_UNITS);
636
637 /* Get Route Directory.  Default is NULL. */
638 _route_dir_uri = gconf_client_get_string(gconf_client, GCONF_KEY_ROUTEDIR, NULL);
639
640 /* Get Last Track File.  Default is NULL. */
641 _track_file_uri = gconf_client_get_string(gconf_client, GCONF_KEY_TRACKFILE, NULL);
642
643 _center_mode=mapper_gconf_get_int(GCONF_KEY_AUTOCENTER_MODE, CENTER_LEAD);
644
645 /* Get Show Scale flag.  Default is TRUE. */
646 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWSCALE, NULL);
647 if (value) {
648         _show_scale = gconf_value_get_bool(value);
649         gconf_value_free(value);
650 } else {
651         _show_scale = TRUE;
652 }
653
654 /* Get Show Tracks flag.  Default is TRUE. */
655 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWTRACKS, NULL);
656 if (value) {
657         _show_tracks |= (gconf_value_get_bool(value) ? TRACKS_MASK : 0);
658         gconf_value_free(value);
659 } else {
660         _show_tracks |= TRACKS_MASK;
661 }
662
663 /* Get Show Routes flag.  Default is TRUE. */
664 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWROUTES, NULL);
665 if (value) {
666         _show_tracks |= (gconf_value_get_bool(value) ? ROUTES_MASK : 0);
667         gconf_value_free(value);
668 } else {
669         _show_tracks |= ROUTES_MASK;
670 }
671
672 /* Get Show Velocity Vector flag.  Default is TRUE. */
673 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWVELVEC, NULL);
674 if (value) {
675         _show_velvec = gconf_value_get_bool(value);
676         gconf_value_free(value);
677 } else {
678         _show_velvec = TRUE;
679 }
680
681 /* Get Show Velocity Vector flag.  Default is TRUE. */
682 value = gconf_client_get(gconf_client, GCONF_KEY_SHOWPOIS, NULL);
683 if (value) {
684         _show_poi = gconf_value_get_bool(value);
685         gconf_value_free(value);
686 } else {
687         _show_poi = TRUE;
688 }
689
690 /* Get Enable GPS flag. Default is FALSE. */
691 value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_GPS, NULL);
692 if (value) {
693         _enable_gps = gconf_value_get_bool(value);
694         gconf_value_free(value);
695 } else {
696         _enable_gps = FALSE;
697 }
698
699 /* Initialize _conn_state based on _enable_gps-> */
700 _gps->io.conn = (_enable_gps ? RCVR_DOWN : RCVR_OFF);
701
702 /* Load the route locations. */
703 {
704         GSList *curr;
705         _loc_list = gconf_client_get_list(gconf_client, GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, NULL);
706         _loc_model = gtk_list_store_new(1, G_TYPE_STRING);
707         for (curr = _loc_list; curr != NULL; curr = curr->next) {
708                 GtkTreeIter iter;
709                 gtk_list_store_insert_with_values(_loc_model, &iter, INT_MAX, 0, curr->data, -1);
710         }
711 }
712
713 /* Get Mapper Database. Default is in REPO_DEFAULT_CACHE_BASE */
714 _mapper_db = gconf_client_get_string(gconf_client, GCONF_KEY_MAPPER_DB, NULL);
715 if (_mapper_db == NULL) {
716         gchar *db_base = gnome_vfs_expand_initial_tilde(REPO_DEFAULT_CACHE_BASE);
717         _mapper_db = gnome_vfs_uri_make_full_from_relative(db_base, "mapper.db");
718         g_free(db_base);
719 }
720
721 _poi_zoom = mapper_gconf_get_int(GCONF_KEY_POI_ZOOM, 6);
722
723 /* Get GPS Info flag. Default is FALSE. */
724 value = gconf_client_get(gconf_client, GCONF_KEY_GPS_INFO, NULL);
725 if (value) {
726         _gps_info = gconf_value_get_bool(value);
727         gconf_value_free(value);
728 } else {
729         _gps_info = FALSE;
730 }
731
732 /* Get Route Download URL. Default is:
733  * "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s" */
734 _route_dl_url = gconf_client_get_string(gconf_client, GCONF_KEY_ROUTE_DL_URL, NULL);
735 if (_route_dl_url == NULL)
736         _route_dl_url = g_strdup("http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s");
737
738 /* Get Route Download Radius.  Default is 4. */
739 _route_dl_radius = mapper_gconf_get_int(GCONF_KEY_ROUTE_DL_RADIUS, 4);
740 _track_dl_radius = mapper_gconf_get_int(GCONF_KEY_TRACK_DL_RADIUS, 4);
741
742 /* Get Colors. */
743 for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
744         str = gconf_client_get_string(gconf_client, COLORABLE_GCONF[i], NULL);
745         if (!str || !gdk_color_parse(str, &_color[i]))
746                 _color[i] = COLORABLE_DEFAULT[i];
747 }
748
749 /* Get current proxy settings. */
750 config_update_proxy();
751
752 gconf_client_clear_cache(gconf_client);
753 g_free(config_dir);
754 }
755
756 /**
757  *
758  */
759 gint 
760 mapper_gconf_get_int(const gchar *path, gint def)
761 {
762 GConfValue *value;
763 gint v;
764
765 g_assert(gconf_client);
766 value=gconf_client_get(gconf_client, path, NULL);
767 if (value) {
768         v=gconf_value_get_int(value);
769         gconf_value_free(value);
770 } else {
771         v=def;
772 }
773 return v;
774 }
775
776 /**
777  *
778  */
779 gint
780 mapper_gconf_get_bound_int(const gchar *path, gint def, gint min, gint max)
781 {
782 gint r;
783
784 r=mapper_gconf_get_int(path, def);
785 BOUND(r, min, max);
786 return r;
787 }
788
789 gfloat
790 mapper_gconf_get_float(const gchar *path, gfloat def)
791 {
792 GConfValue *value;
793 gfloat v;
794
795 g_assert(gconf_client);
796 value=gconf_client_get(gconf_client, path, NULL);
797 if (value) {
798         v=gconf_value_get_float(value);
799         gconf_value_free(value);
800 } else {
801         v=def;
802 }
803 return v;
804 }