]> err.no Git - mapper/blobdiff - src/config-gconf.c
Move ProgressUpdateInfo struct
[mapper] / src / config-gconf.c
index 239c445966e46d71bbe2e7cb122bcb5325bfaca5..f3d3c740f3844f89107c1169aa98b80aa374796f 100644 (file)
@@ -25,8 +25,6 @@
 
 #include <config.h>
 
-#define _GNU_SOURCE
-
 #include <unistd.h>
 #include <stdlib.h>
 #include <string.h>
 #include "config-gconf.h"
 #include "utils.h"
 #include "mapper-types.h"
-#include "map.h"
-#include "route.h"
+#include "latlon.h"
 #include "db.h"
 #include "poi.h"
 #include "gps.h"
-#include "bt.h"
 #include "ui-common.h"
 #include "settings.h"
-#include "gpx.h"
+#include "filter.h"
+#include "dialogs.h"
+#include "map-tile-repo.h"
+
+#define PROXY_PORT (8080)
+
+gint mapper_gconf_get_int(const gchar *path, gint def);
+gint mapper_gconf_get_bound_int(const gchar *path, gint def, gint min, gint max);
+gfloat mapper_gconf_get_float(const gchar *path, gfloat def);
+gboolean mapper_gconf_get_boolean(const gchar *path, gboolean def);
 
 void 
 config_update_proxy(void)
@@ -62,40 +67,14 @@ config_update_proxy(void)
 if (_http_proxy_host)
        g_free(_http_proxy_host);
 
+_http_proxy_host=NULL;
+_http_proxy_port=0;
+
 /* Get proxy data and register for updates. */
 if (gconf_client_get_bool(gconf_client, GCONF_KEY_HTTP_PROXY_ON, NULL)) {
-       _http_proxy_host = gconf_client_get_string(gconf_client, GCONF_KEY_HTTP_PROXY_HOST, NULL);
-       _http_proxy_port = gconf_client_get_int(gconf_client, GCONF_KEY_HTTP_PROXY_PORT, NULL);
-} else {
-       _http_proxy_host = NULL;
-       _http_proxy_port = 0;
-}
-}
-
-static void 
-config_save_track(gchar *config_dir)
-{
-GnomeVFSHandle *handle;
-gchar *track_file;
-track_file = gnome_vfs_uri_make_full_from_relative(config_dir, CONFIG_FILE_TRACK);
-if (GNOME_VFS_OK == gnome_vfs_create(&handle, track_file, GNOME_VFS_OPEN_WRITE, FALSE, 0600)) {
-       write_gpx(&_track, handle);
-       gnome_vfs_close(handle);
-}
-g_free(track_file);
-}
-
-static void 
-config_save_route(gchar *config_dir)
-{
-GnomeVFSHandle *handle;
-gchar *route_file;
-route_file = gnome_vfs_uri_make_full_from_relative(config_dir, CONFIG_FILE_ROUTE);
-if (GNOME_VFS_OK == gnome_vfs_create(&handle, route_file, GNOME_VFS_OPEN_WRITE, FALSE, 0600)) {
-       write_gpx(&_route, handle);
-       gnome_vfs_close(handle);
+       _http_proxy_host=gconf_client_get_string(gconf_client, GCONF_KEY_HTTP_PROXY_HOST, NULL);
+       _http_proxy_port=mapper_gconf_get_int(GCONF_KEY_HTTP_PROXY_PORT, PROXY_PORT);
 }
-g_free(route_file);
 }
 
 gboolean
@@ -105,6 +84,7 @@ GList *curr = _repo_list;
 GSList *temp_list = NULL;
 gint curr_repo_index = 0;
 
