Diff of /trunk/src/gconf.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 12 by harbaum, Fri Jun 26 20:07:33 2009 UTC revision 214 by harbaum, Thu Nov 26 10:05:23 2009 UTC
# Line 20  Line 20 
20  #include <stddef.h>  #include <stddef.h>
21  #include <stdlib.h>  #include <stdlib.h>
22  #include <ctype.h>  #include <ctype.h>
23    #include <math.h>     // for isnan
24  #include "gpxview.h"  #include "gpxview.h"
25    
26  #define GCONF_PATH         "/apps/gpxview/"  #define GCONF_PATH         "/apps/gpxview/"
# Line 66  static store_t store[] = { Line 67  static store_t store[] = {
67    { "compass_locked",   STORE_BOOL,   OFFSET(compass_locked) },    { "compass_locked",   STORE_BOOL,   OFFSET(compass_locked) },
68    { "latitude",         STORE_FLOAT,  OFFSET(home.lat) },    { "latitude",         STORE_FLOAT,  OFFSET(home.lat) },
69    { "longitude",        STORE_FLOAT,  OFFSET(home.lon) },    { "longitude",        STORE_FLOAT,  OFFSET(home.lon) },
   { "manual_goto_lat",  STORE_FLOAT,  OFFSET(manual_goto.lat) },  
   { "manual_goto_lon",  STORE_FLOAT,  OFFSET(manual_goto.lon) },  
