435 |
} |
} |
436 |
} |
} |
437 |
|
|
438 |
static log_t *process_gpx_wpt_gc_logs_log(xmlTextReaderPtr reader) { |
static log_t *process_gpx_wpt_gc_logs_log(xmlTextReaderPtr reader, |
439 |
|
char *username, cache_t *cache) { |
440 |
|
|
441 |
|
gboolean by_user = FALSE; |
442 |
|
|
443 |
if(xmlTextReaderIsEmptyElement(reader)) |
if(xmlTextReaderIsEmptyElement(reader)) |
444 |
return NULL; |
return NULL; |
472 |
log->finder = g_new0(user_t, 1); |
log->finder = g_new0(user_t, 1); |
473 |
log->finder->name = process_text(reader); |
log->finder->name = process_text(reader); |
474 |
log->finder->id = xml_get_prop_id(reader); |
log->finder->id = xml_get_prop_id(reader); |
475 |
|
|
476 |
|
/* is this a log by us? */ |
477 |
|
if(username && !strcasecmp(username, log->finder->name)) |
478 |
|
by_user = TRUE; |
479 |
} |
} |
480 |
} else if(strcasecmp(name, "text") == 0) { |
} else if(strcasecmp(name, "text") == 0) { |
481 |
if(!log->text) log->text = process_text(reader); |
if(!log->text) log->text = process_text(reader); |
486 |
break; |
break; |
487 |
|
|
488 |
case XML_READER_TYPE_END_ELEMENT: |
case XML_READER_TYPE_END_ELEMENT: |
489 |
|
if(by_user && log->type == LOG_TYPE_FOUND) |
490 |
|
cache->found = TRUE; |
491 |
|
|
492 |
/* end element must be for the current element */ |
/* end element must be for the current element */ |
493 |
g_assert(xmlTextReaderDepth(reader) == depth); |
g_assert(xmlTextReaderDepth(reader) == depth); |
494 |
return log; |
return log; |
504 |
return NULL; |
return NULL; |
505 |
} |
} |
506 |
|
|
507 |
static log_t *process_gpx_wpt_gc_logs(xmlTextReaderPtr reader) { |
static log_t *process_gpx_wpt_gc_logs(xmlTextReaderPtr reader, char *username, |
508 |
|
cache_t *cache) { |
509 |
log_t *log_chain = NULL; |
log_t *log_chain = NULL; |
510 |
|
|
511 |
if(xmlTextReaderIsEmptyElement(reader)) |
if(xmlTextReaderIsEmptyElement(reader)) |
523 |
if(strrchr(name, ':')) name = strrchr(name, ':')+1; |
if(strrchr(name, ':')) name = strrchr(name, ':')+1; |
524 |
if(name) { |
if(name) { |
525 |
if(strcasecmp(name, "log") == 0) { |
if(strcasecmp(name, "log") == 0) { |
526 |
log_t *log = process_gpx_wpt_gc_logs_log(reader); |
log_t *log = process_gpx_wpt_gc_logs_log(reader, username, cache); |
527 |
if(log) { |
if(log) { |
528 |
/* add log to chain */ |
/* add log to chain */ |
529 |
log_t **cur = &log_chain; |
log_t **cur = &log_chain; |
661 |
return NULL; |
return NULL; |
662 |
} |
} |
663 |
|
|
664 |
static void process_gpx_wpt_gc(xmlTextReaderPtr reader, cache_t *cache) { |
static void process_gpx_wpt_gc(xmlTextReaderPtr reader, |
665 |
|
cache_t *cache, char *username) { |
666 |
cache->available = xml_prop_is(reader, "available", "true", TRUE); |
cache->available = xml_prop_is(reader, "available", "true", TRUE); |
667 |
cache->archived = xml_prop_is(reader, "archived", "true", FALSE); |
cache->archived = xml_prop_is(reader, "archived", "true", FALSE); |
668 |
|
|
723 |
} else if(strcasecmp(name, "terrain") == 0) { |
} else if(strcasecmp(name, "terrain") == 0) { |
724 |
cache->terrain = xml_float(reader, 0.0); |
cache->terrain = xml_float(reader, 0.0); |
725 |
} else if(strcasecmp(name, "logs") == 0) { |
} else if(strcasecmp(name, "logs") == 0) { |
726 |
if(!cache->log) cache->log = process_gpx_wpt_gc_logs(reader); |
if(!cache->log) cache->log = |
727 |
|
process_gpx_wpt_gc_logs(reader, username, cache); |
728 |
} else if(strcasecmp(name, "travelbugs") == 0) { |
} else if(strcasecmp(name, "travelbugs") == 0) { |
729 |
if(!cache->tb) cache->tb = process_gpx_wpt_gc_tbs(reader); |
if(!cache->tb) cache->tb = process_gpx_wpt_gc_tbs(reader); |
730 |
} else { |
} else { |
750 |
|
|
751 |
/* parse waypoint entry */ |
/* parse waypoint entry */ |
752 |
static cache_t *process_gpx_wpt(xmlTextReaderPtr reader, gpx_dialog_t *dialog, |
static cache_t *process_gpx_wpt(xmlTextReaderPtr reader, gpx_dialog_t *dialog, |
753 |
gpx_t *gpx) { |
gpx_t *gpx, char *username) { |
754 |
char *cmt = NULL, *desc = NULL; |
char *cmt = NULL, *desc = NULL; |
755 |
char *sym = NULL; |
char *sym = NULL; |
756 |
|
|
790 |
if(!cache->url) cache->url = process_text(reader); |
if(!cache->url) cache->url = process_text(reader); |
791 |
} else if((strcasecmp(name, "cache") == 0) || |
} else if((strcasecmp(name, "cache") == 0) || |
792 |
(strcasecmp(name, "geocache") == 0)) { |
(strcasecmp(name, "geocache") == 0)) { |
793 |
process_gpx_wpt_gc(reader, cache); |
process_gpx_wpt_gc(reader, cache, username); |
794 |
|
|
795 |
/* the following are used if the current entry is a waypoint */ |
/* the following are used if the current entry is a waypoint */ |
796 |
} else if(strcasecmp(name, "cmt") == 0) { |
} else if(strcasecmp(name, "cmt") == 0) { |
895 |
} |
} |
896 |
|
|
897 |
static gboolean process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog, |
static gboolean process_gpx(xmlTextReaderPtr reader, gpx_dialog_t *dialog, |
898 |
gpx_t *gpx) { |
gpx_t *gpx, char *username) { |
899 |
|
|
900 |
/* no attributes of interest */ |
/* no attributes of interest */ |
901 |
|
|
925 |
(strcasecmp(name, "date") == 0))) { |
(strcasecmp(name, "date") == 0))) { |
926 |
xml_get_date(reader, &gpx->year, &gpx->month, &gpx->day); |
xml_get_date(reader, &gpx->year, &gpx->month, &gpx->day); |
927 |
} else if(name && strcasecmp(name, "wpt") == 0) { |
} else if(name && strcasecmp(name, "wpt") == 0) { |
928 |
*cache = process_gpx_wpt(reader, dialog, gpx); |
*cache = process_gpx_wpt(reader, dialog, gpx, username); |
929 |
if(*cache) cache = &(*cache)->next; |
if(*cache) cache = &(*cache)->next; |
930 |
} else { |
} else { |
931 |
// printf("something unknown (%s) found\n", name); |
// printf("something unknown (%s) found\n", name); |
1052 |
} |
} |
1053 |
|
|
1054 |
static gpx_t *process_root(xmlTextReaderPtr reader, gpx_dialog_t *dialog, |
static gpx_t *process_root(xmlTextReaderPtr reader, gpx_dialog_t *dialog, |
1055 |
char *fname, gpx_t *in) { |
char *fname, gpx_t *in, char *username) { |
1056 |
|
|
1057 |
/* no gpx entry given, create a new one */ |
/* no gpx entry given, create a new one */ |
1058 |
gpx_t *gpx = NULL; |
gpx_t *gpx = NULL; |
1071 |
g_assert(xmlTextReaderDepth(reader) == 0); |
g_assert(xmlTextReaderDepth(reader) == 0); |
1072 |
char *name = (char*)xmlTextReaderConstName(reader); |
char *name = (char*)xmlTextReaderConstName(reader); |
1073 |
if(name && strcasecmp(name, "gpx") == 0) { |
if(name && strcasecmp(name, "gpx") == 0) { |
1074 |
process_gpx(reader, dialog, gpx); |
process_gpx(reader, dialog, gpx, username); |
1075 |
} else if(name && strcasecmp(name, "loc") == 0) { |
} else if(name && strcasecmp(name, "loc") == 0) { |
1076 |
process_loc(reader, dialog, gpx); |
process_loc(reader, dialog, gpx); |
1077 |
} else { |
} else { |
1107 |
return gpx; |
return gpx; |
1108 |
} |
} |
1109 |
|
|
1110 |
static gpx_t *gpx_parse_file(gpx_dialog_t *dialog, char *filename) { |
static gpx_t *gpx_parse_file(gpx_dialog_t *dialog, |
1111 |
|
char *filename, char *username) { |
1112 |
gpx_t *gpx = NULL; |
gpx_t *gpx = NULL; |
1113 |
|
|
1114 |
LIBXML_TEST_VERSION; |
LIBXML_TEST_VERSION; |
1117 |
|
|
1118 |
xmlTextReaderPtr reader = xmlReaderForFile(filename, NULL, 0); |
xmlTextReaderPtr reader = xmlReaderForFile(filename, NULL, 0); |
1119 |
if (reader != NULL) { |
if (reader != NULL) { |
1120 |
gpx = process_root(reader, dialog, filename, NULL); |
gpx = process_root(reader, dialog, filename, NULL, username); |
1121 |
xmlFreeTextReader(reader); |
xmlFreeTextReader(reader); |
1122 |
} else { |
} else { |
1123 |
fprintf(stderr, "Unable to open %s\n", filename); |
fprintf(stderr, "Unable to open %s\n", filename); |
1133 |
if(g_file_test(wpts_name, G_FILE_TEST_EXISTS)) { |
if(g_file_test(wpts_name, G_FILE_TEST_EXISTS)) { |
1134 |
xmlTextReaderPtr reader = xmlReaderForFile(wpts_name, NULL, 0); |
xmlTextReaderPtr reader = xmlReaderForFile(wpts_name, NULL, 0); |
1135 |
if (reader != NULL) { |
if (reader != NULL) { |
1136 |
gpx = process_root(reader, dialog, wpts_name, gpx); |
gpx = process_root(reader, dialog, wpts_name, gpx, username); |
1137 |
xmlFreeTextReader(reader); |
xmlFreeTextReader(reader); |
1138 |
} else { |
} else { |
1139 |
fprintf(stderr, "Unable to open %s\n", filename); |
fprintf(stderr, "Unable to open %s\n", filename); |
1146 |
|
|
1147 |
static gpx_t *decompress_file(unzFile file, gpx_dialog_t *dialog, |
static gpx_t *decompress_file(unzFile file, gpx_dialog_t *dialog, |
1148 |
char *name, char *filename, |
char *name, char *filename, |
1149 |
gpx_t *gpx_in) { |
gpx_t *gpx_in, char *username) { |
1150 |
unz_file_info info; |
unz_file_info info; |
1151 |
gpx_t *gpx = NULL; |
gpx_t *gpx = NULL; |
1152 |
|
|
1190 |
xmlReaderForMemory(buffer, info.uncompressed_size, |
xmlReaderForMemory(buffer, info.uncompressed_size, |
1191 |
NULL, NULL, 0); |
NULL, NULL, 0); |
1192 |
if (reader != NULL) { |
if (reader != NULL) { |
1193 |
gpx = process_root(reader, dialog, filename, gpx_in); |
gpx = process_root(reader, dialog, filename, gpx_in, username); |
1194 |
xmlFreeTextReader(reader); |
xmlFreeTextReader(reader); |
1195 |
} else { |
} else { |
1196 |
fprintf(stderr, "Unable to open %s\n", filename); |
fprintf(stderr, "Unable to open %s\n", filename); |
1201 |
return gpx; |
return gpx; |
1202 |
} |
} |
1203 |
|
|
1204 |
static gpx_t *decompress_zip(gpx_dialog_t *dialog, char *filename) { |
static gpx_t *decompress_zip(gpx_dialog_t *dialog, |
1205 |
|
char *filename, char *username) { |
1206 |
char *gpx_name, *fbase; |
char *gpx_name, *fbase; |
1207 |
gpx_t *gpx = NULL; |
gpx_t *gpx = NULL; |
1208 |
|
|
1226 |
strcpy(gpx_name+strlen(gpx_name)-4, ".gpx"); |
strcpy(gpx_name+strlen(gpx_name)-4, ".gpx"); |
1227 |
printf("gpx file name is %s\n", gpx_name); |
printf("gpx file name is %s\n", gpx_name); |
1228 |
|
|
1229 |
gpx = decompress_file(file, dialog, gpx_name, filename, NULL); |
gpx = decompress_file(file, dialog, gpx_name, filename, NULL, username); |
1230 |
|
|
1231 |
/* try to open -wpts.gpx file inside */ |
/* try to open -wpts.gpx file inside */ |
1232 |
strcpy(gpx_name, fbase); |
strcpy(gpx_name, fbase); |
1233 |
strcpy(gpx_name+strlen(gpx_name)-4, "-wpts.gpx"); |
strcpy(gpx_name+strlen(gpx_name)-4, "-wpts.gpx"); |
1234 |
printf("gpx wpts file name is %s\n", gpx_name); |
printf("gpx wpts file name is %s\n", gpx_name); |
1235 |
|
|
1236 |
gpx = decompress_file(file, dialog, gpx_name, filename, gpx); |
gpx = decompress_file(file, dialog, gpx_name, filename, gpx, username); |
1237 |
|
|
1238 |
unzClose(file); |
unzClose(file); |
1239 |
free(gpx_name); |
free(gpx_name); |
1240 |
return gpx; |
return gpx; |
1241 |
} |
} |
1242 |
|
|
1243 |
gpx_t *gpx_parse(gpx_dialog_t *dialog, char *filename) { |
gpx_t *gpx_parse(gpx_dialog_t *dialog, char *filename, char *username) { |
1244 |
gpx_t *gpx = NULL; |
gpx_t *gpx = NULL; |
1245 |
|
|
1246 |
/* show busy dialog */ |
/* show busy dialog */ |
1250 |
!strcasecmp(filename+strlen(filename)-4, ".zip")) { |
!strcasecmp(filename+strlen(filename)-4, ".zip")) { |
1251 |
printf("trying to load a zip file!\n"); |
printf("trying to load a zip file!\n"); |
1252 |
|
|
1253 |
gpx = decompress_zip(dialog, filename); |
gpx = decompress_zip(dialog, filename, username); |
1254 |
} else |
} else |
1255 |
gpx = gpx_parse_file(dialog, filename); |
gpx = gpx_parse_file(dialog, filename, username); |
1256 |
|
|
1257 |
return gpx; |
return gpx; |
1258 |
} |
} |
1259 |
|
|
1260 |
/* scan entire directory */ |
/* scan entire directory */ |
1261 |
gpx_t *gpx_parse_dir(gpx_dialog_t *dialog, char *dirname) { |
gpx_t *gpx_parse_dir(gpx_dialog_t *dialog, char *dirname, char *username) { |
1262 |
GnomeVFSResult result; |
GnomeVFSResult result; |
1263 |
GnomeVFSDirectoryHandle *handle; |
GnomeVFSDirectoryHandle *handle; |
1264 |
GnomeVFSFileInfo *finfo = gnome_vfs_file_info_new();; |
GnomeVFSFileInfo *finfo = gnome_vfs_file_info_new();; |
1295 |
|
|
1296 |
xmlTextReaderPtr reader = xmlReaderForFile(filename, NULL, 0); |
xmlTextReaderPtr reader = xmlReaderForFile(filename, NULL, 0); |
1297 |
if (reader != NULL) { |
if (reader != NULL) { |
1298 |
gpx = process_root(reader, dialog, filename, gpx); |
gpx = process_root(reader, dialog, filename, gpx, username); |
1299 |
xmlFreeTextReader(reader); |
xmlFreeTextReader(reader); |
1300 |
} else { |
} else { |
1301 |
fprintf(stderr, "Unable to open %s\n", filename); |
fprintf(stderr, "Unable to open %s\n", filename); |