+g_assert(gconf_client);
 /* Save the repositories. */
 for (curr = _repo_list; curr != NULL; curr = curr->next) {
        /* Build from each part of a repo, delimited by newline characters:
@@ -115,7 +95,7 @@ for (curr = _repo_list; curr != NULL; curr = curr->next) {
         */
        RepoData *rd = curr->data;
        gchar buffer[BUFFER_SIZE];
-       snprintf(buffer, sizeof(buffer),
+       g_snprintf(buffer, sizeof(buffer),
                 "%s\t%s\t%s\t%d\t%d\t%d\t%d",
                 rd->name,
                 rd->url,
@@ -138,8 +118,12 @@ return TRUE;
 static void
 config_default_repo(void)
 {
+RepoData *repo;
+
+g_assert(gconf_client);
+
 /* We have no repositories - create a default one. */
-RepoData *repo = g_new(RepoData, 1);
+repo=map_tile_repo_new();
 
 /* Get Map Cache Dir.  Default is REPO_DEFAULT_CACHE_DIR. */
 repo->cache_dir = gconf_client_get_string(gconf_client, GCONF_KEY_MAP_DIR_NAME, NULL);
@@ -161,9 +145,9 @@ repo->name = g_strdup(REPO_DEFAULT_NAME);
 repo->view_zoom_steps = REPO_DEFAULT_VIEW_ZOOM_STEPS;
 repo->double_size = FALSE;
 repo->nextable = TRUE;
-set_repo_type(repo);
+map_tile_repo_set_type(repo);
 
-_repo_list = g_list_append(_repo_list, repo);
+_repo_list=g_list_append(_repo_list, repo);
 repo_set_curr(repo);
 }
 
@@ -171,13 +155,14 @@ gboolean
 config_load_repo(void)
 {
 GSList *list, *curr;
-GConfValue *value;
+guint curr_repo_index;
 
-guint curr_repo_index = gconf_client_get_int(gconf_client, GCONF_KEY_CURRREPO, NULL);
+g_assert(gconf_client);
+curr_repo_index = gconf_client_get_int(gconf_client, GCONF_KEY_CURRREPO, NULL);
 list = gconf_client_get_list(gconf_client, GCONF_KEY_REPOSITORIES, GCONF_VALUE_STRING, NULL);
 
 for (curr = list; curr != NULL; curr = curr->next) {
-       RepoData *rd = config_parse_repo(curr->data);
+       RepoData *rd = map_tile_repo_new_from_string(curr->data);
        _repo_list = g_list_append(_repo_list, rd);
        if (!curr_repo_index--)
                repo_set_curr(rd);
@@ -185,35 +170,48 @@ for (curr = list; curr != NULL; curr = curr->next) {
 }
 g_slist_free(list);
 
-if (_repo_list == NULL)
+if (_repo_list==NULL)
        config_default_repo();
 
 return TRUE;
 }
 
 gboolean
-config_save_home(void)
+config_load_position(Position *pos, const gchar *key)
 {
-if (!gconf_client)
-       return FALSE;
+g_assert(gconf_client);
 
-/* Save home lat/lon. */
-gconf_client_set_float(gconf_client, GCONF_KEY_HOME_LAT, _home.lat, NULL);
-gconf_client_set_float(gconf_client, GCONF_KEY_HOME_LON, _home.lon, NULL);
+pos->valid=gconf_client_get_pair(gconf_client, key, GCONF_VALUE_FLOAT, GCONF_VALUE_FLOAT, &pos->lat, &pos->lon, NULL);
+if (!pos->valid) {
+       pos->lat=NAN;
+       pos->lon=NAN;
+} else if (pos->lat==NAN || pos->lon==NAN)
+       pos->valid=FALSE;
+return pos->valid;
+}
 
-return TRUE;
+gboolean
+config_save_position(Position *pos, const gchar *key)
+{
+g_assert(gconf_client);
+
+return gconf_client_set_pair(gconf_client, key, GCONF_VALUE_FLOAT, GCONF_VALUE_FLOAT, &pos->lat, &pos->lon, NULL);
 }
 
 gboolean
-config_save_filter(void)
+config_save_filter(GpsTrackFilter *f)
 {
-/* Filtering */
-gconf_client_set_bool(gconf_client, GCONF_KEY_GPS_FILTER, _gps_filter, NULL);
-gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_HDOP, _filter_hdop, NULL);
-gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_VDOP, _filter_vdop, NULL);
-gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_ANGLE, _filter_angle, NULL);
-gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, _filter_osm, NULL);
+g_assert(gconf_client);
 
+/* Filtering */
+gconf_client_set_bool(gconf_client, GCONF_KEY_GPS_FILTER, f->enabled, NULL);
+gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_HDOP, f->hdop, NULL);
+gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_VDOP, f->vdop, NULL);
+gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_ANGLE, f->angle, NULL);
+gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, f->osm, NULL);
+gconf_client_set_float(gconf_client, GCONF_KEY_GPS_FILTER_MAXDROP, f->maxdrop, NULL);
+
+gconf_client_suggest_sync(gconf_client, NULL);
 return TRUE;
 }
 
@@ -228,15 +226,20 @@ gchar buffer[16];
 gfloat center_lat, center_lon;
 gint i;
 
+g_assert(gconf_client);
+
 /* Initialize config_dir. */
 config_dir = gnome_vfs_expand_initial_tilde(CONFIG_DIR_NAME);
 g_mkdir_with_parents(config_dir, 0700);
 
 /* Save Receiver MAC from GConf. */
-if (_rcvr_mac)
-       gconf_client_set_string(gconf_client, GCONF_KEY_RCVR_MAC, _rcvr_mac, NULL);
+if (_gps->io.address)
+       gconf_client_set_string(gconf_client, GCONF_KEY_GPS_MAC, _gps->io.address, NULL);
 else
