Skip to content

Commit 0b19dda

Browse files
authored
fix bugs with gpx passthrough. (#1197)
with gpx 1.0, any extension data that was a child of rte or trk was lost. I beleive this used to work but has been broken for quite a while. with gpx 1.0 extension data that was a child of gpx could be erroneously rewritten as part of the final wpt/rtept/trkpt. with gpx 1.1 extension data that was a chile of trkseg could be erroneously rewritten as part of the final wpt/rtept/trkpt. I note we currently drop any extension data that is a child of gpx, ,a child of trkseg, or a child of metadata.
1 parent c668916 commit 0b19dda

File tree

8 files changed

+357
-42
lines changed

8 files changed

+357
-42
lines changed

gpx.cc

Lines changed: 52 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ GpxFormat::gpx_end(QStringView /*unused*/)
522522
logpoint_ct = 0;
523523
cur_tag = nullptr;
524524
wpt_tmp = nullptr;
525+
fs_ptr = nullptr;
525526
break;
526527
case tt_cache_name:
527528
wpt_tmp->notes = cdatastr;
@@ -616,6 +617,7 @@ GpxFormat::gpx_end(QStringView /*unused*/)
616617
delete rh_link_;
617618
rh_link_ = nullptr;
618619
}
620+
fs_ptr = nullptr;
619621
break;
620622
case tt_rte_rtept:
621623
if (link_) {
@@ -631,6 +633,7 @@ GpxFormat::gpx_end(QStringView /*unused*/)
631633
}
632634
route_add_wpt(rte_head, wpt_tmp);
633635
wpt_tmp = nullptr;
636+
fs_ptr = nullptr;
634637
break;
635638
case tt_rte_desc:
636639
rte_head->rte_desc = cdatastr;
@@ -661,9 +664,11 @@ GpxFormat::gpx_end(QStringView /*unused*/)
661664
delete rh_link_;
662665
rh_link_ = nullptr;
663666
}
667+
fs_ptr = nullptr;
664668
break;
665669
case tt_trk_trkseg:
666670
next_trkpt_is_new_seg = 1;
671+
fs_ptr = nullptr;
667672
break;
668673
case tt_trk_trkseg_trkpt:
669674
if (link_) {
@@ -679,6 +684,7 @@ GpxFormat::gpx_end(QStringView /*unused*/)
679684
}
680685
track_add_wpt(trk_head, wpt_tmp);
681686
wpt_tmp = nullptr;
687+
fs_ptr = nullptr;
682688
break;
683689
case tt_trk_desc:
684690
trk_head->rte_desc = cdatastr;
@@ -920,7 +926,7 @@ GpxFormat::wr_init(const QString& fname)
920926
// normalization makes them null.
921927
if (gpx_write_version.isNull() || (gpx_write_version < gpx_1_0)) {
922928
fatal(FatalMsg() << MYNAME ": gpx version number"
923-
<< gpx_write_version << "not valid.");
929+
<< gpx_write_version << "not valid.");
924930
}
925931

926932
writer->setAutoFormatting(true);
@@ -1092,9 +1098,9 @@ GpxFormat::read()
10921098

10931099
if (reader->hasError()) {
10941100
fatal(FatalMsg() << MYNAME << "Read error:" << reader->errorString()
1095-
<< "File:" << iqfile->fileName()
1096-
<< "Line:" << reader->lineNumber()
1097-
<< "Column:" << reader->columnNumber());
1101+
<< "File:" << iqfile->fileName()
1102+
<< "Line:" << reader->lineNumber()
1103+
<< "Column:" << reader->columnNumber());
10981104
}
10991105
}
11001106

