2015-10-05 01:43:48 +02:00
|
|
|
#include "parser.h"
|
|
|
|
|
2015-10-15 01:30:21 +02:00
|
|
|
|
2016-02-08 17:53:09 +01:00
|
|
|
void Parser::handleExtensionData(QStringRef element, const QString &value)
|
2015-10-15 01:30:21 +02:00
|
|
|
{
|
|
|
|
if (element == "speed")
|
2016-02-08 17:53:09 +01:00
|
|
|
_track->last().speed = value.toDouble();
|
2016-03-21 22:37:55 +01:00
|
|
|
else if (element == "hr" || element == "heartrate")
|
|
|
|
_track->last().heartRate = value.toDouble();
|
2015-10-15 01:30:21 +02:00
|
|
|
}
|
2015-10-05 01:43:48 +02:00
|
|
|
|
2016-02-08 17:53:09 +01:00
|
|
|
void Parser::handleTrekPointData(QStringRef element, const QString &value)
|
2015-10-05 01:43:48 +02:00
|
|
|
{
|
|
|
|
if (element == "ele")
|
2016-02-08 17:53:09 +01:00
|
|
|
_track->last().elevation = value.toLatin1().toDouble();
|
2016-03-21 22:37:55 +01:00
|
|
|
else if (element == "time")
|
2016-02-08 17:53:09 +01:00
|
|
|
_track->last().timestamp = QDateTime::fromString(value.toLatin1(),
|
2015-10-05 01:43:48 +02:00
|
|
|
Qt::ISODate);
|
2016-03-21 22:37:55 +01:00
|
|
|
else if (element == "geoidheight")
|
2016-02-08 17:53:09 +01:00
|
|
|
_track->last().geoidheight = value.toLatin1().toDouble();
|
2015-10-05 01:43:48 +02:00
|
|
|
}
|
|
|
|
|
2016-02-11 20:58:52 +01:00
|
|
|
void Parser::handleWayPointData(QStringRef element, const QString &value)
|
|
|
|
{
|
|
|
|
if (element == "name")
|
|
|
|
_waypoints.last().setDescription(value);
|
|
|
|
}
|
|
|
|
|
2016-02-08 17:53:09 +01:00
|
|
|
void Parser::handleTrekPointAttributes(const QXmlStreamAttributes &attr)
|
2015-10-05 01:43:48 +02:00
|
|
|
{
|
2016-02-08 17:53:09 +01:00
|
|
|
_track->last().coordinates.setY(attr.value("lat").toLatin1().toDouble());
|
|
|
|
_track->last().coordinates.setX(attr.value("lon").toLatin1().toDouble());
|
2015-10-05 01:43:48 +02:00
|
|
|
}
|
|
|
|
|
2016-02-11 20:58:52 +01:00
|
|
|
void Parser::handleWayPointAttributes(const QXmlStreamAttributes &attr)
|
|
|
|
{
|
|
|
|
_waypoints.last().setCoordinates(QPointF(
|
|
|
|
attr.value("lon").toLatin1().toDouble(),
|
|
|
|
attr.value("lat").toLatin1().toDouble()));
|
|
|
|
}
|
2015-10-05 01:43:48 +02:00
|
|
|
|
2016-03-21 23:13:46 +01:00
|
|
|
void Parser::tpExtension()
|
|
|
|
{
|
|
|
|
while (_reader.readNextStartElement()) {
|
|
|
|
if (_reader.name() == "hr")
|
|
|
|
handleExtensionData(_reader.name(), _reader.readElementText());
|
|
|
|
else
|
|
|
|
_reader.skipCurrentElement();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-08 17:53:09 +01:00
|
|
|
void Parser::extensions()
|
2015-10-15 01:30:21 +02:00
|
|
|
{
|
|
|
|
while (_reader.readNextStartElement()) {
|
2016-03-21 22:37:55 +01:00
|
|
|
if (_reader.name() == "speed" || _reader.name() == "hr"
|
|
|
|
|| _reader.name() == "heartrate")
|
2016-02-08 17:53:09 +01:00
|
|
|
handleExtensionData(_reader.name(), _reader.readElementText());
|
2016-03-21 23:13:46 +01:00
|
|
|
else if (_reader.name() == "TrackPointExtension")
|
|
|
|
tpExtension();
|
2015-10-15 01:30:21 +02:00
|
|
|
else
|
|
|
|
_reader.skipCurrentElement();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-08 17:53:09 +01:00
|
|
|
void Parser::trackPointData()
|
2015-10-05 01:43:48 +02:00
|
|
|
{
|
|
|
|
while (_reader.readNextStartElement()) {
|
2015-10-19 00:35:08 +02:00
|
|
|
if (_reader.name() == "ele" || _reader.name() == "time"
|
|
|
|
|| _reader.name() == "geoidheight")
|
2016-02-08 17:53:09 +01:00
|
|
|
handleTrekPointData(_reader.name(), _reader.readElementText());
|
2015-10-15 01:30:21 +02:00
|
|
|
else if (_reader.name() == "extensions")
|
2016-02-08 17:53:09 +01:00
|
|
|
extensions();
|
2015-10-05 01:43:48 +02:00
|
|
|
else
|
|
|
|
_reader.skipCurrentElement();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-08 17:53:09 +01:00
|
|
|
void Parser::trackPoints()
|
2015-10-05 01:43:48 +02:00
|
|
|
{
|
|
|
|
while (_reader.readNextStartElement()) {
|
|
|
|
if (_reader.name() == "trkpt") {
|
2016-02-19 21:42:54 +01:00
|
|
|
_track->append(Trackpoint());
|
2016-02-11 20:58:52 +01:00
|
|
|
handleTrekPointAttributes(_reader.attributes());
|
2016-02-08 17:53:09 +01:00
|
|
|
trackPointData();
|
2015-10-05 01:43:48 +02:00
|
|
|
} else
|
|
|
|
_reader.skipCurrentElement();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-08 17:53:09 +01:00
|
|
|
void Parser::track()
|
2015-10-05 01:43:48 +02:00
|
|
|
{
|
|
|
|
while (_reader.readNextStartElement()) {
|
|
|
|
if (_reader.name() == "trkseg") {
|
2016-02-08 17:53:09 +01:00
|
|
|
trackPoints();
|
2015-10-05 01:43:48 +02:00
|
|
|
} else
|
|
|
|
_reader.skipCurrentElement();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-11 20:58:52 +01:00
|
|
|
void Parser::wayPointData()
|
|
|
|
{
|
|
|
|
while (_reader.readNextStartElement()) {
|
|
|
|
if (_reader.name() == "name")
|
|
|
|
handleWayPointData(_reader.name(), _reader.readElementText());
|
|
|
|
else
|
|
|
|
_reader.skipCurrentElement();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-08 17:53:09 +01:00
|
|
|
void Parser::gpx()
|
2015-10-05 01:43:48 +02:00
|
|
|
{
|
|
|
|
while (_reader.readNextStartElement()) {
|
2016-02-08 17:53:09 +01:00
|
|
|
if (_reader.name() == "trk") {
|
2016-02-19 21:42:54 +01:00
|
|
|
_tracks.append(QVector<Trackpoint>());
|
2016-02-11 20:58:52 +01:00
|
|
|
_track = &_tracks.back();
|
2016-02-08 17:53:09 +01:00
|
|
|
track();
|
2016-02-11 20:58:52 +01:00
|
|
|
} else if (_reader.name() == "wpt") {
|
2016-02-19 21:42:54 +01:00
|
|
|
_waypoints.append(Waypoint());
|
2016-02-11 20:58:52 +01:00
|
|
|
handleWayPointAttributes(_reader.attributes());
|
|
|
|
wayPointData();
|
2016-02-08 17:53:09 +01:00
|
|
|
} else
|
2015-10-05 01:43:48 +02:00
|
|
|
_reader.skipCurrentElement();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-08 17:53:09 +01:00
|
|
|
bool Parser::parse()
|
2015-10-05 01:43:48 +02:00
|
|
|
{
|
|
|
|
if (_reader.readNextStartElement()) {
|
|
|
|
if (_reader.name() == "gpx")
|
2016-02-08 17:53:09 +01:00
|
|
|
gpx();
|
2015-10-05 01:43:48 +02:00
|
|
|
else
|
2015-11-26 19:13:59 +01:00
|
|
|
_reader.raiseError("Not a GPX file.");
|
2015-10-05 01:43:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
return !_reader.error();
|
|
|
|
}
|
|
|
|
|
2016-02-11 20:58:52 +01:00
|
|
|
bool Parser::loadFile(QIODevice *device)
|
2015-10-05 01:43:48 +02:00
|
|
|
{
|
|
|
|
_reader.clear();
|
|
|
|
_reader.setDevice(device);
|
|
|
|
|
2016-02-08 17:53:09 +01:00
|
|
|
return parse();
|
2015-10-05 01:43:48 +02:00
|
|
|
}
|