--- trunk/src/gpx.c 2009/07/29 19:24:15 34 +++ trunk/src/gpx.c 2009/10/19 18:21:20 137 @@ -42,8 +42,13 @@ free(wpt); } +void gpx_free_user(user_t *user) { + if(user->name) xmlFree(user->name); + free(user); +} + void gpx_free_log(log_t *log) { - if(log->finder) xmlFree(log->finder); + if(log->finder) gpx_free_user(log->finder); if(log->text) xmlFree(log->text); free(log); } @@ -61,7 +66,7 @@ if(cache->id) xmlFree(cache->id); if(cache->name) xmlFree(cache->name); - if(cache->owner) xmlFree(cache->owner); + if(cache->owner) gpx_free_user(cache->owner); if(cache->short_description) xmlFree(cache->short_description); if(cache->long_description) xmlFree(cache->long_description); if(cache->hint) xmlFree(cache->hint); @@ -267,7 +272,7 @@ printf(" Log:\n"); printf(" date: %d.%d.%d\n", log->day, log->month, log->year); printf(" type: %s\n", log_type_str[log->type+1]); - printf(" finder: %s\n", log->finder); + printf(" finder: %s\n", log->finder->name); // printf(" text: %s\n", log->text); } @@ -279,7 +284,7 @@ printf(" name: %s\n", cache->name); printf(" latitude: %f\n", cache->pos.lat); printf(" longitude: %f\n", cache->pos.lon); - printf(" owner: %s\n", cache->owner); + printf(" owner: %s\n", cache->owner->name); printf(" type: %s\n", cache_type_str[cache->type+1]); printf(" container: %s\n", cache_container_str[cache->container+1]); printf(" difficulty: %.1f\n", cache->difficulty); @@ -326,6 +331,16 @@ return ret; } +static unsigned int xml_get_prop_id(xmlTextReaderPtr reader) { + unsigned int ret = 0; + char *prop; + if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "id"))) { + ret = atoi(prop); + xmlFree(prop); + } + return ret; +} + static int xml_prop_is(xmlTextReaderPtr reader, char *name, char *value, int def_value) { int match = def_value; @@ -360,27 +375,31 @@ static char *process_text(xmlTextReaderPtr reader) { char *text = NULL; - int depth = xmlTextReaderDepth(reader); - int ret = xmlTextReaderRead(reader); - while((ret == 1) && - ((xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT) || - (xmlTextReaderDepth(reader) != depth))) { - /* found a text fragment */ - if((xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT) || - (xmlTextReaderNodeType(reader) == XML_READER_TYPE_CDATA)) { - char *frag = (char*)xmlTextReaderConstValue(reader); - - if(!text) text = strdup(frag); - else { - char *old = text; - text = malloc(strlen(old) + strlen(frag) + 1); - strcpy(text, old); - strcat(text, frag); - free(old); + if(!xmlTextReaderIsEmptyElement(reader)) { + + int depth = xmlTextReaderDepth(reader); + int ret = xmlTextReaderRead(reader); + while((ret == 1) && + ((xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT) || + (xmlTextReaderDepth(reader) != depth))) { + + /* found a text fragment */ + if((xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT) || + (xmlTextReaderNodeType(reader) == XML_READER_TYPE_CDATA)) { + char *frag = (char*)xmlTextReaderConstValue(reader); + + if(!text) text = strdup(frag); + else { + char *old = text; + text = malloc(strlen(old) + strlen(frag) + 1); + strcpy(text, old); + strcat(text, frag); + free(old); + } } + ret = xmlTextReaderRead(reader); } - ret = xmlTextReaderRead(reader); } return text; @@ -442,7 +461,11 @@ log->type = xml_str_search(reader, log_type_str, "log", 0); } else if((strcasecmp(name, "finder") == 0) || (strcasecmp(name, "geocacher") == 0)) { - if(!log->finder) log->finder = process_text(reader); + if(!log->finder) { + log->finder = g_new0(user_t, 1); + log->finder->name = process_text(reader); + log->finder->id = xml_get_prop_id(reader); + } } else if(strcasecmp(name, "text") == 0) { if(!log->text) log->text = process_text(reader); } else @@ -463,8 +486,8 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); - return log; + gpx_free_log(log); + return NULL; } static log_t *process_gpx_wpt_gc_logs(xmlTextReaderPtr reader) { @@ -513,8 +536,14 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); - return log_chain; + /* free the entire log chain */ + while(log_chain) { + log_t *next = log_chain->next; + gpx_free_log(log_chain); + log_chain = next; + } + + return NULL; } static tb_t *process_gpx_wpt_gc_tbs_travelbug(xmlTextReaderPtr reader) { @@ -532,6 +561,9 @@ else tb->ref = strdup(""); + if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "id"))) + tb->id = atoi(prop); + /* process all sub-nodes */ int depth = xmlTextReaderDepth(reader); int ret = xmlTextReaderRead(reader); @@ -563,8 +595,8 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); - return tb; + gpx_free_tb(tb); + return NULL; } static tb_t *process_gpx_wpt_gc_tbs(xmlTextReaderPtr reader) { @@ -605,8 +637,13 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); - return tb; + while(tb) { + tb_t *next = tb; + gpx_free_tb(tb); + tb = next; + } + + return NULL; } static void process_gpx_wpt_gc(xmlTextReaderPtr reader, cache_t *cache) { @@ -630,7 +667,11 @@ if(strcasecmp(name, "name") == 0) { if(!cache->name) cache->name = process_text(reader); } else if(strcasecmp(name, "owner") == 0) { - if(!cache->owner) cache->owner = process_text(reader); + if(!cache->owner) { + cache->owner = g_new0(user_t, 1); + cache->owner->name = process_text(reader); + cache->owner->id = xml_get_prop_id(reader); + } } else if(strcasecmp(name, "type") == 0) { cache->type = xml_str_search(reader, cache_type_str, "cache type", CACHE_TYPE_UNKNOWN); @@ -653,6 +694,7 @@ (strcasecmp(name, "hints") == 0)) { if(!cache->hint) { cache->hint = process_text(reader); + /* often hints aren't more than just a bunch of blanks ... */ if(cache->hint && all_is_white(cache->hint)) { free(cache->hint); @@ -831,12 +873,12 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); - return cache; + gpx_free_cache(cache); + return NULL; } -static void process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog, - gpx_t *gpx) { +static gboolean process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog, + gpx_t *gpx) { /* no attributes of interest */ @@ -847,7 +889,7 @@ while(*cache) cache = &(*cache)->next; const xmlChar *name = xmlTextReaderConstName(reader); - g_assert(name); + if(!name) return FALSE; /* read next node */ int ret = xmlTextReaderRead(reader); @@ -877,7 +919,7 @@ case XML_READER_TYPE_END_ELEMENT: /* end element must be for the current element */ g_assert(xmlTextReaderDepth(reader) == 0); - return; + return TRUE; break; default: @@ -886,7 +928,7 @@ ret = xmlTextReaderRead(reader); } - g_assert(0); + return FALSE; } /* parse loc waypoint entry */