-       gconf_client_unset(gconf_client, GCONF_KEY_RCVR_MAC, NULL);
+       gconf_client_unset(gconf_client, GCONF_KEY_GPS_MAC, NULL);
+
+gconf_client_set_int(gconf_client, GCONF_KEY_GPS_TYPE, _gps->io.type, NULL);
+gconf_client_set_int(gconf_client, GCONF_KEY_GPS_PORT, _gps->io.port, NULL);
 
 /* Save Auto-Download. */
 gconf_client_set_bool(gconf_client, GCONF_KEY_AUTO_DOWNLOAD, _auto_download, NULL);
@@ -253,6 +256,11 @@ gconf_client_set_int(gconf_client, GCONF_KEY_DRAW_WIDTH, _draw_width, NULL);
 /* Save Announce Advance Notice Ratio. */
 gconf_client_set_int(gconf_client, GCONF_KEY_ANNOUNCE_NOTICE, _announce_notice_ratio, NULL);
 
+/* Set announcement flags */
+gconf_client_set_bool(gconf_client, GCONF_KEY_ANNOUNCE_WAYPOINTS, _announce_waypoints, NULL);
+gconf_client_set_bool(gconf_client, GCONF_KEY_ANNOUNCE_OVERSPEED, _announce_overspeed, NULL);
+gconf_client_set_bool(gconf_client, GCONF_KEY_ANNOUNCE_DESTINATION, _announce_destination, NULL);
+
 /* Save Enable Voice flag. */
 gconf_client_set_bool(gconf_client, GCONF_KEY_ENABLE_VOICE, _enable_voice, NULL);
 
@@ -264,38 +272,25 @@ gconf_client_set_string(gconf_client, GCONF_KEY_UNITS, UNITS_TEXT[_units], NULL)
 
 /* Save Custom Key Actions. */
 for (i = 0; i < CUSTOM_KEY_ENUM_COUNT; i++)
-       gconf_client_set_string(gconf_client,
-                               CUSTOM_KEY_GCONF[i],
-                               CUSTOM_ACTION_TEXT[_action[i]],
-                               NULL);
+       gconf_client_set_string(gconf_client, CUSTOM_KEY_GCONF[i], CUSTOM_ACTION_TEXT[_action[i]], NULL);
 
 /* Save Deg Format. */
-gconf_client_set_string(gconf_client,
-                       GCONF_KEY_DEG_FORMAT,
-                       DEG_FORMAT_TEXT[_degformat], NULL);
+gconf_client_set_string(gconf_client, GCONF_KEY_DEG_FORMAT,    DEG_FORMAT_TEXT[_degformat], NULL);
 
 /* Save Speed Limit On flag. */
-gconf_client_set_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, _speed_limit_on, NULL);
+gconf_client_set_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, _speed_on, NULL);
 
 /* Save Speed Limit. */
 gconf_client_set_int(gconf_client, GCONF_KEY_SPEED_LIMIT, _speed_limit, NULL);
 
-/* Save Speed Location. */
-gconf_client_set_string(gconf_client,
-                       GCONF_KEY_SPEED_LOCATION,
-                       SPEED_LOCATION_TEXT[_speed_location], NULL);
-
 /* Save Info Font Size. */
-gconf_client_set_string(gconf_client,
-                       GCONF_KEY_INFO_FONT_SIZE,
-                       INFO_FONT_TEXT[_info_font_size], NULL);
+gconf_client_set_string(gconf_client, GCONF_KEY_INFO_FONT_SIZE, INFO_FONT_TEXT[_info_font_size], NULL);
 
 /* Save last latitude/longiture. */
-gconf_client_set_float(gconf_client, GCONF_KEY_LAT, _gps.lat, NULL);
-gconf_client_set_float(gconf_client, GCONF_KEY_LON, _gps.lon, NULL);
+gconf_client_set_float(gconf_client, GCONF_KEY_LAT, _gps->data.lat, NULL);
+gconf_client_set_float(gconf_client, GCONF_KEY_LON, _gps->data.lon, NULL);
 
 /* Save last center latitude/longitude. */
-unit2latlon(_center.unitx, _center.unity, center_lat, center_lon);
 gconf_client_set_float(gconf_client, GCONF_KEY_CENTER_LAT, center_lat, NULL);
 gconf_client_set_float(gconf_client, GCONF_KEY_CENTER_LON, center_lon, NULL);
 
@@ -342,10 +337,11 @@ gconf_client_set_string(gconf_client, GCONF_KEY_ROUTE_DL_URL, _route_dl_url, NUL
 
 /* Save Route Download Radius. */
 gconf_client_set_int(gconf_client, GCONF_KEY_ROUTE_DL_RADIUS, _route_dl_radius, NULL);
+gconf_client_set_int(gconf_client, GCONF_KEY_TRACK_DL_RADIUS, _track_dl_radius, NULL);
 
 /* Save Colors. */
 for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
-       snprintf(buffer, sizeof(buffer), "#%02x%02x%02x",
+       g_snprintf(buffer, sizeof(buffer), "#%02x%02x%02x",
                 _color[i].red >> 8, _color[i].green >> 8, _color[i].blue >> 8);
        gconf_client_set_string(gconf_client, COLORABLE_GCONF[i], buffer, NULL);
 }
@@ -359,53 +355,43 @@ else
 /* Save Show POI below zoom. */
 gconf_client_set_int(gconf_client, GCONF_KEY_POI_ZOOM, _poi_zoom, NULL);
 
-#if 0
-config_save_track(config_dir);
-config_save_route(config_dir);
-#endif
-
-gconf_client_clear_cache(gconf_client);
+gconf_client_suggest_sync(gconf_client, NULL);
 g_free(config_dir);
 return TRUE;
 }
 
