Diff of /trunk/src/gpx.c

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

revision 203 by harbaum, Mon Nov 2 10:53:01 2009 UTC revision 204 by harbaum, Mon Nov 23 18:32:06 2009 UTC
# Line 435  static void xml_get_date(xmlTextReaderPt Line 435  static void xml_get_date(xmlTextReaderPt
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;
# Line 469  static log_t *process_gpx_wpt_gc_logs_lo Line 472  static log_t *process_gpx_wpt_gc_logs_lo
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);
# Line 479  static log_t *process_gpx_wpt_gc_logs_lo Line 486  static log_t *process_gpx_wpt_gc_logs_lo
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;
# Line 494  static log_t *process_gpx_wpt_gc_logs_lo Line 504  static log_t *process_gpx_wpt_gc_logs_lo
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))
# Line 512  static log_t *process_gpx_wpt_gc_logs(xm Line 523  static log_t *process_gpx_wpt_gc_logs(xm
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;
# Line 650  static tb_t *process_gpx_wpt_gc_tbs(xmlT Line 661  static tb_t *process_gpx_wpt_gc_tbs(xmlT
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    
# Line 711  static void process_gpx_wpt_gc(xmlTextRe Line 723  static void process_gpx_wpt_gc(xmlTextRe
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 {
# Line 737  static void process_gpx_wpt_gc(xmlTextRe Line 750  static void process_gpx_wpt_gc(xmlTextRe
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    
# Line 777  static cache_t *process_gpx_wpt(xmlTextR Line 790  static cache_t *process_gpx_wpt(xmlTextR
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) {
# Line 882  static cache_t *process_gpx_wpt(xmlTextR Line 895  static cache_t *process_gpx_wpt(xmlTextR
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    
# Line 912  static gboolean process_gpx(xmlTextReade Line 925  static gboolean process_gpx(xmlTextReade
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);
# Line 1039  static void process_loc(xmlTextReaderPtr Line 1052  static void process_loc(xmlTextReaderPtr
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;
# Line 1058  static gpx_t *process_root(xmlTextReader Line 1071  static gpx_t *process_root(xmlTextReader
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 {
# Line 1094  static gpx_t *process_root(xmlTextReader Line 1107  static gpx_t *process_root(xmlTextReader
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;
# Line 1103  static gpx_t *gpx_parse_file(gpx_dialog_ Line 1117  static gpx_t *gpx_parse_file(gpx_dialog_
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);
# Line 1119  static gpx_t *gpx_parse_file(gpx_dialog_ Line 1133  static gpx_t *gpx_parse_file(gpx_dialog_
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);
# Line 1132  static gpx_t *gpx_parse_file(gpx_dialog_ Line 1146  static gpx_t *gpx_parse_file(gpx_dialog_
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    
# Line 1176  static gpx_t *decompress_file(unzFile fi Line 1190  static gpx_t *decompress_file(unzFile fi
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);
# Line 1187  static gpx_t *decompress_file(unzFile fi Line 1201  static gpx_t *decompress_file(unzFile fi
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    
# Line 1211  static gpx_t *decompress_zip(gpx_dialog_ Line 1226  static gpx_t *decompress_zip(gpx_dialog_
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 */
# Line 1235  gpx_t *gpx_parse(gpx_dialog_t *dialog, c Line 1250  gpx_t *gpx_parse(gpx_dialog_t *dialog, c
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();;
# Line 1280  gpx_t *gpx_parse_dir(gpx_dialog_t *dialo Line 1295  gpx_t *gpx_parse_dir(gpx_dialog_t *dialo
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);

Legend:
Removed from v.203  
changed lines
  Added in v.204