70    { "gps_lat",          STORE_FLOAT,  OFFSET(gps.lat) },    { "gps_lat",          STORE_FLOAT,  OFFSET(gps.lat) },
71    { "gps_lon",          STORE_FLOAT,  OFFSET(gps.lon) },    { "gps_lon",          STORE_FLOAT,  OFFSET(gps.lon) },
72    { "search_in",        STORE_INT,    OFFSET(search) },    { "search_in",        STORE_INT,    OFFSET(search) },
# Line 77  static store_t store[] = { Line 76  static store_t store[] = {
76    { "cachelist_items",  STORE_INT,    OFFSET(cachelist_items) },    { "cachelist_items",  STORE_INT,    OFFSET(cachelist_items) },
77    { "compass_damping",  STORE_INT,    OFFSET(compass_damping) },    { "compass_damping",  STORE_INT,    OFFSET(compass_damping) },
78    { "cachelist_hide_found", STORE_BOOL, OFFSET(cachelist_hide_found) },    { "cachelist_hide_found", STORE_BOOL, OFFSET(cachelist_hide_found) },
79      { "cachelist_update", STORE_BOOL,   OFFSET(cachelist_update) },
80      { "disable_gcvote",   STORE_BOOL,   OFFSET(disable_gcvote) },
81      { "username",         STORE_STRING, OFFSET(username) },
82  #ifdef USE_MAEMO  #ifdef USE_MAEMO
83    { "mmpoi_dontlaunch", STORE_BOOL,   OFFSET(mmpoi_dontlaunch) },    { "mmpoi_dontlaunch", STORE_BOOL,   OFFSET(mmpoi_dontlaunch) },
84    { "cachelist_dss",    STORE_BOOL,   OFFSET(cachelist_disable_screensaver) },    { "cachelist_dss",    STORE_BOOL,   OFFSET(cachelist_disable_screensaver) },
85    { "goto_dss",         STORE_BOOL,   OFFSET(goto_disable_screensaver) },    { "goto_dss",         STORE_BOOL,   OFFSET(goto_disable_screensaver) },
86    { "cachelist_update", STORE_BOOL,   OFFSET(cachelist_update) },  #endif
87    #ifdef ENABLE_OSM_GPS_MAP
88      { "map_lat",          STORE_FLOAT,  OFFSET(map.pos.lat) },
89      { "map_lon",          STORE_FLOAT,  OFFSET(map.pos.lon) },
90      { "map_zoom",         STORE_INT,    OFFSET(map.zoom) },
91      { "map_source",       STORE_INT,    OFFSET(map.source) },
92  #endif  #endif
93    
94      { "geotoad/password", STORE_STRING, OFFSET(gt.password) },
95      { "geotoad/filename", STORE_STRING, OFFSET(gt.filename) },
96      { "geotoad/distance", STORE_FLOAT,  OFFSET(gt.distance) },
97      { "geotoad/lat",      STORE_FLOAT,  OFFSET(gt.lat) },
98      { "geotoad/lon",      STORE_FLOAT,  OFFSET(gt.lon) },
99      { "geotoad/flags",    STORE_INT,    OFFSET(gt.flags) },
100    
101    { NULL, -1, -1 }    { NULL, -1, -1 }
102  };  };
103    
# Line 105  static char *get_basename(char *name) { Line 119  static char *get_basename(char *name) {
119  }  }
120    
121  void gconf_remove_closed_name(appdata_t *appdata, char *filename) {  void gconf_remove_closed_name(appdata_t *appdata, char *filename) {
122      if(!filename || !strlen(filename)) return;
123    
124    char *key = g_strdup_printf(GCONF_KEY_CLOSED, get_basename(filename));    char *key = g_strdup_printf(GCONF_KEY_CLOSED, get_basename(filename));
125    gconf_client_unset(appdata->gconf_client, key, NULL);    gconf_client_unset(appdata->gconf_client, key, NULL);
126    g_free(key);    g_free(key);
127  }  }
128    
129  void gconf_save_closed_name(appdata_t *appdata, char *filename, char *name) {  void gconf_save_closed_name(appdata_t *appdata, char *filename, char *name) {
130      if(!filename || !strlen(filename)) return;
131    
132    char *key = g_strdup_printf(GCONF_KEY_CLOSED, get_basename(filename));    char *key = g_strdup_printf(GCONF_KEY_CLOSED, get_basename(filename));
133    gconf_client_set_string(appdata->gconf_client, key, name, NULL);    gconf_client_set_string(appdata->gconf_client, key, name, NULL);
134    g_free(key);    g_free(key);
135  }  }
136    
137  char *gconf_restore_closed_name(appdata_t *appdata, char *filename) {  char *gconf_restore_closed_name(appdata_t *appdata, char *filename) {
138      if(!filename || !strlen(filename)) return NULL;
139    
140    char *key = g_strdup_printf(GCONF_KEY_CLOSED, get_basename(filename));    char *key = g_strdup_printf(GCONF_KEY_CLOSED, get_basename(filename));
141    char *ret = gconf_client_get_string(appdata->gconf_client, key, NULL);    char *ret = gconf_client_get_string(appdata->gconf_client, key, NULL);
142    g_free(key);    g_free(key);
# Line 126  char *gconf_restore_closed_name(appdata_ Line 146  char *gconf_restore_closed_name(appdata_
146  void gconf_save_state(appdata_t *appdata) {  void gconf_save_state(appdata_t *appdata) {
147    int entries = 0;    int entries = 0;
148    
149      /* free proxy settings */
150      if(appdata->proxy) {
151        proxy_t *proxy = appdata->proxy;
152    
153        if(proxy->authentication_password) g_free(proxy->authentication_password);
154        if(proxy->authentication_user)     g_free(proxy->authentication_user);
155        if(proxy->host)                    g_free(proxy->host);
156        if(proxy->ignore_hosts)            g_free(proxy->ignore_hosts);
157    
158        g_free(proxy);
159        appdata->proxy = NULL;
160      }
161    
162    gpx_t *gpx = appdata->gpx;    gpx_t *gpx = appdata->gpx;
163    while(gpx) {    while(gpx) {
164      char str[128];      char str[128];
# Line 156  void gconf_save_state(appdata_t *appdata Line 189  void gconf_save_state(appdata_t *appdata
189    /* store everything listed in the store table */    /* store everything listed in the store table */
190    store_t *st = store;    store_t *st = store;
191    while(st->key) {    while(st->key) {
     char key[256];  
192      void **ptr = ((void*)appdata) + st->offset;      void **ptr = ((void*)appdata) + st->offset;
193      snprintf(key, sizeof(key), GCONF_PATH "%s", st->key);      char *key = g_strdup_printf(GCONF_PATH "%s", st->key);
194    
195      switch(st->type) {      switch(st->type) {
196      case STORE_STRING:      case STORE_STRING:
197        if((char*)(*ptr)) {        if((char*)(*ptr)) {
198          gconf_client_set_string(appdata->gconf_client, key, (char*)(*ptr), NULL);          gconf_client_set_string(appdata->gconf_client, key, (char*)(*ptr), NULL);
199        }        }
200          g_free((char*)(*ptr));
201          *ptr = NULL;
202        break;        break;
203    
204      case STORE_BOOL:      case STORE_BOOL:
# Line 176  void gconf_save_state(appdata_t *appdata Line 210  void gconf_save_state(appdata_t *appdata
210        break;        break;
211    
212      case STORE_FLOAT:      case STORE_FLOAT:
213        gconf_client_set_float(appdata->gconf_client, key, *((float*)ptr), NULL);        if(!isnan(*((float*)ptr)))
214            gconf_client_set_float(appdata->gconf_client, key, *((float*)ptr), NULL);
215        break;        break;
216    
217      default:      default:
# Line 184  void gconf_save_state(appdata_t *appdata Line 219  void gconf_save_state(appdata_t *appdata
219        break;        break;
220      }      }
221    
222        g_free(key);
223      st++;      st++;
224    }    }
225  }  }
# Line 195  void gconf_load_state(appdata_t *appdata Line 231  void gconf_load_state(appdata_t *appdata
231    
232    gpx_dialog_t *dialog = NULL;    gpx_dialog_t *dialog = NULL;
233    
234      /* default positions are invalid */
235      appdata->home.lat = appdata->home.lon = NAN;
236      appdata->gps.lat = appdata->gps.lon = NAN;
237    
238      appdata->gt.lat = appdata->gt.lon = NAN;
239      appdata->gt.distance = 1.0;  // in km/mil
240    
241      /* ------------- get proxy settings -------------------- */
242      if(gconf_client_get_bool(appdata->gconf_client,
243                               PROXY_KEY "use_http_proxy", NULL)) {
244        proxy_t *proxy = appdata->proxy = g_new0(proxy_t, 1);
245    
246        /* get basic settings */
247        proxy->host = gconf_client_get_string(appdata->gconf_client,
248                                              PROXY_KEY "host", NULL);
249        proxy->port = gconf_client_get_int(appdata->gconf_client,
250                                           PROXY_KEY "port", NULL);
251        proxy->ignore_hosts =
252          gconf_client_get_string(appdata->gconf_client,
253                                  PROXY_KEY "ignore_hosts", NULL);
254    
255        /* check for authentication */
256        proxy->use_authentication =
257          gconf_client_get_bool(appdata->gconf_client,
258                                PROXY_KEY "use_authentication", NULL);
259    
260        if(proxy->use_authentication) {
261          proxy->authentication_user =
262            gconf_client_get_string(appdata->gconf_client,
263                                    PROXY_KEY "authentication_user", NULL);
264          proxy->authentication_password =
265            gconf_client_get_string(appdata->gconf_client,
266                                    PROXY_KEY "authentication_password", NULL);
267        }
268      }
269    
270      /* restore everything listed in the store table */
271      store_t *st = store;
272      while(st->key) {
273        void **ptr = ((void*)appdata) + st->offset;
274        char *key = g_strdup_printf(GCONF_PATH "%s", st->key);
275    
276        /* check if key is present */
277        GConfValue *value = gconf_client_get(appdata->gconf_client, key, NULL);
278        if(value) {
279          gconf_value_free(value);
280    
281          switch(st->type) {
282          case STORE_STRING: {
283            char **str = (char**)ptr;
284            *str = gconf_client_get_string(appdata->gconf_client, key, NULL);
285          } break;
286    
287          case STORE_BOOL:
288            *((int*)ptr) = gconf_client_get_bool(appdata->gconf_client, key, NULL);
289            break;
290    
291          case STORE_INT:
292            *((int*)ptr) = gconf_client_get_int(appdata->gconf_client, key, NULL);
293            break;
294    
295          case STORE_FLOAT:
296            *((float*)ptr) = gconf_client_get_float(appdata->gconf_client, key, NULL);
297            break;
298    
299          default:
300            printf("Unsupported type %d\n", st->type);
301            break;
302          }
303        }
304        g_free(key);
305        st++;
306      }
307    
308    int i, entries = gconf_client_get_int(appdata->gconf_client,    int i, entries = gconf_client_get_int(appdata->gconf_client,
309                                   GCONF_KEY_CNT, NULL);                                   GCONF_KEY_CNT, NULL);
310    
# Line 205  void gconf_load_state(appdata_t *appdata Line 315  void gconf_load_state(appdata_t *appdata
315      char str[128];      char str[128];
316      snprintf(str, sizeof(str), GCONF_KEY_GPX, i);      snprintf(str, sizeof(str), GCONF_KEY_GPX, i);
317      char *fname = gconf_client_get_string(appdata->gconf_client, str, NULL);      char *fname = gconf_client_get_string(appdata->gconf_client, str, NULL);
   
318      if(fname) {      if(fname) {
319        /* check if there's a valid name stored for this file. */        /* check if there's a valid name stored for this file. */
320        /* if yes it's a "closed" file */        /* if yes it's a "closed" file */
# Line 217  void gconf_load_state(appdata_t *appdata Line 326  void gconf_load_state(appdata_t *appdata
326          (*gpx)->closed = TRUE;          (*gpx)->closed = TRUE;
327        } else {        } else {
328          if(g_file_test(fname, G_FILE_TEST_IS_DIR))          if(g_file_test(fname, G_FILE_TEST_IS_DIR))
329            *gpx = gpx_parse_dir(dialog, fname);            *gpx = gpx_parse_dir(dialog, fname, appdata->username);
330          else          else
331            *gpx = gpx_parse(dialog, fname);            *gpx = gpx_parse(dialog, fname, appdata->username);
332    
333          free(fname);          if(!*gpx) {
334              /* restoring the gpx file failed, mark it as unusable, but save */
335              /* its presence for later use */
336    
337              /* create "closed" entry to remember this file for next */
338              /* load attempt */
339              *gpx = g_new0(gpx_t, 1);
340              (*gpx)->filename = fname;
341              char *p = fname;
342              if(strrchr(fname, '/'))
343                p = strrchr(fname, '/')+1;
344    
345              (*gpx)->name = g_strdup_printf(_("Failed to load: %s"), p);
346              (*gpx)->closed = TRUE;
347            } else
348              free(fname);
349        }        }
     }  
   
     /* use next gpx entry of this was loaded successfully */  
     if(*gpx)  
350        gpx = &((*gpx)->next);        gpx = &((*gpx)->next);
351        }
352    }    }
353    
354    gpx_busy_dialog_destroy(dialog);    gpx_busy_dialog_destroy(dialog);
# Line 252  void gconf_load_state(appdata_t *appdata Line 373  void gconf_load_state(appdata_t *appdata
373      }      }
374    }    }
375    
   /* restore everything listed in the store table */  
   store_t *st = store;  
   while(st->key) {  
     char key[256];  
     void **ptr = ((void*)appdata) + st->offset;  
     snprintf(key, sizeof(key), GCONF_PATH "%s", st->key);  
   
     switch(st->type) {  
     case STORE_STRING: {  
       char **str = (char**)ptr;  
       *str = gconf_client_get_string(appdata->gconf_client, key, NULL);  
       } break;  
   
     case STORE_BOOL:  
       *((int*)ptr) = gconf_client_get_bool(appdata->gconf_client, key, NULL);  
       break;  
   
     case STORE_INT:  
       *((int*)ptr) = gconf_client_get_int(appdata->gconf_client, key, NULL);  
       break;  
   
     case STORE_FLOAT:  
       *((float*)ptr) = gconf_client_get_float(appdata->gconf_client, key, NULL);  
       break;  
   
     default:  
       printf("Unsupported type %d\n", st->type);  
       break;  
     }  
   
     st++;  
   }  
   
