Diff of /trunk/src/gpx.c

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

revision 13 by harbaum, Sat Jun 27 11:09:19 2009 UTC revision 134 by harbaum, Tue Oct 13 14:36:07 2009 UTC
# Line 42  void gpx_free_wpt(wpt_t *wpt) { Line 42  void gpx_free_wpt(wpt_t *wpt) {
42    free(wpt);    free(wpt);
43  }  }
44    
45    void gpx_free_user(user_t *user) {
46      if(user->name) xmlFree(user->name);
47      free(user);
48    }
49    
50  void gpx_free_log(log_t *log) {  void gpx_free_log(log_t *log) {
51    if(log->finder)  xmlFree(log->finder);    if(log->finder)  xmlFree(log->finder);
52    if(log->text)    xmlFree(log->text);    if(log->text)    xmlFree(log->text);
# Line 61  void gpx_free_cache(cache_t *cache) { Line 66  void gpx_free_cache(cache_t *cache) {
66    
67    if(cache->id)                xmlFree(cache->id);    if(cache->id)                xmlFree(cache->id);
68    if(cache->name)              xmlFree(cache->name);    if(cache->name)              xmlFree(cache->name);
69    if(cache->owner)             xmlFree(cache->owner);    if(cache->owner)             gpx_free_user(cache->owner);
70    if(cache->short_description) xmlFree(cache->short_description);    if(cache->short_description) xmlFree(cache->short_description);
71    if(cache->long_description)  xmlFree(cache->long_description);    if(cache->long_description)  xmlFree(cache->long_description);
72    if(cache->hint)              xmlFree(cache->hint);    if(cache->hint)              xmlFree(cache->hint);
# Line 155  gpx_dialog_t *gpx_busy_dialog_new(GtkWid Line 160  gpx_dialog_t *gpx_busy_dialog_new(GtkWid
160    gtk_window_set_title(GTK_WINDOW(dialog->dialog), _("Loading"));    gtk_window_set_title(GTK_WINDOW(dialog->dialog), _("Loading"));
161    gtk_window_set_default_size(GTK_WINDOW(dialog->dialog), 300, 10);    gtk_window_set_default_size(GTK_WINDOW(dialog->dialog), 300, 10);
162    
163    gtk_window_set_modal(GTK_WINDOW(dialog), TRUE);    gtk_window_set_modal(GTK_WINDOW(dialog->dialog), TRUE);
164    gtk_window_set_transient_for(GTK_WINDOW(dialog->dialog), GTK_WINDOW(parent));    gtk_window_set_transient_for(GTK_WINDOW(dialog->dialog), GTK_WINDOW(parent));
165    
166    dialog->label = gtk_label_new("---");    dialog->label = gtk_label_new("---");
# Line 279  void gpx_display_cache(cache_t *cache) { Line 284  void gpx_display_cache(cache_t *cache) {
284    printf("  name:       %s\n", cache->name);    printf("  name:       %s\n", cache->name);
285    printf("  latitude:   %f\n", cache->pos.lat);    printf("  latitude:   %f\n", cache->pos.lat);
286    printf("  longitude:  %f\n", cache->pos.lon);    printf("  longitude:  %f\n", cache->pos.lon);
287    printf("  owner:      %s\n", cache->owner);    printf("  owner:      %s\n", cache->owner->name);
288    printf("  type:       %s\n", cache_type_str[cache->type+1]);    printf("  type:       %s\n", cache_type_str[cache->type+1]);
289    printf("  container:  %s\n", cache_container_str[cache->container+1]);    printf("  container:  %s\n", cache_container_str[cache->container+1]);
290    printf("  difficulty: %.1f\n", cache->difficulty);    printf("  difficulty: %.1f\n", cache->difficulty);
# Line 326  static float xml_get_prop_float(xmlTextR Line 331  static float xml_get_prop_float(xmlTextR
331    return ret;    return ret;
332  }  }
333    
334    static unsigned int xml_get_prop_id(xmlTextReaderPtr reader) {
335      unsigned int ret = 0;
336      char *prop;
337      if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "id"))) {
338        ret = atoi(prop);
339        xmlFree(prop);
340      }
341      return ret;
342    }
343    
344  static int xml_prop_is(xmlTextReaderPtr reader, char *name, char *value,  static int xml_prop_is(xmlTextReaderPtr reader, char *name, char *value,
345                         int def_value) {                         int def_value) {
346    int match = def_value;    int match = def_value;
# Line 360  static gboolean skip_element(xmlTextRead Line 375  static gboolean skip_element(xmlTextRead
375    
376  static char *process_text(xmlTextReaderPtr reader) {  static char *process_text(xmlTextReaderPtr reader) {
377    char *text = NULL;    char *text = NULL;
   int depth = xmlTextReaderDepth(reader);  
   int ret = xmlTextReaderRead(reader);  
   while((ret == 1) &&  
         ((xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT) ||  
          (xmlTextReaderDepth(reader) != depth))) {  
378    
379      /* found a text fragment */    if(!xmlTextReaderIsEmptyElement(reader)) {
380      if((xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT) ||  
381         (xmlTextReaderNodeType(reader) == XML_READER_TYPE_CDATA)) {      int depth = xmlTextReaderDepth(reader);
382        char *frag = (char*)xmlTextReaderConstValue(reader);      int ret = xmlTextReaderRead(reader);
383        while((ret == 1) &&
384        if(!text) text = strdup(frag);            ((xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT) ||
385        else {             (xmlTextReaderDepth(reader) != depth))) {
386          char *old = text;  
387          text = malloc(strlen(old) + strlen(frag) + 1);        /* found a text fragment */
388          strcpy(text, old);        if((xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT) ||
389          strcat(text, frag);           (xmlTextReaderNodeType(reader) == XML_READER_TYPE_CDATA)) {
390          free(old);          char *frag = (char*)xmlTextReaderConstValue(reader);
391    
392            if(!text) text = strdup(frag);
393            else {
394              char *old = text;
395              text = malloc(strlen(old) + strlen(frag) + 1);
396              strcpy(text, old);
397              strcat(text, frag);
398              free(old);
399            }
400        }        }
401          ret = xmlTextReaderRead(reader);
402      }      }
     ret = xmlTextReaderRead(reader);  
403    }    }
404    
405    return text;    return text;
# Line 463  static log_t *process_gpx_wpt_gc_logs_lo Line 482  static log_t *process_gpx_wpt_gc_logs_lo
482      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
483    }    }
484    
485    g_assert(0);    gpx_free_log(log);
486    return log;    return NULL;
487  }  }
488    
489  static log_t *process_gpx_wpt_gc_logs(xmlTextReaderPtr reader) {  static log_t *process_gpx_wpt_gc_logs(xmlTextReaderPtr reader) {
# Line 513  static log_t *process_gpx_wpt_gc_logs(xm Line 532  static log_t *process_gpx_wpt_gc_logs(xm
532      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
533    }    }
534    
535    g_assert(0);    /* free the entire log chain */
536    return log_chain;    while(log_chain) {
537        log_t *next = log_chain->next;
538        gpx_free_log(log_chain);
539        log_chain = next;
540      }
541    
542      return NULL;
543  }  }
544    
545  static tb_t *process_gpx_wpt_gc_tbs_travelbug(xmlTextReaderPtr reader) {  static tb_t *process_gpx_wpt_gc_tbs_travelbug(xmlTextReaderPtr reader) {
# Line 532  static tb_t *process_gpx_wpt_gc_tbs_trav Line 557  static tb_t *process_gpx_wpt_gc_tbs_trav
557    else    else
558      tb->ref = strdup("<NONE>");      tb->ref = strdup("<NONE>");
559    
560      if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "id")))
561        tb->id = atoi(prop);
562    
563    /* process all sub-nodes */    /* process all sub-nodes */
564    int depth = xmlTextReaderDepth(reader);    int depth = xmlTextReaderDepth(reader);
565    int ret = xmlTextReaderRead(reader);    int ret = xmlTextReaderRead(reader);
# Line 563  static tb_t *process_gpx_wpt_gc_tbs_trav Line 591  static tb_t *process_gpx_wpt_gc_tbs_trav
591      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
592    }    }
593    
594    g_assert(0);    gpx_free_tb(tb);
595    return tb;    return NULL;
596  }  }
597    
598  static tb_t *process_gpx_wpt_gc_tbs(xmlTextReaderPtr reader) {  static tb_t *process_gpx_wpt_gc_tbs(xmlTextReaderPtr reader) {
# Line 605  static tb_t *process_gpx_wpt_gc_tbs(xmlT Line 633  static tb_t *process_gpx_wpt_gc_tbs(xmlT
633      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
634    }    }
635    
636    g_assert(0);    while(tb) {
637    return tb;      tb_t *next = tb;
638        gpx_free_tb(tb);
639        tb = next;
640      }
641    
642      return NULL;
643  }  }
644    
645  static void process_gpx_wpt_gc(xmlTextReaderPtr reader, cache_t *cache) {  static void process_gpx_wpt_gc(xmlTextReaderPtr reader, cache_t *cache) {
# Line 630  static void process_gpx_wpt_gc(xmlTextRe Line 663  static void process_gpx_wpt_gc(xmlTextRe
663          if(strcasecmp(name, "name") == 0) {          if(strcasecmp(name, "name") == 0) {
664            if(!cache->name) cache->name = process_text(reader);            if(!cache->name) cache->name = process_text(reader);
665          } else if(strcasecmp(name, "owner") == 0) {          } else if(strcasecmp(name, "owner") == 0) {
666            if(!cache->owner) cache->owner = process_text(reader);            if(!cache->owner) {
667                cache->owner = g_new0(user_t, 1);
668                cache->owner->name = process_text(reader);
669                cache->owner->id = xml_get_prop_id(reader);
670              }
671          } else if(strcasecmp(name, "type") == 0) {          } else if(strcasecmp(name, "type") == 0) {
672            cache->type = xml_str_search(reader, cache_type_str,            cache->type = xml_str_search(reader, cache_type_str,
673                                         "cache type", CACHE_TYPE_UNKNOWN);                                         "cache type", CACHE_TYPE_UNKNOWN);
# Line 653  static void process_gpx_wpt_gc(xmlTextRe Line 690  static void process_gpx_wpt_gc(xmlTextRe
690                    (strcasecmp(name, "hints") == 0))     {                    (strcasecmp(name, "hints") == 0))     {
691            if(!cache->hint) {            if(!cache->hint) {
692              cache->hint = process_text(reader);              cache->hint = process_text(reader);
693    
694              /* often hints aren't more than just a bunch of blanks ... */              /* often hints aren't more than just a bunch of blanks ... */
695              if(cache->hint && all_is_white(cache->hint)) {              if(cache->hint && all_is_white(cache->hint)) {
696                free(cache->hint);                free(cache->hint);
# Line 764  static cache_t *process_gpx_wpt(xmlTextR Line 802  static cache_t *process_gpx_wpt(xmlTextR
802        /* neither geocaching.com GC* nor opencaching.com OC* nor */        /* neither geocaching.com GC* nor opencaching.com OC* nor */
803        /* geocaching australia GA* waypoint */        /* geocaching australia GA* waypoint */
804        if(cache->id &&        if(cache->id &&
805             (strncasecmp(cache->id, "__", 2) != 0) &&
806           (strncasecmp(cache->id, "GC", 2) != 0) &&           (strncasecmp(cache->id, "GC", 2) != 0) &&
807           (strncasecmp(cache->id, "OC", 2) != 0) &&           (strncasecmp(cache->id, "OC", 2) != 0) &&
808           (strncasecmp(cache->id, "GA", 2) != 0)) {           (strncasecmp(cache->id, "GA", 2) != 0)) {
# Line 830  static cache_t *process_gpx_wpt(xmlTextR Line 869  static cache_t *process_gpx_wpt(xmlTextR
869      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
870    }    }
871    
872    g_assert(0);    gpx_free_cache(cache);
873    return cache;    return NULL;
874  }  }
875    
876  static void process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog,  static gboolean process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog,
877                          gpx_t *gpx) {                              gpx_t *gpx) {
878    
879    /* no attributes of interest */    /* no attributes of interest */
880    
# Line 846  static void process_gpx(xmlTextReaderPtr Line 885  static void process_gpx(xmlTextReaderPtr
885    while(*cache) cache = &(*cache)->next;    while(*cache) cache = &(*cache)->next;
886    
887    const xmlChar *name = xmlTextReaderConstName(reader);    const xmlChar *name = xmlTextReaderConstName(reader);
888    g_assert(name);    if(!name) return FALSE;
889    
890    /* read next node */    /* read next node */
891    int ret = xmlTextReaderRead(reader);    int ret = xmlTextReaderRead(reader);
# Line 876  static void process_gpx(xmlTextReaderPtr Line 915  static void process_gpx(xmlTextReaderPtr
915      case XML_READER_TYPE_END_ELEMENT:      case XML_READER_TYPE_END_ELEMENT:
916        /* end element must be for the current element */        /* end element must be for the current element */
917        g_assert(xmlTextReaderDepth(reader) == 0);        g_assert(xmlTextReaderDepth(reader) == 0);
918        return;        return TRUE;
919        break;        break;
920    
921      default:      default:
# Line 885  static void process_gpx(xmlTextReaderPtr Line 924  static void process_gpx(xmlTextReaderPtr
924      ret = xmlTextReaderRead(reader);      ret = xmlTextReaderRead(reader);
925    }    }
926    
927    g_assert(0);    return FALSE;
928  }  }
929    
930  /* parse loc waypoint entry */  /* parse loc waypoint entry */
# Line 1345  float gpx_pos_get_distance(pos_t p1, pos Line 1384  float gpx_pos_get_distance(pos_t p1, pos
1384    
1385  void gpx_pos_get_distance_str(char *str, int len,  void gpx_pos_get_distance_str(char *str, int len,
1386                                pos_t p1, pos_t p2, int mil) {                                pos_t p1, pos_t p2, int mil) {
1387    if(!p1.lat && !p1.lon) {    if(isnan(p1.lat) || isnan(p1.lon)) {
1388      snprintf(str, len, "---");      snprintf(str, len, "---");
1389      return;      return;
1390    }    }

Legend:
Removed from v.13  
changed lines
  Added in v.134