-static void 
-config_load_saved_route(gchar *config_dir)
+/**
+ *
+ */
+gboolean
+config_load_string_list(const gchar *gconf_key, GSList **list, GtkListStore **model)
 {
-gchar *route_file;
-gchar *bytes;
-gint size;
-
-route_file = gnome_vfs_uri_make_full_from_relative(config_dir, CONFIG_FILE_ROUTE);
-if (GNOME_VFS_OK == gnome_vfs_read_entire_file(route_file, &size, &bytes))
-       parse_gpx(&_route, bytes, size, 0);     /* 0 to replace route. */
-g_free(route_file);
-}
+GSList *curr;
 
-static void 
-config_load_saved_track(gchar *config_dir)
-{
-gchar *track_file;
-gchar *bytes;
-gint size;
-
-track_file = gnome_vfs_uri_make_full_from_relative(config_dir, CONFIG_FILE_TRACK);
-if (GNOME_VFS_OK == gnome_vfs_read_entire_file(track_file, &size, &bytes))
-       parse_gpx(&_track, bytes, size, 0);     /* 0 to replace track. */
-g_free(track_file);
+*list=gconf_client_get_list(gconf_client, gconf_key, GCONF_VALUE_STRING, NULL);
+*model=gtk_list_store_new(1, G_TYPE_STRING);
+for (curr = *list; curr != NULL; curr = curr->next) {
+       GtkTreeIter iter;
+       gtk_list_store_insert_with_values(*model, &iter, INT_MAX, 0, curr->data, -1);
+}
+return TRUE;
 }
-
 
 /**
  * Initialize all configuration from GCONF.  This should not be called more
  * than once during execution.
  */
-void config_init(void)
+void
+config_init(void)
 {
 GConfValue *value;
 gchar *config_dir;
 gchar *str;
 gint i;
+GtkMapCenterMode _center_mode = CENTER_LEAD;
+UnitType _units = UNITS_KM;
+guint _degformat = DDPDDDDD;
+InfoFontSize _info_font_size = INFO_FONT_MEDIUM;
 
 gconf_client=gconf_client_get_default();
 if (!gconf_client) {
@@ -413,88 +399,54 @@ if (!gconf_client) {
        exit(1);
 }
 
+/* Preload configuration */
 gconf_client_add_dir (gconf_client, GCONF_KEY_PREFIX, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL);
 
-CenterMode _center_mode = CENTER_LEAD;
-UnitType _units = UNITS_KM;
-guint _degformat = DDPDDDDD;
-SpeedLocation _speed_location = SPEED_LOCATION_TOP_RIGHT;
-InfoFontSize _info_font_size = INFO_FONT_MEDIUM;
-
 /* Initialize config_dir. */
 config_dir = gnome_vfs_expand_initial_tilde(CONFIG_DIR_NAME);
 g_mkdir_with_parents(config_dir, 0700);
 
 /* Get Receiver MAC from GConf.  Default is scanned via hci_inquiry. */
-_rcvr_mac = gconf_client_get_string(gconf_client, GCONF_KEY_RCVR_MAC, NULL);
+_gps->io.address=gconf_client_get_string(gconf_client, GCONF_KEY_GPS_MAC, NULL);
+_gps->io.port=mapper_gconf_get_int(GCONF_KEY_GPS_PORT, 2947);
+_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);
 
 /* Get Auto-Download.  Default is FALSE. */
 _auto_download = gconf_client_get_bool(gconf_client, GCONF_KEY_AUTO_DOWNLOAD, NULL);
 
-/* Get Center Ratio - Default is 3. */
-_center_ratio = gconf_client_get_int(gconf_client, GCONF_KEY_CENTER_SENSITIVITY, NULL);
-if (!_center_ratio)
-       _center_ratio = 7;
+_center_ratio=mapper_gconf_get_int(GCONF_KEY_CENTER_SENSITIVITY, 7);
+_lead_ratio=mapper_gconf_get_int(GCONF_KEY_LEAD_AMOUNT, 5);
+_draw_width=mapper_gconf_get_int(GCONF_KEY_DRAW_WIDTH, 4);
 
 /* Invalidate destination */
-_dest.valid=FALSE;
-
-/* Get Lead Ratio - Default is 5. */
-_lead_ratio = gconf_client_get_int(gconf_client, GCONF_KEY_LEAD_AMOUNT, NULL);
-if (!_lead_ratio)
-       _lead_ratio = 5;
-
-/* Get Draw Line Width- Default is 4. */
-_draw_width = gconf_client_get_int(gconf_client, GCONF_KEY_DRAW_WIDTH, NULL);
-if (!_draw_width)
-       _draw_width = 4;
+_dest->valid=FALSE;
 
 /* Get Announce Advance Notice - Default is 30. */
-value = gconf_client_get(gconf_client, GCONF_KEY_ANNOUNCE_NOTICE, NULL);
-if (value) {
-       _announce_notice_ratio = gconf_value_get_int(value);
-       gconf_value_free(value);
-} else {
-       _announce_notice_ratio = 8;
-}
-
-/* Get Enable Voice flag.  Default is TRUE. */
-value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_VOICE, NULL);
-if (value) {
-       _enable_voice = gconf_value_get_bool(value);
-       gconf_value_free(value);
-} else {
-       _enable_voice = TRUE;
-}
+_announce_notice_ratio=mapper_gconf_get_int(GCONF_KEY_ANNOUNCE_NOTICE, 8);
 