376    /* ----- set all kinds of defaults ------- */    /* ----- set all kinds of defaults ------- */
377    
 #if 0  
   if(!appdata->home.lon || !appdata->home.lat) {  
     appdata->home.lat = DEFAULT_LAT;  
     appdata->home.lon = DEFAULT_LON;  
   }  
   
   if(!appdata->manual_goto.lon || !appdata->manual_goto.lat) {  
     appdata->manual_goto.lat = DEFAULT_LAT;  
     appdata->manual_goto.lon = DEFAULT_LON;  
   }  
   
   if(!appdata->gps.lon || !appdata->gps.lat) {  
     appdata->gps.lat = DEFAULT_LAT;  
     appdata->gps.lon = DEFAULT_LON;  
   }  
 #endif  
   
378    if(!appdata->compass_damping) appdata->compass_damping = 1;    if(!appdata->compass_damping) appdata->compass_damping = 1;
379    
380    if(!appdata->mmpoi_radius)    if(!appdata->mmpoi_radius)
# Line 313  void gconf_load_state(appdata_t *appdata Line 384  void gconf_load_state(appdata_t *appdata
384      appdata->search = SEARCH_NAME | SEARCH_ID;      appdata->search = SEARCH_NAME | SEARCH_ID;
385    
386    if(!appdata->image_path) {    if(!appdata->image_path) {
387    #ifdef USE_MAEMO
388        /* update cachelist by default */
389        appdata->cachelist_update = TRUE;
390    #endif
391    
392        /* use gps by default */
393        appdata->use_gps = TRUE;
394    
395  #ifndef USE_MAEMO  #ifndef USE_MAEMO
396      char *p = getenv("HOME");      char *p = getenv("HOME");
# Line 328  void gconf_load_state(appdata_t *appdata Line 406  void gconf_load_state(appdata_t *appdata
406  #endif  #endif
407      appdata->image_path = strdup(DEFAULT_IMAGE_PATH);      appdata->image_path = strdup(DEFAULT_IMAGE_PATH);
408    
409        /* check if this path is actually accessible */
410        /* and change it to the current users home if not */
411        /* (this should only happen on scratchbox) */
412        if(!g_file_test(appdata->image_path, G_FILE_TEST_IS_DIR)) {
413          if(g_mkdir_with_parents(appdata->image_path, 0700) != 0) {
414            char *p = getenv("HOME");
415            if(!p) p = "/tmp/";
416    
417            appdata->image_path =
418              g_strdup_printf("%s%s%s", p,
419                              (p[strlen(p)-1]!='/')?"/":"",
420                              DEFAULT_IMAGE_PATH_HOME);
421            printf("using alt path %s\n", appdata->image_path);
422          }
423        }
424    
425    } else {    } else {
426      /* some versions old versions messed up the path */      /* some versions old versions messed up the path */
427      if(appdata->image_path[strlen(appdata->image_path)-1] != '/') {      if(appdata->image_path[strlen(appdata->image_path)-1] != '/') {
# Line 389  void gconf_load_state(appdata_t *appdata Line 483  void gconf_load_state(appdata_t *appdata
483    if(!appdata->cachelist_items)    if(!appdata->cachelist_items)
484      appdata->cachelist_items = CACHELIST_ITEM_DEFAULT;      appdata->cachelist_items = CACHELIST_ITEM_DEFAULT;
485    
486      /* if there are no entries in the main list, try to add the */
487      /* "welcome" one */
488      if(!appdata->gpx) {
489        char *name = g_strdup(ICONPATH "welcome.gpx");
490        dialog = gpx_busy_dialog_new(GTK_WIDGET(appdata->window));
491        printf("No GPX file loaded, trying to load demo\n");
492        appdata->gpx = gpx_parse(dialog, name, appdata->username);
493        gpx_busy_dialog_destroy(dialog);
494        g_free(name);
495      }
496  }  }
497    

Legend:
Removed from v.12  
changed lines
  Added in v.214