155 |
gtk_window_set_title(GTK_WINDOW(dialog->dialog), _("Loading")); |
gtk_window_set_title(GTK_WINDOW(dialog->dialog), _("Loading")); |
156 |
gtk_window_set_default_size(GTK_WINDOW(dialog->dialog), 300, 10); |
gtk_window_set_default_size(GTK_WINDOW(dialog->dialog), 300, 10); |
157 |
|
|
158 |
gtk_window_set_modal(GTK_WINDOW(dialog), TRUE); |
gtk_window_set_modal(GTK_WINDOW(dialog->dialog), TRUE); |
159 |
gtk_window_set_transient_for(GTK_WINDOW(dialog->dialog), GTK_WINDOW(parent)); |
gtk_window_set_transient_for(GTK_WINDOW(dialog->dialog), GTK_WINDOW(parent)); |
160 |
|
|
161 |
dialog->label = gtk_label_new("---"); |
dialog->label = gtk_label_new("---"); |
360 |
|
|
361 |
static char *process_text(xmlTextReaderPtr reader) { |
static char *process_text(xmlTextReaderPtr reader) { |
362 |
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))) { |
|
363 |
|
|
364 |
/* found a text fragment */ |
if(!xmlTextReaderIsEmptyElement(reader)) { |
365 |
if((xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT) || |
|
366 |
(xmlTextReaderNodeType(reader) == XML_READER_TYPE_CDATA)) { |
int depth = xmlTextReaderDepth(reader); |
367 |
char *frag = (char*)xmlTextReaderConstValue(reader); |
int ret = xmlTextReaderRead(reader); |
368 |
|
while((ret == 1) && |
369 |
if(!text) text = strdup(frag); |
((xmlTextReaderNodeType(reader) != XML_READER_TYPE_END_ELEMENT) || |
370 |
else { |
(xmlTextReaderDepth(reader) != depth))) { |
371 |
char *old = text; |
|
372 |
text = malloc(strlen(old) + strlen(frag) + 1); |
/* found a text fragment */ |
373 |
strcpy(text, old); |
if((xmlTextReaderNodeType(reader) == XML_READER_TYPE_TEXT) || |
374 |
strcat(text, frag); |
(xmlTextReaderNodeType(reader) == XML_READER_TYPE_CDATA)) { |
375 |
free(old); |
char *frag = (char*)xmlTextReaderConstValue(reader); |
376 |
|
|
377 |
|
if(!text) text = strdup(frag); |
378 |
|
else { |
379 |
|
char *old = text; |
380 |
|
text = malloc(strlen(old) + strlen(frag) + 1); |
381 |
|
strcpy(text, old); |
382 |
|
strcat(text, frag); |
383 |
|
free(old); |
384 |
|
} |
385 |
} |
} |
386 |
|
ret = xmlTextReaderRead(reader); |
387 |
} |
} |
|
ret = xmlTextReaderRead(reader); |
|
388 |
} |
} |
389 |
|
|
390 |
return text; |
return text; |
467 |
ret = xmlTextReaderRead(reader); |
ret = xmlTextReaderRead(reader); |
468 |
} |
} |
469 |
|
|
470 |
g_assert(0); |
gpx_free_log(log); |
471 |
return log; |
return NULL; |
472 |
} |
} |
473 |
|
|
474 |
static log_t *process_gpx_wpt_gc_logs(xmlTextReaderPtr reader) { |
static log_t *process_gpx_wpt_gc_logs(xmlTextReaderPtr reader) { |
517 |
ret = xmlTextReaderRead(reader); |
ret = xmlTextReaderRead(reader); |
518 |
} |
} |
519 |
|
|
520 |
g_assert(0); |
/* free the entire log chain */ |
521 |
return log_chain; |
while(log_chain) { |
522 |
|
log_t *next = log_chain->next; |
523 |
|
gpx_free_log(log_chain); |
524 |
|
log_chain = next; |
525 |
|
} |
526 |
|
|
527 |
|
return NULL; |
528 |
} |
} |
529 |
|
|
530 |
static tb_t *process_gpx_wpt_gc_tbs_travelbug(xmlTextReaderPtr reader) { |
static tb_t *process_gpx_wpt_gc_tbs_travelbug(xmlTextReaderPtr reader) { |
542 |
else |
else |
543 |
tb->ref = strdup("<NONE>"); |
tb->ref = strdup("<NONE>"); |
544 |
|
|
545 |
|
if((prop = (char*)xmlTextReaderGetAttribute(reader, BAD_CAST "id"))) |
546 |
|
tb->id = atoi(prop); |
547 |
|
|
548 |
/* process all sub-nodes */ |
/* process all sub-nodes */ |
549 |
int depth = xmlTextReaderDepth(reader); |
int depth = xmlTextReaderDepth(reader); |
550 |
int ret = xmlTextReaderRead(reader); |
int ret = xmlTextReaderRead(reader); |
576 |
ret = xmlTextReaderRead(reader); |
ret = xmlTextReaderRead(reader); |
577 |
} |
} |
578 |
|
|
579 |
g_assert(0); |
gpx_free_tb(tb); |
580 |
return tb; |
return NULL; |
581 |
} |
} |
582 |
|
|
583 |
static tb_t *process_gpx_wpt_gc_tbs(xmlTextReaderPtr reader) { |
static tb_t *process_gpx_wpt_gc_tbs(xmlTextReaderPtr reader) { |
618 |
ret = xmlTextReaderRead(reader); |
ret = xmlTextReaderRead(reader); |
619 |
} |
} |
620 |
|
|
621 |
g_assert(0); |
while(tb) { |
622 |
return tb; |
tb_t *next = tb; |
623 |
|
gpx_free_tb(tb); |
624 |
|
tb = next; |
625 |
|
} |
626 |
|
|
627 |
|
return NULL; |
628 |
} |
} |
629 |
|
|
630 |
static void process_gpx_wpt_gc(xmlTextReaderPtr reader, cache_t *cache) { |
static void process_gpx_wpt_gc(xmlTextReaderPtr reader, cache_t *cache) { |
671 |
(strcasecmp(name, "hints") == 0)) { |
(strcasecmp(name, "hints") == 0)) { |
672 |
if(!cache->hint) { |
if(!cache->hint) { |
673 |
cache->hint = process_text(reader); |
cache->hint = process_text(reader); |
674 |
|
|
675 |
/* often hints aren't more than just a bunch of blanks ... */ |
/* often hints aren't more than just a bunch of blanks ... */ |
676 |
if(cache->hint && all_is_white(cache->hint)) { |
if(cache->hint && all_is_white(cache->hint)) { |
677 |
free(cache->hint); |
free(cache->hint); |
783 |
/* neither geocaching.com GC* nor opencaching.com OC* nor */ |
/* neither geocaching.com GC* nor opencaching.com OC* nor */ |
784 |
/* geocaching australia GA* waypoint */ |
/* geocaching australia GA* waypoint */ |
785 |
if(cache->id && |
if(cache->id && |
786 |
|
(strncasecmp(cache->id, "__", 2) != 0) && |
787 |
(strncasecmp(cache->id, "GC", 2) != 0) && |
(strncasecmp(cache->id, "GC", 2) != 0) && |
788 |
(strncasecmp(cache->id, "OC", 2) != 0) && |
(strncasecmp(cache->id, "OC", 2) != 0) && |
789 |
(strncasecmp(cache->id, "GA", 2) != 0)) { |
(strncasecmp(cache->id, "GA", 2) != 0)) { |
850 |
ret = xmlTextReaderRead(reader); |
ret = xmlTextReaderRead(reader); |
851 |
} |
} |
852 |
|
|
853 |
g_assert(0); |
gpx_free_cache(cache); |
854 |
return cache; |
return NULL; |
855 |
} |
} |
856 |
|
|
857 |
static void process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog, |
static gboolean process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog, |
858 |
gpx_t *gpx) { |
gpx_t *gpx) { |
859 |
|
|
860 |
/* no attributes of interest */ |
/* no attributes of interest */ |
861 |
|
|
866 |
while(*cache) cache = &(*cache)->next; |
while(*cache) cache = &(*cache)->next; |
867 |
|
|
868 |
const xmlChar *name = xmlTextReaderConstName(reader); |
const xmlChar *name = xmlTextReaderConstName(reader); |
869 |
g_assert(name); |
if(!name) return FALSE; |
870 |
|
|
871 |
/* read next node */ |
/* read next node */ |
872 |
int ret = xmlTextReaderRead(reader); |
int ret = xmlTextReaderRead(reader); |
896 |
case XML_READER_TYPE_END_ELEMENT: |
case XML_READER_TYPE_END_ELEMENT: |
897 |
/* end element must be for the current element */ |
/* end element must be for the current element */ |
898 |
g_assert(xmlTextReaderDepth(reader) == 0); |
g_assert(xmlTextReaderDepth(reader) == 0); |
899 |
return; |
return TRUE; |
900 |
break; |
break; |
901 |
|
|
902 |
default: |
default: |
905 |
ret = xmlTextReaderRead(reader); |
ret = xmlTextReaderRead(reader); |
906 |
} |
} |
907 |
|
|
908 |
g_assert(0); |
return FALSE; |
909 |
} |
} |
910 |
|
|
911 |
/* parse loc waypoint entry */ |
/* parse loc waypoint entry */ |
1089 |
*dot = 0; |
*dot = 0; |
1090 |
snprintf(wpts_name, sizeof(wpts_name), "%s-wpts.gpx", filename); |
snprintf(wpts_name, sizeof(wpts_name), "%s-wpts.gpx", filename); |
1091 |
*dot = '.'; |
*dot = '.'; |
|
|
|
1092 |
if(g_file_test(wpts_name, G_FILE_TEST_EXISTS)) { |
if(g_file_test(wpts_name, G_FILE_TEST_EXISTS)) { |
|
|
|
1093 |
xmlTextReaderPtr reader = xmlReaderForFile(wpts_name, NULL, 0); |
xmlTextReaderPtr reader = xmlReaderForFile(wpts_name, NULL, 0); |
1094 |
if (reader != NULL) { |
if (reader != NULL) { |
1095 |
gpx = process_root(reader, dialog, wpts_name, gpx); |
gpx = process_root(reader, dialog, wpts_name, gpx); |
1365 |
|
|
1366 |
void gpx_pos_get_distance_str(char *str, int len, |
void gpx_pos_get_distance_str(char *str, int len, |
1367 |
pos_t p1, pos_t p2, int mil) { |
pos_t p1, pos_t p2, int mil) { |
1368 |
if(!p1.lat && !p1.lon) { |
if(isnan(p1.lat) || isnan(p1.lon)) { |
1369 |
snprintf(str, len, "---"); |
snprintf(str, len, "---"); |
1370 |
return; |
return; |
1371 |
} |
} |
1374 |
distance_str(str, len, dist, mil); |
distance_str(str, len, dist, mil); |
1375 |
} |
} |
1376 |
|
|
|
/* http://library.gnome.org/devel/gtk/unstable/GtkRadioButton.html */ |
|
1377 |
void gpx_sort(gpx_t *gpx, int by, pos_t *refpos) { |
void gpx_sort(gpx_t *gpx, int by, pos_t *refpos) { |
1378 |
cache_t **new; |
cache_t **new; |
1379 |
cache_t *cur = gpx->cache; |
cache_t *cur = gpx->cache; |
1382 |
|
|
1383 |
gpx->cache = NULL; /* detach old chain */ |
gpx->cache = NULL; /* detach old chain */ |
1384 |
while(cur) { |
while(cur) { |
1385 |
float cur_dist = gpx_pos_get_distance(*refpos, gpx_cache_pos(cur), 0); |
float cur_dist = -1; |
1386 |
int cur_cnt = 0; |
int cur_cnt = 0; |
1387 |
|
|
1388 |
|
if(!isnan(cur->pos.lat) && !isnan(cur->pos.lon)) |
1389 |
|
cur_dist = gpx_pos_get_distance(*refpos, gpx_cache_pos(cur), 0); |
1390 |
|
|
1391 |
new = &(gpx->cache); |
new = &(gpx->cache); |
1392 |
|
|
1393 |
/* search for currect insertion point */ |
/* search for currect insertion point */ |