-       /* Get Voice Speed - Default is 120 */
-value = gconf_client_get(gconf_client, GCONF_KEY_VOICE_SPEED, NULL);
-if (value) {
-       _voice_speed = gconf_value_get_int(value);
-       gconf_value_free(value);
-} else {
-       _voice_speed = 120;
-}
-BOUND(_voice_speed, 80, 370);
+_announce_waypoints=mapper_gconf_get_boolean(GCONF_KEY_ANNOUNCE_WAYPOINTS, TRUE);
+_announce_overspeed=mapper_gconf_get_boolean(GCONF_KEY_ANNOUNCE_OVERSPEED, FALSE);
+_announce_destination=mapper_gconf_get_boolean(GCONF_KEY_ANNOUNCE_DESTINATION, FALSE);
 
-/* Get Voice Speed - Default is 50. */
-value = gconf_client_get(gconf_client, GCONF_KEY_VOICE_PITCH, NULL);
-if (value) {
-       _voice_pitch = gconf_value_get_int(value);
-       gconf_value_free(value);
-} else {
-       _voice_pitch = 50;
-}
-BOUND(_voice_pitch, 10, 99);
+/* Get Enable Voice flag.  Default is TRUE. */
+_enable_voice=mapper_gconf_get_boolean(GCONF_KEY_ENABLE_VOICE, TRUE);
+_voice_pitch=mapper_gconf_get_bound_int(GCONF_KEY_VOICE_PITCH, 50, 10, 99);
+_voice_speed=mapper_gconf_get_bound_int(GCONF_KEY_VOICE_SPEED, 120, 80, 370);
 
 /* Get Always Keep On flag.  Default is FALSE. */
