19
19
#include < stdexcept>
20
20
21
21
#include < qfile.h>
22
+ #include < qdatetime.h>
22
23
23
24
#include " gpsdata.h"
24
25
@@ -61,6 +62,8 @@ void GPSPoint::writeXML(QTextStream& stream) {
61
62
stream<<" <ele>" <<ele<<" </ele>\n " ;
62
63
if (!sym.isEmpty ())
63
64
stream<<" <sym>" <<xmlify (sym)<<" </sym>\n " ;
65
+ if (time.isValid ())
66
+ stream<<" <time>" <<time.toString (Qt::ISODate)<<" Z</time>\n " ;
64
67
}
65
68
66
69
@@ -387,9 +390,9 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
387
390
mWpt = Waypoint ();
388
391
for (int i = 0 ; attr[2 *i] != NULL ; ++i) {
389
392
if (!std::strcmp (attr[2 *i], " lat" ))
390
- mWpt .lat = mCLocale .toDouble (attr[2 *i+1 ]);
393
+ mWpt .lat = mCLocale .toDouble (attr[2 *i+1 ]);
391
394
else if (!std::strcmp (attr[2 *i], " lon" ))
392
- mWpt .lon = mCLocale .toDouble (attr[2 *i+1 ]);
395
+ mWpt .lon = mCLocale .toDouble (attr[2 *i+1 ]);
393
396
}
394
397
mObj = &mWpt ;
395
398
}
@@ -407,8 +410,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
407
410
// common properties
408
411
else if (!std::strcmp (qName, " name" )) {
409
412
if (parseModes.top () == ParsingWaypoint ||
410
- parseModes.top () == ParsingRoute ||
411
- parseModes.top () == ParsingTrack) {
413
+ parseModes.top () == ParsingRoute ||
414
+ parseModes.top () == ParsingTrack) {
412
415
mString = &mObj ->name ;
413
416
mCharBuffer = " " ;
414
417
parseModes.push (ParsingString);
@@ -418,8 +421,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
418
421
}
419
422
else if (!std::strcmp (qName, " cmt" )) {
420
423
if (parseModes.top () == ParsingWaypoint ||
421
- parseModes.top () == ParsingRoute ||
422
- parseModes.top () == ParsingTrack) {
424
+ parseModes.top () == ParsingRoute ||
425
+ parseModes.top () == ParsingTrack) {
423
426
mString = &mObj ->cmt ;
424
427
mCharBuffer = " " ;
425
428
parseModes.push (ParsingString);
@@ -429,8 +432,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
429
432
}
430
433
else if (!std::strcmp (qName, " desc" )) {
431
434
if (parseModes.top () == ParsingWaypoint ||
432
- parseModes.top () == ParsingRoute ||
433
- parseModes.top () == ParsingTrack) {
435
+ parseModes.top () == ParsingRoute ||
436
+ parseModes.top () == ParsingTrack) {
434
437
mString = &mObj ->desc ;
435
438
mCharBuffer = " " ;
436
439
parseModes.push (ParsingString);
@@ -440,8 +443,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
440
443
}
441
444
else if (!std::strcmp (qName, " src" )) {
442
445
if (parseModes.top () == ParsingWaypoint ||
443
- parseModes.top () == ParsingRoute ||
444
- parseModes.top () == ParsingTrack) {
446
+ parseModes.top () == ParsingRoute ||
447
+ parseModes.top () == ParsingTrack) {
445
448
mString = &mObj ->src ;
446
449
mCharBuffer = " " ;
447
450
parseModes.push (ParsingString);
@@ -451,8 +454,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
451
454
}
452
455
else if (!std::strcmp (qName, " url" )) {
453
456
if (parseModes.top () == ParsingWaypoint ||
454
- parseModes.top () == ParsingRoute ||
455
- parseModes.top () == ParsingTrack) {
457
+ parseModes.top () == ParsingRoute ||
458
+ parseModes.top () == ParsingTrack) {
456
459
mString = &mObj ->url ;
457
460
mCharBuffer = " " ;
458
461
parseModes.push (ParsingString);
@@ -462,8 +465,8 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
462
465
}
463
466
else if (!std::strcmp (qName, " urlname" )) {
464
467
if (parseModes.top () == ParsingWaypoint ||
465
- parseModes.top () == ParsingRoute ||
466
- parseModes.top () == ParsingTrack) {
468
+ parseModes.top () == ParsingRoute ||
469
+ parseModes.top () == ParsingTrack) {
467
470
mString = &mObj ->urlname ;
468
471
mCharBuffer = " " ;
469
472
parseModes.push (ParsingString);
@@ -472,16 +475,33 @@ bool GPXHandler::startElement(const XML_Char* qName, const XML_Char** attr) {
472
475
parseModes.push (ParsingUnknown);
473
476
}
474
477
475
- // waypoint -specific attributes
478
+ // point -specific attributes
476
479
else if (!std::strcmp (qName, " ele" )) {
477
- if (parseModes.top () == ParsingWaypoint) {
478
- mDouble = &mWpt .ele ;
480
+ if (parseModes.top () == ParsingWaypoint ||
481
+ parseModes.top () == ParsingTrackpoint) {
482
+ if (parseModes.top () == ParsingWaypoint)
483
+ mDouble = &mWpt .ele ;
484
+ else if (parseModes.top () == ParsingTrackpoint)
485
+ mDouble = &mTrkpt .ele ;
479
486
mCharBuffer = " " ;
480
487
parseModes.push (ParsingDouble);
481
488
}
482
489
else
483
490
parseModes.push (ParsingUnknown);
484
491
}
492
+ else if (!std::strcmp (qName, " time" )) {
493
+ if (parseModes.top () == ParsingWaypoint ||
494
+ parseModes.top () == ParsingTrackpoint) {
495
+ if (parseModes.top () == ParsingWaypoint)
496
+ mTime = &mWpt .time ;
497
+ else if (parseModes.top () == ParsingTrackpoint)
498
+ mTime = &mTrkpt .time ;
499
+ mCharBuffer = " " ;
500
+ parseModes.push (ParsingTimestamp);
501
+ }
502
+ else
503
+ parseModes.push (ParsingUnknown);
504
+ }
485
505
else if (!std::strcmp (qName, " sym" )) {
486
506
if (parseModes.top () == ParsingWaypoint) {
487
507
mString = &mWpt .sym ;
@@ -605,8 +625,30 @@ bool GPXHandler::endElement(const std::string& qName) {
605
625
*mString = mCharBuffer ;
606
626
mCharBuffer = " " ;
607
627
}
628
+ else if (parseModes.top () == ParsingTimestamp) {
629
+ *mTime = QDateTime ();
630
+ if (mTimezoneRegex .exactMatch (mCharBuffer ))
631
+ *mTime = QDateTime::fromString (mTimezoneRegex .cap (1 ), Qt::ISODate);
632
+ if (mTime ->isValid ()) {
633
+ QString zone = mTimezoneRegex .cap (2 );
634
+ if (zone != " Z" ) {
635
+ int sign = (zone[0 ] == ' +' ? 1 : -1 );
636
+ zone = zone.right (zone.length () - 1 );
637
+ int n = zone.find (' :' );
638
+ int h = zone.left (n).toInt ();
639
+ int m = zone.right (zone.length () - n - 1 ).toInt ();
640
+ *mTime = mTime ->addSecs (sign * (h * 3600 + m * 60 ));
641
+ }
642
+ }
643
+ else {
644
+ std::cerr<<" Found invalid date in GPX file: " <<mCharBuffer <<std::endl;
645
+ }
646
+ mCharBuffer = " " ;
647
+ }
608
648
parseModes.pop ();
609
649
610
650
return true ;
611
651
}
612
-
652
+
653
+
654
+ QRegExp GPXHandler::mTimezoneRegex (" (.*)(Z|(?:\\ +|-)\\ d+:\\ d+)" );
0 commit comments