]> err.no Git - mapper/blob - src/config-gconf.c
Mapper: Quick adjust for RepoData -> TileRepo rename/gobjectifying
[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 "db.h"
49 #include "poi.h"
50 #include "gps.h"
51 #include "ui-common.h"
52 #include "settings.h"
53 #include "filter.h"
54 #include "dialogs.h"
55 #include "map-repo-manager.h"
56 #include "tilerepo.h"
57
58 #define PROXY_PORT (8080)
59
60 gint mapper_gconf_get_int(const gchar *path, gint def);
61 gint mapper_gconf_get_bound_int(const gchar *path, gint def, gint min, gint max);
62 gfloat mapper_gconf_get_float(const gchar *path, gfloat def);
63 gboolean mapper_gconf_get_boolean(const gchar *path, gboolean 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 gboolean
82 config_save_repo(void)
83 {
84 GList *curr = _repo_list;
85 GSList *temp_list = NULL;
86 gint curr_repo_index = 0;
87
88 g_assert(gconf_client);
89 /* Save the repositories. */
90 for (curr = _repo_list; curr != NULL; curr = curr->next) {
91         gchar *repostr;
92
93         /* Build from each part of a repo, delimited by newline characters:
94          * 1. url
95          * 2. cache_dir
96          * 3. dl_zoom_steps
97          * 4. view_zoom_steps
98          */
99         TileRepo *rd=curr->data;
100
101         repostr=tile_repo_get_string(rd);
102         if (repostr) {
103                 temp_list=g_slist_append(temp_list, repostr);
104                 if (rd==_curr_repo)
105                         gconf_client_set_int(gconf_client, GCONF_KEY_CURRREPO, curr_repo_index, NULL);
106                 curr_repo_index++;
107         }
108 }
109 gconf_client_set_list(gconf_client, GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, temp_list, NULL);
110
111 g_slist_free(temp_list);
112
113 return TRUE;
114 }
115
116 static TileRepo *
117 config_default_repo(void)
118 {
119 TileRepo *repo;
120
121 g_assert(gconf_client);
122
123 /* We have no repositories - create a default one. */
124 repo=tile_repo_new();
125
126 /* Get Map Cache Dir.  Default is REPO_DEFAULT_CACHE_DIR. */
127 repo->cache_dir=gconf_client_get_string(gconf_client, GCONF_KEY_MAP_DIR_NAME, NULL);
128
129 if (!repo->cache_dir)
130         repo->cache_dir=gnome_vfs_expand_initial_tilde(REPO_DEFAULT_CACHE_DIR);
131
132 /* Get Map Download URL Format.  Default is "". */
133 repo->url=gconf_client_get_string(gconf_client, GCONF_KEY_MAP_URI_FORMAT, NULL);
134 if (!repo->url)
135         repo->url=g_strdup(REPO_DEFAULT_MAP_URI);
136
137 /* Get Map Download Zoom Steps.  Default is 1. */
138 repo->dl_zoom_steps=gconf_client_get_int(gconf_client, GCONF_KEY_MAP_ZOOM_STEPS, NULL);
139 if (!repo->dl_zoom_steps)
140         repo->dl_zoom_steps=REPO_DEFAULT_DL_ZOOM_STEPS;
141
142 repo->name=g_strdup(REPO_DEFAULT_NAME);
143 repo->view_zoom_steps=REPO_DEFAULT_VIEW_ZOOM_STEPS;
144 repo->double_size=FALSE;
145 repo->nextable=TRUE;
146 tile_repo_set_type(repo);
147
148 _repo_list=g_list_append(_repo_list, repo);
149 return repo;
150 }
151
152 gboolean
153 config_load_repo(void)
154 {
155 GSList *list, *curr;
156 guint curr_repo_index;
157
158 g_assert(gconf_client);
159
160 curr_repo_index=gconf_client_get_int(gconf_client, GCONF_KEY_CURRREPO, NULL);
161 list=gconf_client_get_list(gconf_client, GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, NULL);
162
163 for (curr = list; curr != NULL; curr = curr->next) {
164         TileRepo *rd=tile_repo_new_from_string(curr->data);
165
166         if (rd) {
167                 _repo_list=g_list_append(_repo_list, rd);
168                 if (!curr_repo_index--)
169                         _curr_repo=rd;
170         }
171         g_free(curr->data);
172 }
173 g_slist_free(list);
174
175 if (_repo_list==NULL)
176         _curr_repo=config_default_repo();
177
178 return TRUE;
179 }
180
181 gboolean
182 config_load_position(Position *pos, const gchar *key)
183 {
184 g_assert(gconf_client);
185
186 pos->valid=gconf_client_get_pair(gconf_client, key, GCONF_VALUE_FLOAT, GCONF_VALUE_FLOAT, &pos->lat, &pos->lon, NULL);
187 if (!pos->valid) {
188         pos->lat=NAN;
189         pos->lon=NAN;
190 } else if (pos->lat==NAN || pos->lon==NAN)
191         pos->valid=FALSE;
192 return pos->valid;
193 }
194
195 gboolean
196 config_save_position(Position *pos, const gchar *key)
197 {
198 g_assert(gconf_client);
199
200 return gconf_client_set_pair(gconf_client, key, GCONF_VALUE_FLOAT, GCONF_VALUE_FLOAT, &pos->lat, &pos->lon, NULL);
201 }
202
203 gboolean
204 config_save_filter(GpsTrackFilter *f)
205 {
206 g_assert(gconf_client);
207
208 /* Filtering */
209 gconf_client_set_bool(gconf_client, GCONF_KEY_GPS_FILTER, f->enabled, NULL);
210 gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_HDOP, f->hdop, NULL);
211 gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_VDOP, f->vdop, NULL);
212 gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_ANGLE, f->angle, NULL);
213 gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, f->osm, NULL);
214 gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_MAXDROP, f->maxdrop, NULL);
215
216 gconf_client_suggest_sync(gconf_client, NULL);
217 return TRUE;
218 }
219
220 /**
221  * Save all configuration data to GCONF.
222  */
223 gboolean
224 config_save(void)
225 {
226 gchar *config_dir;
227 gchar buffer[16];
228 gfloat center_lat, center_lon;
229 gint i;
230
231 g_assert(gconf_client);
232
233 /* Initialize config_dir. */
234 config_dir = gnome_vfs_expand_initial_tilde(CONFIG_DIR_NAME);
235 g_mkdir_with_parents(config_dir, 0700);
236
237 /* Save Receiver MAC from GConf. */
238 if (_gps->io.address)
239         gconf_client_set_string(gconf_client, GCONF_KEY_GPS_MAC, _gps->io.address, NULL);
240 else
241         gconf_client_unset(gconf_client, GCONF_KEY_GPS_MAC, NULL);
242
243 gconf_client_set_int(gconf_client, GCONF_KEY_GPS_TYPE, _gps->io.type, NULL);
244 gconf_client_set_int(gconf_client, GCONF_KEY_GPS_PORT, _gps->io.port, NULL);
245
246 /* Save Auto-Download. */
247 gconf_client_set_bool(gconf_client, GCONF_KEY_AUTO_DOWNLOAD, _auto_download, NULL);
248
249 /* Save Auto-Center Sensitivity. */
250 gconf_client_set_int(gconf_client, GCONF_KEY_CENTER_SENSITIVITY, _center_ratio, NULL);
251
252 /* Save Auto-Center Lead Amount. */
253 gconf_client_set_int(gconf_client, GCONF_KEY_LEAD_AMOUNT, _lead_ratio, NULL);
254
255 /* Save Draw Line Width. */
256 gconf_client_set_int(gconf_client, GCONF_KEY_DRAW_WIDTH, _draw_width, NULL);
257
258 /* Save Announce Advance Notice Ratio. */
259 gconf_client_set_int(gconf_client, GCONF_KEY_ANNOUNCE_NOTICE, _announce_notice_ratio, NULL);
260
261 /* Set announcement flags */
262 gconf_client_set_bool(gconf_client, GCONF_KEY_ANNOUNCE_WAYPOINTS, _announce_waypoints, NULL);
263 gconf_client_set_bool(gconf_client, GCONF_KEY_ANNOUNCE_OVERSPEED, _announce_overspeed, NULL);
264 gconf_client_set_bool(gconf_client, GCONF_KEY_ANNOUNCE_DESTINATION, _announce_destination, NULL);
265
266 /* Save Enable Voice flag. */
267 gconf_client_set_bool(gconf_client, GCONF_KEY_ENABLE_VOICE, _enable_voice, NULL);
268
269 /* Save Keep On When Fullscreen flag. */
270 gconf_client_set_bool(gconf_client, GCONF_KEY_ALWAYS_KEEP_ON, _always_keep_on, NULL);
271
272 /* Save Units. */
273 gconf_client_set_string(gconf_client, GCONF_KEY_UNITS, UNITS_TEXT[_units], NULL);
274
275 /* Save Custom Key Actions. */
276 for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
277         gconf_client_set_string(gconf_client, CUSTOM_KEY_GCONF[i], CUSTOM_ACTION_TEXT[_action[i]], NULL);
278
279 /* Save Deg Format. */
280 gconf_client_set_string(gconf_client, GCONF_KEY_DEG_FORMAT,     DEG_FORMAT_TEXT[_degformat], NULL);
281
282 /* Save Speed Limit On flag. */
283 gconf_client_set_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, _speed_on, NULL);
284
285 /* Save Speed Limit. */
286 gconf_client_set_int(gconf_client, GCONF_KEY_SPEED_LIMIT, _speed_limit, NULL);
287
288 /* Save Info Font Size. */
289 gconf_client_set_string(gconf_client, GCONF_KEY_INFO_FONT_SIZE, INFO_FONT_TEXT[_info_font_size], NULL);
290
291 /* Save last latitude/longiture. */
292 gconf_client_set_float(gconf_client, GCONF_KEY_LAT, _gps->data.lat, NULL);
293 gconf_client_set_float(gconf_client, GCONF_KEY_LON, _gps->data.lon, NULL);
294
295 /* Save last center latitude/longitude. */
296 gconf_client_set_float(gconf_client, GCONF_KEY_CENTER_LAT, center_lat, NULL);
297 gconf_client_set_float(gconf_client, GCONF_KEY_CENTER_LON, center_lon, NULL);
298
299 /* Save last Zoom Level. */
300 gconf_client_set_int(gconf_client, GCONF_KEY_ZOOM, _zoom, NULL);
301
302 /* Save Route Directory. */
303 if (_route_dir_uri)
304         gconf_client_set_string(gconf_client, GCONF_KEY_ROUTEDIR, _route_dir_uri, NULL);
305
306 /* Save Last Track File. */
307 if (_track_file_uri)
308         gconf_client_set_string(gconf_client, GCONF_KEY_TRACKFILE, _track_file_uri, NULL);
309
310 /* Save Auto-Center Mode. */
311 gconf_client_set_int(gconf_client, GCONF_KEY_AUTOCENTER_MODE, _center_mode, NULL);
312
313 /* Save Show Scale flag. */
314 gconf_client_set_bool(gconf_client, GCONF_KEY_SHOWSCALE, _show_scale, NULL);
315
316 /* Save Show Tracks flag. */
317 gconf_client_set_bool(gconf_client, GCONF_KEY_SHOWTRACKS, _show_tracks & TRACKS_MASK, NULL);
318
319 /* Save Show Routes flag. */
320 gconf_client_set_bool(gconf_client, GCONF_KEY_SHOWROUTES, _show_tracks & ROUTES_MASK, NULL);
321
322 /* Save Show Velocity Vector flag. */
323 gconf_client_set_bool(gconf_client, GCONF_KEY_SHOWVELVEC, _show_velvec, NULL);
324
325 /* Save Show POIs flag. */
326 gconf_client_set_bool(gconf_client, GCONF_KEY_SHOWPOIS, _show_poi, NULL);
327
328 /* Save Enable GPS flag. */
329 gconf_client_set_bool(gconf_client, GCONF_KEY_ENABLE_GPS, _enable_gps, NULL);
330
331 /* Save Route Locations. */
332 gconf_client_set_list(gconf_client, GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, _loc_list, NULL);
333
334 /* Save GPS Info flag. */
335 gconf_client_set_bool(gconf_client, GCONF_KEY_GPS_INFO, _gps_info, NULL);
336
337 /* Save Route Download URL Format. */
338 gconf_client_set_string(gconf_client, GCONF_KEY_ROUTE_DL_URL, _route_dl_url, NULL);
339
340 /* Save Route Download Radius. */
341 gconf_client_set_int(gconf_client, GCONF_KEY_ROUTE_DL_RADIUS, _route_dl_radius, NULL);
342 gconf_client_set_int(gconf_client, GCONF_KEY_TRACK_DL_RADIUS, _track_dl_radius, NULL);
343
344 /* Save Colors. */
345 for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
346         g_snprintf(buffer, sizeof(buffer), "#%02x%02x%02x",
347                  _color[i].red >> 8, _color[i].green >> 8, _color[i].blue >> 8);
348         gconf_client_set_string(gconf_client, COLORABLE_GCONF[i], buffer, NULL);
349 }
350
351 /* Save Mapper database. */
352 if (_mapper_db)
353         gconf_client_set_string(gconf_client, GCONF_KEY_MAPPER_DB, _mapper_db, NULL);
354 else
355         gconf_client_unset(gconf_client, GCONF_KEY_MAPPER_DB, NULL);
356
357 /* Save Show POI below zoom. */
358 gconf_client_set_int(gconf_client, GCONF_KEY_POI_ZOOM, _poi_zoom, NULL);
359
360 gconf_client_suggest_sync(gconf_client, NULL);
361 g_free(config_dir);
362 return TRUE;
363 }
364
365 /**
366  *
367  */
368 gboolean
369 config_load_string_list(const gchar *gconf_key, GSList **list, GtkListStore **model)
370 {
371 GSList *curr;
372
373 *list=gconf_client_get_list(gconf_client, gconf_key, GCONF_VALUE_STRING, NULL);
374 *model=gtk_list_store_new(1, G_TYPE_STRING);
375 for (curr = *list; curr != NULL; curr = curr->next) {
376         GtkTreeIter iter;
377         gtk_list_store_insert_with_values(*model, &iter, INT_MAX, 0, curr->data, -1);
378 }
379 return TRUE;
380 }
381
382 /**
383  * Initialize all configuration from GCONF.  This should not be called more
384  * than once during execution.
385  */
386 void
387 config_init(void)
388 {
389 GConfValue *value;
390 gchar *config_dir;
391 gchar *str;
392 gint i;
393 GtkMapCenterMode _center_mode = CENTER_LEAD;
394 UnitType _units = UNITS_KM;
395 guint _degformat = DDPDDDDD;
396 InfoFontSize _info_font_size = INFO_FONT_MEDIUM;
397
398 gconf_client=gconf_client_get_default();
399 if (!gconf_client) {
400         popup_error(_window, _("Failed to initialize GConf. Quitting."));
401         exit(1);
402 }
403
404 /* Preload configuration */
405 gconf_client_add_dir (gconf_client, GCONF_KEY_PREFIX, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
406
407 /* Initialize config_dir. */
408 config_dir = gnome_vfs_expand_initial_tilde(CONFIG_DIR_NAME);
409 g_mkdir_with_parents(config_dir, 0700);
410
411 /* Get Receiver MAC from GConf.  Default is scanned via hci_inquiry. */
412 _gps->io.address=gconf_client_get_string(gconf_client, GCONF_KEY_GPS_MAC, NULL);
413 _gps->io.port=mapper_gconf_get_int(GCONF_KEY_GPS_PORT, 2947);
414 _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);
415
416 /* Get Auto-Download.  Default is FALSE. */
417 _auto_download = gconf_client_get_bool(gconf_client, GCONF_KEY_AUTO_DOWNLOAD, NULL);
418
419 _center_ratio=mapper_gconf_get_int(GCONF_KEY_CENTER_SENSITIVITY, 7);
420 _lead_ratio=mapper_gconf_get_int(GCONF_KEY_LEAD_AMOUNT, 5);
421 _draw_width=mapper_gconf_get_int(GCONF_KEY_DRAW_WIDTH, 4);
422
423 /* Invalidate destination */
424 _dest->valid=FALSE;
425
426 /* Get Announce Advance Notice - Default is 30. */
427 _announce_notice_ratio=mapper_gconf_get_int(GCONF_KEY_ANNOUNCE_NOTICE, 8);
428
429 _announce_waypoints=mapper_gconf_get_boolean(GCONF_KEY_ANNOUNCE_WAYPOINTS, TRUE);
430 _announce_overspeed=mapper_gconf_get_boolean(GCONF_KEY_ANNOUNCE_OVERSPEED, FALSE);
431 _announce_destination=mapper_gconf_get_boolean(GCONF_KEY_ANNOUNCE_DESTINATION, FALSE);
432
433 /* Get Enable Voice flag.  Default is TRUE. */
434 _enable_voice=mapper_gconf_get_boolean(GCONF_KEY_ENABLE_VOICE, TRUE);
435 _voice_pitch=mapper_gconf_get_bound_int(GCONF_KEY_VOICE_PITCH, 50, 10, 99);
436 _voice_speed=mapper_gconf_get_bound_int(GCONF_KEY_VOICE_SPEED, 120, 80, 370);
437
438 /* Get Always Keep On flag.  Default is FALSE. */
439 _always_keep_on=mapper_gconf_get_boolean(GCONF_KEY_ALWAYS_KEEP_ON, FALSE);
440
441 filter.enabled = gconf_client_get_bool(gconf_client, GCONF_KEY_GPS_FILTER, NULL);
442 filter.hdop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_HDOP, NULL);
443 filter.vdop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_VDOP, NULL);
444 filter.angle = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_ANGLE, NULL);
445 filter.osm = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, NULL);
446 filter.maxdrop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_MAXDROP, NULL);
447 filter.drop_cnt=0;
448 BOUND(filter.maxdrop, 0, 60);
449 BOUND(filter.hdop, 0, 50);
450 BOUND(filter.vdop, 0, 50);
451 BOUND(filter.angle, 0, 45);
452
453 /* Get Units.  Default is UNITS_KM. */
454 {
455         gchar *units_str = gconf_client_get_string(gconf_client, GCONF_KEY_UNITS, NULL);
456         guint i = 0;
457         if (units_str)
458                 for (i = UNITS_ENUM_COUNT - 1; i > 0; i--)
459                         if (!strcmp(units_str, UNITS_TEXT[i]))
460                                 break;
461         _units = i;
462 }
463
464         /* Get Custom Key Actions. */
465 {
466         gint i;
467         for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++) {
468                 gint j = CUSTOM_KEY_DEFAULT[i];
469                 gchar *str = gconf_client_get_string(gconf_client, CUSTOM_KEY_GCONF[i], NULL);
470                 if (str)
471                         for (j = CUSTOM_ACTION_ENUM_COUNT - 1; j > 0; j--)
472                                 if (!strcmp(str, CUSTOM_ACTION_TEXT[j]))
473                                         break;
474                 _action[i] = j;
475         }
476 }
477
478 /* Get Deg format.  Default is DDPDDDDD. */
479 {
480         gchar *degformat_key_str = gconf_client_get_string(gconf_client, GCONF_KEY_DEG_FORMAT, NULL);
481         guint i = 0;
482         if (degformat_key_str)
483                 for (i = DEG_FORMAT_ENUM_COUNT - 1; i > 0; i--)
484                         if (!strcmp(degformat_key_str, DEG_FORMAT_TEXT[i]))
485                                 break;
486         _degformat = i;
487 }
488
489 /* Get Info Font Size.  Default is INFO_FONT_MEDIUM. */
490 {
491         gchar *info_font_size_str = gconf_client_get_string(gconf_client, GCONF_KEY_INFO_FONT_SIZE, NULL);
492         guint i = -1;
493         if (info_font_size_str)
494                 for (i = INFO_FONT_ENUM_COUNT - 1; i >= 0; i--)
495                         if (!strcmp(info_font_size_str, INFO_FONT_TEXT[i]))
496                                 break;
497         if (i == -1)
498                 i = INFO_FONT_MEDIUM;
499         _info_font_size = i;
500 }
501
502 /* Get Speed Limit On flag.  Default is FALSE. */
503 _speed_on = gconf_client_get_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, NULL);
504
505 /* Get Speed Limit */
506 _speed_limit = gconf_client_get_int(gconf_client, GCONF_KEY_SPEED_LIMIT, NULL);
507 BOUND(_speed_limit, 1, 200);
508
509 /* Get Auto-Download.  Default is FALSE. */
510 _auto_download=mapper_gconf_get_boolean(GCONF_KEY_AUTO_DOWNLOAD, FALSE);
511
512 /* Get saved location */
513 _gps->data.lat=mapper_gconf_get_float(GCONF_KEY_LAT, 60.20);
514 _gps->data.lon=mapper_gconf_get_float(GCONF_KEY_LON, 22.20);
515
516 /* Special positions Home and Dest */
517 config_load_position(_home, GCONF_KEY_POSITION_HOME);
518 config_load_position(_dest, GCONF_KEY_POSITION_DEST);
519
520 /* Get last center point. */
521 {
522         gfloat center_lat, center_lon;
523
524         /* Get last saved latitude.  Default is last saved latitude. */
525         value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LAT, NULL);
526         if (value) {
527                 center_lat = gconf_value_get_float(value);
528                 gconf_value_free(value);
529         } else {
530                 center_lat = _gps->data.lat;
531         }
532
533         /* Get last saved longitude.  Default is last saved longitude. */
534         value = gconf_client_get(gconf_client, GCONF_KEY_CENTER_LON, NULL);
535         if (value) {
536                 center_lon = gconf_value_get_float(value);
537                 gconf_value_free(value);
538         } else {
539                 center_lon = _gps->data.lon;
540         }
541 }
542
543 config_load_repo();
544
545 /* Get last Zoom Level.  Default is 12. */
546 value = gconf_client_get(gconf_client, GCONF_KEY_ZOOM, NULL);
547 if (value) {
548         _zoom=gconf_value_get_int(value) / _curr_repo->view_zoom_steps * _curr_repo->view_zoom_steps;
549         gconf_value_free(value);
550 } else {
551         _zoom=12 / _curr_repo->view_zoom_steps * _curr_repo->view_zoom_steps;
552 }
553 BOUND(_zoom, 0, 20);
554
555 /* Get Route Directory.  Default is NULL. */
556 _route_dir_uri = gconf_client_get_string(gconf_client, GCONF_KEY_ROUTEDIR, NULL);
557
558 /* Get Last Track File.  Default is NULL. */
559 _track_file_uri = gconf_client_get_string(gconf_client, GCONF_KEY_TRACKFILE, NULL);
560
561 _center_mode=mapper_gconf_get_int(GCONF_KEY_AUTOCENTER_MODE, CENTER_LEAD);
562
563 /* Get Show Scale flag.  Default is TRUE. */
564 _show_scale=mapper_gconf_get_boolean(GCONF_KEY_SHOWSCALE, TRUE);
565
566 /* Get Show Tracks flag.  Default is TRUE. */
567 _show_tracks |= mapper_gconf_get_boolean(GCONF_KEY_SHOWTRACKS, TRUE) ? TRACKS_MASK : 0;
568
569 /* Get Show Routes flag.  Default is TRUE. */
570 _show_tracks |= mapper_gconf_get_boolean(GCONF_KEY_SHOWROUTES, TRUE) ? ROUTES_MASK : 0;
571
572 /* Get Show Velocity Vector flag.  Default is TRUE. */
573 _show_velvec=mapper_gconf_get_boolean(GCONF_KEY_SHOWVELVEC, TRUE);
574
575 _show_poi=mapper_gconf_get_boolean(GCONF_KEY_SHOWPOIS, TRUE);
576
577 /* Get Enable GPS flag. Default is FALSE. */
578 _enable_gps=mapper_gconf_get_boolean(GCONF_KEY_ENABLE_GPS, FALSE);
579
580 /* Initialize _conn_state based on _enable_gps-> */
581 _gps->io.conn = (_enable_gps ? RCVR_DOWN : RCVR_OFF);
582
583 config_load_string_list(GCONF_KEY_ROUTE_LOCATIONS, &_loc_list, &_loc_model);
584
585 /* Show POIs below zoom */
586 _poi_zoom = mapper_gconf_get_int(GCONF_KEY_POI_ZOOM, 6);
587
588 /* Get GPS Info flag. Default is FALSE. */
589 _gps_info=mapper_gconf_get_boolean(GCONF_KEY_GPS_INFO, FALSE);
590
591 /* Get Route Download URL. Default is:
592  * "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s" */
593 _route_dl_url = gconf_client_get_string(gconf_client, GCONF_KEY_ROUTE_DL_URL, NULL);
594 if (_route_dl_url == NULL)
595         _route_dl_url = g_strdup("http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s");
596
597 /* Get Route Download Radius.  Default is 4. */
598 _route_dl_radius = mapper_gconf_get_int(GCONF_KEY_ROUTE_DL_RADIUS, 4);
599 _track_dl_radius = mapper_gconf_get_int(GCONF_KEY_TRACK_DL_RADIUS, 4);
600
601 /* Get Colors. */
602 for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
603         str = gconf_client_get_string(gconf_client, COLORABLE_GCONF[i], NULL);
604         if (!str || !gdk_color_parse(str, &_color[i]))
605                 _color[i] = COLORABLE_DEFAULT[i];
606 }
607
608 /* Get Mapper Database. Default is in REPO_DEFAULT_CACHE_BASE */
609 _mapper_db = gconf_client_get_string(gconf_client, GCONF_KEY_MAPPER_DB, NULL);
610 if (_mapper_db == NULL) {
611         gchar *db_base = gnome_vfs_expand_initial_tilde(REPO_DEFAULT_CACHE_BASE);
612         _mapper_db = gnome_vfs_uri_make_full_from_relative(db_base, "mapper.db");
613         g_free(db_base);
614 }
615
616 /* Get current proxy settings. */
617 config_update_proxy();
618
619 gconf_client_clear_cache(gconf_client);
620 g_free(config_dir);
621 }
622
623 /**
624  *
625  */
626 gint 
627 mapper_gconf_get_int(const gchar *path, gint def)
628 {
629 GConfValue *value;
630 gint v;
631
632 g_assert(gconf_client);
633 value=gconf_client_get(gconf_client, path, NULL);
634 if (value) {
635         v=gconf_value_get_int(value);
636         gconf_value_free(value);
637 } else {
638         v=def;
639 }
640 return v;
641 }
642
643 /**
644  *
645  */
646 gboolean
647 mapper_gconf_get_boolean(const gchar *path, gboolean def)
648 {
649 GConfValue *value;
650 gboolean r;
651
652 g_assert(gconf_client);
653 value = gconf_client_get(gconf_client, path, NULL);
654 if (value) {
655         r=gconf_value_get_bool(value);
656         gconf_value_free(value);
657 } else {
658         r=def;
659 }
660 return r;
661 }
662
663 /**
664  *
665  */
666 gint
667 mapper_gconf_get_bound_int(const gchar *path, gint def, gint min, gint max)
668 {
669 gint r;
670
671 r=mapper_gconf_get_int(path, def);
672 BOUND(r, min, max);
673 return r;
674 }
675
676 gfloat
677 mapper_gconf_get_float(const gchar *path, gfloat def)
678 {
679 GConfValue *value;
680 gfloat v;
681
682 g_assert(gconf_client);
683 value=gconf_client_get(gconf_client, path, NULL);
684 if (value) {
685         v=gconf_value_get_float(value);
686         gconf_value_free(value);
687 } else {
688         v=def;
689 }
690 return v;
691 }