@@ -1369,7 +1375,7 @@ void GpxFormat::gpx_write_common_core(const Waypoint* waypointp,
13691375
const gpx_point_type point_type) const
13701376
{
13711377
const auto* fs_gpxwpt = reinterpret_cast<gpx_wpt_fsdata*>(waypointp->fs.FsChainFind(kFsGpxWpt));
1372-
1378+
13731379
gpx_write_common_position(waypointp, point_type, fs_gpxwpt);
13741380
gpx_write_common_description(waypointp, point_type, fs_gpxwpt);
13751381
gpx_write_common_acc(waypointp, fs_gpxwpt);
@@ -1389,7 +1395,15 @@ GpxFormat::gpx_waypt_pr(const Waypoint* waypointp) const
13891395
auto* gmsd = garmin_fs_t::find(waypointp); /* gARmIN sPECIAL dATA */
13901396
if (fs_gpx) {
13911397
if (! gmsd) {
1392-
fprint_xml_chain(fs_gpx->tag);
1398+
if (fs_gpx->tag) {
1399+
if (gpx_write_version > gpx_1_0) {
1400+
writer->writeStartElement("extensions");
1401+
}
1402+
fprint_xml_chain(fs_gpx->tag);
1403+
if (gpx_write_version > gpx_1_0) {
1404+
writer->writeEndElement();
1405+
}
1406+
}
13931407
}
13941408
}
13951409
if (gmsd && (gpx_write_version > gpx_1_0)) {
@@ -1416,23 +1430,21 @@ GpxFormat::gpx_track_hdr(const route_head* rte)
14161430
writer->writeTextElement(QStringLiteral("number"), QString::number(rte->rte_num));
14171431
}
14181432

1419-
if (gpx_write_version > gpx_1_0) {
1420-
if (!(opt_humminbirdext || opt_garminext)) {
1421-
const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
1422-
if (fs_gpx) {
1423-
fprint_xml_chain(fs_gpx->tag);
1424-
}
1425-
} else if (opt_garminext) {
1426-
if (rte->line_color.bbggrr > unknown_color) {
1427-
int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
1428-
if (ci > 0) {
1429-
writer->writeStartElement(QStringLiteral("extensions"));
1430-
writer->writeStartElement(QStringLiteral("gpxx:TrackExtension"));
1431-
writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
1432-
.arg(gt_color_name(ci)));
1433-
writer->writeEndElement(); // Close gpxx:TrackExtension tag
1434-
writer->writeEndElement(); // Close extensions tag
1435-
}
1433+
if (!(opt_humminbirdext || opt_garminext)) {
1434+
const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
1435+
if (fs_gpx) {
1436+
fprint_xml_chain(fs_gpx->tag);
1437+
}
1438+
} else if (opt_garminext && (gpx_write_version > gpx_1_0)) {
1439+
if (rte->line_color.bbggrr > unknown_color) {
1440+
int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
1441+
if (ci > 0) {
1442+
writer->writeStartElement(QStringLiteral("extensions"));
1443+
writer->writeStartElement(QStringLiteral("gpxx:TrackExtension"));
1444+
writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
1445+
.arg(gt_color_name(ci)));
1446+
writer->writeEndElement(); // Close gpxx:TrackExtension tag
1447+
writer->writeEndElement(); // Close extensions tag
14361448
}
14371449
}
14381450
}
@@ -1506,25 +1518,23 @@ GpxFormat::gpx_route_hdr(const route_head* rte) const
15061518
writer->writeTextElement(QStringLiteral("number"), QString::number(rte->rte_num));
15071519
}
15081520

1509-
if (gpx_write_version > gpx_1_0) {
1510-
if (!(opt_humminbirdext || opt_garminext)) {
1511-
const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
1512-
if (fs_gpx) {
1513-
fprint_xml_chain(fs_gpx->tag);
1514-
}
1515-
} else if (opt_garminext) {
1516-
if (rte->line_color.bbggrr > unknown_color) {
1517-
int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
1518-
if (ci > 0) {
1519-
writer->writeStartElement(QStringLiteral("extensions"));
1520-
writer->writeStartElement(QStringLiteral("gpxx:RouteExtension"));
1521-
// FIXME: the value to use for IsAutoNamed is questionable.
1522-
writer->writeTextElement(QStringLiteral("gpxx:IsAutoNamed"), rte->rte_name.isEmpty()? QStringLiteral("true") : QStringLiteral("false")); // Required element
1523-
writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
1524-
.arg(gt_color_name(ci)));
1525-
writer->writeEndElement(); // Close gpxx:RouteExtension tag
1526-
writer->writeEndElement(); // Close extensions tag
1527-
}
1521+
if (!(opt_humminbirdext || opt_garminext)) {
1522+
const auto* fs_gpx = reinterpret_cast<fs_xml*>(rte->fs.FsChainFind(kFsGpx));
1523+
if (fs_gpx) {
1524+
fprint_xml_chain(fs_gpx->tag);
1525+
}
1526+
} else if (opt_garminext && (gpx_write_version > gpx_1_0)) {
1527+
if (rte->line_color.bbggrr > unknown_color) {
1528+
int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
1529+
if (ci > 0) {
1530+
writer->writeStartElement(QStringLiteral("extensions"));
1531+
writer->writeStartElement(QStringLiteral("gpxx:RouteExtension"));
1532+
// FIXME: the value to use for IsAutoNamed is questionable.
1533+
writer->writeTextElement(QStringLiteral("gpxx:IsAutoNamed"), rte->rte_name.isEmpty()? QStringLiteral("true") : QStringLiteral("false")); // Required element
1534+
writer->writeTextElement(QStringLiteral("gpxx:DisplayColor"), QStringLiteral("%1")
1535+
.arg(gt_color_name(ci)));
1536+
writer->writeEndElement(); // Close gpxx:RouteExtension tag
1537+
writer->writeEndElement(); // Close extensions tag
15281538
}
15291539
}
15301540
}

reference/gpxpassthrough10.gpx

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/0" xmlns:foreign="http://www.gpsbabel.org/testonlyschema" version="1.0" creator="hand crafted" xsi:schemaLocation="http://www.topografix.com/GPX/1/0 http://www.topografix.com/GPX/1/0/gpx.xsd">
3+
<time>2010-10-16T14:27:17Z</time>
4+
<wpt lat="36.339560000" lon="-117.422570000">
5+
<ele>479.300</ele>
6+
<name>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</name>
7+
<cmt>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</cmt>
8+
<desc>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</desc>
9+
</wpt>
10+
<wpt lat="36.460850000" lon="-116.865460000">
11+
<ele>-55.600</ele>
12+
<name>Turn right at Airport Rd</name>
13+
<cmt>Turn right at Airport Rd</cmt>
14+
<desc>Turn right at Airport Rd</desc>
15+
<foreign:something>wpt</foreign:something>
16+
</wpt>
17+
<wpt lat="36.463640000" lon="-116.879200000">
18+
<ele>-67.300</ele>
19+
<name>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</name>
20+
<cmt>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</cmt>
21+
<desc>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</desc>
22+
</wpt>
23+
<rte>
24+
<name>Low Road</name>
25+
<desc>Generated from track Route</desc>
26+
<foreign:something>rte</foreign:something>
27+
<rtept lat="36.339560000" lon="-117.422570000">
28+
<ele>479.300</ele>
29+
<name>RPT001</name>
30+
</rtept>
31+
<rtept lat="36.345010000" lon="-117.354270000">
32+
<ele>624.300</ele>
33+
<name>RPT005</name>
34+
<foreign:something>rtept</foreign:something>
35+
</rtept>
36+
<rtept lat="36.344640000" lon="-117.349030000">
37+
<ele>663.700</ele>
38+
<name>RPT011</name>
39+
</rtept>
40+
</rte>
41+
<trk>
42+
<name>meridian</name>
43+
<foreign:something>trk</foreign:something>
44+
<trkseg>
45+
<trkpt lat="30.062183333" lon="-91.610350000">
46+
<ele>1.000</ele>
47+
<time>2002-05-25T17:06:21.250Z</time>
48+
</trkpt>
49+
<trkpt lat="30.062783333" lon="-91.610566667">
50+
<ele>0.000</ele>
51+
<time>2002-05-25T17:09:55.190Z</time>
52+
<foreign:something>trkpt</foreign:something>
53+
</trkpt>
54+
<trkpt lat="30.062700000" lon="-91.608266667">
55+
<ele>0.000</ele>
56+
<time>2002-05-25T17:12:00.200Z</time>
57+
</trkpt>
58+
</trkseg>
59+
</trk>
60+
<foreign:something>eof</foreign:something>
61+
</gpx>

reference/gpxpassthrough10~gpx.gpx

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<gpx version="1.0" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:foreign="http://www.gpsbabel.org/testonlyschema">
3+
<time>1970-01-01T00:00:00Z</time>
4+
<bounds minlat="30.062183333" minlon="-117.422570000" maxlat="36.463640000" maxlon="-91.608266667"/>
5+
<wpt lat="36.339560000" lon="-117.422570000">
6+
<ele>479.300</ele>
7+
<name>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</name>
8+
<cmt>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</cmt>
9+
<desc>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</desc>
10+
</wpt>
11+
<wpt lat="36.460850000" lon="-116.865460000">
12+
<ele>-55.600</ele>
13+
<name>Turn right at Airport Rd</name>
14+
<cmt>Turn right at Airport Rd</cmt>
15+
<desc>Turn right at Airport Rd</desc>
16+
<foreign:something>wpt</foreign:something>
17+
</wpt>
18+
<wpt lat="36.463640000" lon="-116.879200000">
19+
<ele>-67.300</ele>
20+
<name>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</name>
21+
<cmt>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</cmt>
22+
<desc>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</desc>
23+
</wpt>
24+
<rte>
25+
<name>Low Road</name>
26+
<desc>Generated from track Route</desc>
27+
<foreign:something>rte</foreign:something>
28+
<rtept lat="36.339560000" lon="-117.422570000">
29+
<ele>479.300</ele>
30+
<name>RPT001</name>
31+
</rtept>
32+
<rtept lat="36.345010000" lon="-117.354270000">
33+
<ele>624.300</ele>
34+
<name>RPT005</name>
35+
<foreign:something>rtept</foreign:something>
36+
</rtept>
37+
<rtept lat="36.344640000" lon="-117.349030000">
38+
<ele>663.700</ele>
39+
<name>RPT011</name>
40+
</rtept>
41+
</rte>
42+
<trk>
43+
<name>meridian</name>
44+
<foreign:something>trk</foreign:something>
45+
<trkseg>
46+
<trkpt lat="30.062183333" lon="-91.610350000">
47+
<ele>1.000</ele>
48+
<time>2002-05-25T17:06:21.250Z</time>
49+
</trkpt>
50+
<trkpt lat="30.062783333" lon="-91.610566667">
51+
<ele>0.000</ele>
52+
<time>2002-05-25T17:09:55.190Z</time>
53+
<foreign:something>trkpt</foreign:something>
54+
</trkpt>
55+
<trkpt lat="30.062700000" lon="-91.608266667">
56+
<ele>0.000</ele>
57+
<time>2002-05-25T17:12:00.200Z</time>
58+
</trkpt>
59+
</trkseg>
60+
</trk>
61+
</gpx>

reference/gpxpassthrough11.gpx

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<gpx xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.topografix.com/GPX/1/1" xmlns:foreign="http://www.gpsbabel.org/testonlyschema" version="1.1" creator="hand crafted" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd">
3+
<metadata>
4+
<time>2010-10-16T14:27:17Z</time>
5+
<extensions>
6+
<foreign:something>metadata</foreign:something>
7+
</extensions>
8+
</metadata>
9+
<wpt lat="36.339560000" lon="-117.422570000">
10+
<ele>479.300</ele>
11+
<name>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</name>
12+
<cmt>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</cmt>
13+
<desc>Head east on CA-190 E/Nadeau Trail Continue to follow CA-190 E</desc>
14+
</wpt>
15+
<wpt lat="36.460850000" lon="-116.865460000">
16+
<ele>-55.600</ele>
17+
<name>Turn right at Airport Rd</name>
18+
<cmt>Turn right at Airport Rd</cmt>
19+
<desc>Turn right at Airport Rd</desc>
20+
<extensions>
21+
<foreign:something>wpt</foreign:something>
22+
</extensions>
23+
</wpt>
24+
<wpt lat="36.463640000" lon="-116.879200000">
25+
<ele>-67.300</ele>
26+
<name>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</name>
27+
<cmt>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</cmt>
28+
<desc>Arrive at: Furnace Creek Airport-L06, Death Valley National Park, Death Valley, CA 92328</desc>
29+
</wpt>
30+
<rte>
31+
<name>Low Road</name>
32+
<desc>Generated from track Route</desc>
33+
<extensions>
34+
<foreign:something>rte</foreign:something>
35+
</extensions>
36+
<rtept lat="36.339560000" lon="-117.422570000">
37+
<ele>479.300</ele>
38+
<name>RPT001</name>
39+
</rtept>
40+
<rtept lat="36.345010000" lon="-117.354270000">
41+
<ele>624.300</ele>
42+
<name>RPT005</name>
43+
<extensions>
44+
<foreign:something>rtept</foreign:something>
45+
</extensions>
46+
</rtept>
47+
<rtept lat="36.344640000" lon="-117.349030000">
48+
<ele>663.700</ele>
49+
<name>RPT011</name>
50+
</rtept>
51+
</rte>
52+
<trk>
53+
<name>meridian</name>
54+
<extensions>
55+
<foreign:something>trk</foreign:something>
56+
</extensions>
57+
<trkseg>
58+
<trkpt lat="30.062183333" lon="-91.610350000">
59+
<ele>1.000</ele>
60+
<time>2002-05-25T17:06:21.250Z</time>
61+
</trkpt>
62+
<trkpt lat="30.062783333" lon="-91.610566667">
63+
<ele>0.000</ele>
64+
<time>2002-05-25T17:09:55.190Z</time>
65+
<extensions>
66+
<foreign:something>trkpt</foreign:something>
67+
</extensions>
68+
</trkpt>
69+
<trkpt lat="30.062700000" lon="-91.608266667">
70+
<ele>0.000</ele>
71+
<time>2002-05-25T17:12:00.200Z</time>
72+
</trkpt>
73+
<extensions>
74+
<foreign:something>trkseg</foreign:something>
75+
</extensions>
76+
</trkseg>
77+
</trk>
78+
<extensions>
79+
<foreign:something>eof</foreign:something>
80+
</extensions>
81+
</gpx>

0 commit comments

Comments
 (0)