-_always_keep_on = gconf_client_get_bool(gconf_client,GCONF_KEY_ALWAYS_KEEP_ON, NULL);
-
-_gps_filter = gconf_client_get_bool(gconf_client, GCONF_KEY_GPS_FILTER, NULL);
-_filter_hdop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_HDOP, NULL);
-_filter_vdop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_VDOP, NULL);
-_filter_angle = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_ANGLE, NULL);
-_filter_osm = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, NULL);
+_always_keep_on=mapper_gconf_get_boolean(GCONF_KEY_ALWAYS_KEEP_ON, FALSE);
+
+filter.enabled = gconf_client_get_bool(gconf_client, GCONF_KEY_GPS_FILTER, NULL);
+filter.hdop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_HDOP, NULL);
+filter.vdop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_VDOP, NULL);
+filter.angle = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_ANGLE, NULL);
+filter.osm = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, NULL);
+filter.maxdrop = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_MAXDROP, NULL);
+filter.drop_cnt=0;
+BOUND(filter.maxdrop, 0, 60);
+BOUND(filter.hdop, 0, 50);
+BOUND(filter.vdop, 0, 50);
+BOUND(filter.angle, 0, 45);
 
 /* Get Units.  Default is UNITS_KM. */
 {
@@ -523,9 +475,7 @@ _filter_osm = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, NUL
 
 /* Get Deg format.  Default is DDPDDDDD. */
 {
-       gchar *degformat_key_str = gconf_client_get_string(gconf_client,
-                                                          GCONF_KEY_DEG_FORMAT,
-                                                          NULL);
+       gchar *degformat_key_str = gconf_client_get_string(gconf_client, GCONF_KEY_DEG_FORMAT, NULL);
        guint i = 0;
        if (degformat_key_str)
                for (i = DEG_FORMAT_ENUM_COUNT - 1; i > 0; i--)
@@ -534,25 +484,6 @@ _filter_osm = gconf_client_get_float(gconf_client, GCONF_KEY_GPS_FILTER_OSM, NUL
        _degformat = i;
 }
 
-/* Get Speed Limit On flag.  Default is FALSE. */
-_speed_limit_on = gconf_client_get_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, NULL);
-
-/* Get Speed Limit */
-_speed_limit = gconf_client_get_int(gconf_client, GCONF_KEY_SPEED_LIMIT, NULL);
-BOUND(_speed_limit, 1, 200);
-
-/* Get Speed Location.  Default is SPEED_LOCATION_TOP_LEFT. */
-{
-       gchar *speed_location_str = gconf_client_get_string(gconf_client,
-                                   GCONF_KEY_SPEED_LOCATION, NULL);
-       guint i = 0;
-       if (speed_location_str)
-               for (i = SPEED_LOCATION_ENUM_COUNT - 1; i > 0; i--)
-                       if (!strcmp(speed_location_str, SPEED_LOCATION_TEXT[i]))
-                               break;
-       _speed_location = i;
-}
-
 /* Get Info Font Size.  Default is INFO_FONT_MEDIUM. */
 {
        gchar *info_font_size_str = gconf_client_get_string(gconf_client, GCONF_KEY_INFO_FONT_SIZE, NULL);
@@ -566,39 +497,23 @@ BOUND(_speed_limit, 1, 200);
        _info_font_size = i;
 }
 
+/* Get Speed Limit On flag.  Default is FALSE. */
+_speed_on = gconf_client_get_bool(gconf_client, GCONF_KEY_SPEED_LIMIT_ON, NULL);
+
+/* Get Speed Limit */
+_speed_limit = gconf_client_get_int(gconf_client, GCONF_KEY_SPEED_LIMIT, NULL);
+BOUND(_speed_limit, 1, 200);
+
 /* Get Auto-Download.  Default is FALSE. */
-_auto_download = gconf_client_get_bool(gconf_client, GCONF_KEY_AUTO_DOWNLOAD, NULL);
+_auto_download=mapper_gconf_get_boolean(GCONF_KEY_AUTO_DOWNLOAD, FALSE);
 
 /* Get saved location */
-_gps.lat = gconf_client_get_float(gconf_client, GCONF_KEY_LAT, NULL);
-_gps.lon = gconf_client_get_float(gconf_client, GCONF_KEY_LON, NULL);
-if (_gps.lat==0.0) _gps.lat=64.0;
-if (_gps.lon==0.0) _gps.lon=22.0;
-
-/* Home */
-_home.valid=TRUE;
-value = gconf_client_get(gconf_client, GCONF_KEY_HOME_LAT, NULL);
-if (value) {
-       _home.lat = gconf_value_get_float(value);
-       gconf_value_free(value);
-} else {
-       _home.valid=FALSE;
-}
-
-value = gconf_client_get(gconf_client, GCONF_KEY_HOME_LON, NULL);
-if (value) {
-       _home.lon = gconf_value_get_float(value);
-       gconf_value_free(value);
-} else {
-       _home.valid=FALSE;
-}
+_gps->data.lat=mapper_gconf_get_float(GCONF_KEY_LAT, 60.20);
+_gps->data.lon=mapper_gconf_get_float(GCONF_KEY_LON, 22.20);
 
-/* Turku is default */
-if (_home.valid==FALSE) {
-       _home.lat=64.0;
-       _home.lon=22.0;
-       _home.valid=TRUE;
-}
+/* Special positions Home and Dest */
+config_load_position(_home, GCONF_KEY_POSITION_HOME);
+config_load_position(_dest, GCONF_KEY_POSITION_DEST);
 
 /* Get last center point. */
 {
@@ -610,7 +525,7 @@ if (_home.valid==FALSE) {
                center_lat = gconf_value_get_float(value);
                gconf_value_free(value);
        } else {
-               center_lat = _gps.lat;
+               center_lat = _gps->data.lat;
        }
 
        /* Get last saved longitude.  Default is last saved longitude. */
@@ -619,10 +534,8 @@ if (_home.valid==FALSE) {
                center_lon = gconf_value_get_float(value);
                gconf_value_free(value);
        } else {
-               center_lon = _gps.lon;
+               center_lon = _gps->data.lon;
        }
-
-       latlon2unit(center_lat, center_lon, _center.unitx, _center.unity);
 }
 
 config_load_repo();
@@ -630,13 +543,12 @@ config_load_repo();
 /* Get last Zoom Level.  Default is 12. */
 value = gconf_client_get(gconf_client, GCONF_KEY_ZOOM, NULL);
 if (value) {
-       _zoom = gconf_value_get_int(value) / _curr_repo->view_zoom_steps * _curr_repo->view_zoom_steps;
+       _zoom=gconf_value_get_int(value) / _curr_repo->view_zoom_steps * _curr_repo->view_zoom_steps;
        gconf_value_free(value);
 } else {
-       _zoom = 12 / _curr_repo->view_zoom_steps * _curr_repo->view_zoom_steps;
+       _zoom=12 / _curr_repo->view_zoom_steps * _curr_repo->view_zoom_steps;
 }
-BOUND(_zoom, 0, MAX_ZOOM - 1);
-_world_size_tiles = unit2tile(WORLD_SIZE_UNITS);
+BOUND(_zoom, 0, 20);
 
 /* Get Route Directory.  Default is NULL. */
 _route_dir_uri = gconf_client_get_string(gconf_client, GCONF_KEY_ROUTEDIR, NULL);
@@ -644,81 +556,51 @@ _route_dir_uri = gconf_client_get_string(gconf_client, GCONF_KEY_ROUTEDIR, NULL)
 /* Get Last Track File.  Default is NULL. */
 _track_file_uri = gconf_client_get_string(gconf_client, GCONF_KEY_TRACKFILE, NULL);
 
-/* Get Auto-Center Mode.  Default is CENTER_LEAD. */
-value = gconf_client_get(gconf_client, GCONF_KEY_AUTOCENTER_MODE, NULL);
-if (value) {
-       _center_mode = gconf_value_get_int(value);
-       gconf_value_free(value);
-} else {
-       _center_mode = CENTER_LEAD;
-}
+_center_mode=mapper_gconf_get_int(GCONF_KEY_AUTOCENTER_MODE, CENTER_LEAD);
 
 /* Get Show Scale flag.  Default is TRUE. */
-value = gconf_client_get(gconf_client, GCONF_KEY_SHOWSCALE, NULL);
-if (value) {
-       _show_scale = gconf_value_get_bool(value);
-       gconf_value_free(value);
-} else {
-       _show_scale = TRUE;
-}
+_show_scale=mapper_gconf_get_boolean(GCONF_KEY_SHOWSCALE, TRUE);
 
 /* Get Show Tracks flag.  Default is TRUE. */
-value = gconf_client_get(gconf_client, GCONF_KEY_SHOWTRACKS, NULL);
-if (value) {
-       _show_tracks |= (gconf_value_get_bool(value) ? TRACKS_MASK : 0);
-       gconf_value_free(value);
-} else {
-       _show_tracks |= TRACKS_MASK;
-}
+_show_tracks |= mapper_gconf_get_boolean(GCONF_KEY_SHOWTRACKS, TRUE) ? TRACKS_MASK : 0;
 
 /* Get Show Routes flag.  Default is TRUE. */
-value = gconf_client_get(gconf_client, GCONF_KEY_SHOWROUTES, NULL);
-if (value) {
-       _show_tracks |= (gconf_value_get_bool(value) ? ROUTES_MASK : 0);
-       gconf_value_free(value);
-} else {
-       _show_tracks |= ROUTES_MASK;
-}
+_show_tracks |= mapper_gconf_get_boolean(GCONF_KEY_SHOWROUTES, TRUE) ? ROUTES_MASK : 0;
 
 /* Get Show Velocity Vector flag.  Default is TRUE. */
-value = gconf_client_get(gconf_client, GCONF_KEY_SHOWVELVEC, NULL);
-if (value) {
-       _show_velvec = gconf_value_get_bool(value);
-       gconf_value_free(value);
-} else {
-       _show_velvec = TRUE;
-}
+_show_velvec=mapper_gconf_get_boolean(GCONF_KEY_SHOWVELVEC, TRUE);
 
-/* Get Show Velocity Vector flag.  Default is TRUE. */
-value = gconf_client_get(gconf_client, GCONF_KEY_SHOWPOIS, NULL);
-if (value) {
-       _show_poi = gconf_value_get_bool(value);
-       gconf_value_free(value);
-} else {
-       _show_poi = TRUE;
-}
+_show_poi=mapper_gconf_get_boolean(GCONF_KEY_SHOWPOIS, TRUE);
 
 /* Get Enable GPS flag. Default is FALSE. */
-value = gconf_client_get(gconf_client, GCONF_KEY_ENABLE_GPS, NULL);
-if (value) {
-       _enable_gps = gconf_value_get_bool(value);
-       gconf_value_free(value);
-} else {
-       _enable_gps = FALSE;
-}
+_enable_gps=mapper_gconf_get_boolean(GCONF_KEY_ENABLE_GPS, FALSE);
 
-/* Initialize _conn_state based on _enable_gps. */
-_conn_state = (_enable_gps ? RCVR_DOWN : RCVR_OFF);
+/* Initialize _conn_state based on _enable_gps-> */
+_gps->io.conn = (_enable_gps ? RCVR_DOWN : RCVR_OFF);
 
-/* Load the route locations. */
-{
-       GSList *curr;
-       _loc_list = gconf_client_get_list(gconf_client, GCONF_KEY_ROUTE_LOCATIONS, GCONF_VALUE_STRING, NULL);
-       _loc_model = gtk_list_store_new(1, G_TYPE_STRING);
-       for (curr = _loc_list; curr != NULL; curr = curr->next) {
-               GtkTreeIter iter;
-               gtk_list_store_insert_with_values(_loc_model, &iter, INT_MAX, 0, curr->data, -1);
-       }
+config_load_string_list(GCONF_KEY_ROUTE_LOCATIONS, &_loc_list, &_loc_model);
+
+/* Show POIs below zoom */
+_poi_zoom = mapper_gconf_get_int(GCONF_KEY_POI_ZOOM, 6);
+
+/* Get GPS Info flag. Default is FALSE. */
+_gps_info=mapper_gconf_get_boolean(GCONF_KEY_GPS_INFO, FALSE);
+
+/* Get Route Download URL. Default is:
+ * "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s" */
+_route_dl_url = gconf_client_get_string(gconf_client, GCONF_KEY_ROUTE_DL_URL, NULL);
+if (_route_dl_url == NULL)
+       _route_dl_url = g_strdup("http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s");
+
+/* Get Route Download Radius.  Default is 4. */
+_route_dl_radius = mapper_gconf_get_int(GCONF_KEY_ROUTE_DL_RADIUS, 4);
+_track_dl_radius = mapper_gconf_get_int(GCONF_KEY_TRACK_DL_RADIUS, 4);
+
+/* Get Colors. */
+for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
+       str = gconf_client_get_string(gconf_client, COLORABLE_GCONF[i], NULL);
+       if (!str || !gdk_color_parse(str, &_color[i]))
+               _color[i] = COLORABLE_DEFAULT[i];
 }
 
 /* Get Mapper Database. Default is in REPO_DEFAULT_CACHE_BASE */
@@ -729,44 +611,79 @@ if (_mapper_db == NULL) {
        g_free(db_base);
 }
 
-_poi_zoom = gconf_client_get_int(gconf_client, GCONF_KEY_POI_ZOOM, NULL);
-if (!_poi_zoom)
-       _poi_zoom = 6;
+/* Get current proxy settings. */
+config_update_proxy();
 
-/* Get GPS Info flag. Default is FALSE. */
-value = gconf_client_get(gconf_client, GCONF_KEY_GPS_INFO, NULL);
+gconf_client_clear_cache(gconf_client);
+g_free(config_dir);
+}
+
+/**
+ *
+ */
+gint 
+mapper_gconf_get_int(const gchar *path, gint def)
+{
+GConfValue *value;
+gint v;
+
+g_assert(gconf_client);
+value=gconf_client_get(gconf_client, path, NULL);
 if (value) {
-       _gps_info = gconf_value_get_bool(value);
+       v=gconf_value_get_int(value);
        gconf_value_free(value);
 } else {
-       _gps_info = FALSE;
+       v=def;
+}
+return v;
 }
 
-/* Get Route Download URL. Default is:
- * "http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s" */
-_route_dl_url = gconf_client_get_string(gconf_client, GCONF_KEY_ROUTE_DL_URL, NULL);
-if (_route_dl_url == NULL)
-       _route_dl_url = g_strdup("http://www.gnuite.com/cgi-bin/gpx.cgi?saddr=%s&daddr=%s");
+/**
+ *
+ */
+gboolean
+mapper_gconf_get_boolean(const gchar *path, gboolean def)
+{
+GConfValue *value;
+gboolean r;
 
-/* Get Route Download Radius.  Default is 4. */
-value = gconf_client_get(gconf_client, GCONF_KEY_ROUTE_DL_RADIUS, NULL);
+g_assert(gconf_client);
+value = gconf_client_get(gconf_client, path, NULL);
 if (value) {
-       _route_dl_radius = gconf_value_get_int(value);
+       r=gconf_value_get_bool(value);
        gconf_value_free(value);
 } else {
-       _route_dl_radius = 4;
+       r=def;
+}
+return r;
 }
 
-/* Get Colors. */
-for (i = 0; i < COLORABLE_ENUM_COUNT; i++) {
-       str = gconf_client_get_string(gconf_client, COLORABLE_GCONF[i], NULL);
-       if (!str || !gdk_color_parse(str, &_color[i]))
-               _color[i] = COLORABLE_DEFAULT[i];
+/**
+ *
+ */
+gint
+mapper_gconf_get_bound_int(const gchar *path, gint def, gint min, gint max)
+{
+gint r;
+
+r=mapper_gconf_get_int(path, def);
+BOUND(r, min, max);
+return r;
 }
 
-/* Get current proxy settings. */
-config_update_proxy();
+gfloat
+mapper_gconf_get_float(const gchar *path, gfloat def)
+{
+GConfValue *value;
+gfloat v;
 
-gconf_client_clear_cache(gconf_client);
-g_free(config_dir);
+g_assert(gconf_client);
+value=gconf_client_get(gconf_client, path, NULL);
+if (value) {
+       v=gconf_value_get_float(value);
+       gconf_value_free(value);
+} else {
+       v=def;
+}
+return v;
 }