1 #include "common/textcodec.h"
3 #include "twonavparser.h"
6 #if QT_VERSION < QT_VERSION_CHECK(5, 14, 0)
7 #define SKIP_EMPTY QString::SkipEmptyParts
9 #define SKIP_EMPTY Qt::SkipEmptyParts
12 static double lon(const QString
&str
)
14 QStringList
l(str
.split(QChar(0xBA)));
19 double val
= l
.at(0).toDouble(&ok
);
25 else if (l
.at(1) == "E")
31 static double lat(const QString
&str
)
33 QStringList
l(str
.split(QChar(0xBA)));
38 double val
= l
.at(0).toDouble(&ok
);
44 else if (l
.at(1) == "N")
50 static QDateTime
timestamp(const QString
&dateStr
, const QString
&timeStr
)
54 QDate
date(l
.toDate(dateStr
, "dd-MMM-yy"));
56 date
= date
.addYears(100);
58 date
= l
.toDate(dateStr
, "dd-MMM-yyyy");
63 QTime
time(l
.toTime(timeStr
, "H:m:s.z"));
64 if (!time
.isValid()) {
65 time
= l
.toTime(timeStr
, "H:m:s");
70 return QDateTime(date
, time
);
73 bool TwoNavParser::parse(QFile
*file
, QList
<TrackData
> &tracks
,
74 QList
<RouteData
> &routes
, QList
<Area
> &polygons
,
75 QVector
<Waypoint
> &waypoints
)
78 TextCodec
codec(1252);
80 bool ok
, route
= false, track
= false, waypoint
= false;
86 if (file
->peek((char*)bom
, sizeof(bom
)) == sizeof(bom
)
87 && bom
[0] == 0xEF && bom
[1] == 0xBB && bom
[2] == 0xBF) {
89 codec
= TextCodec(65001);
92 while (!file
->atEnd()) {
93 QByteArray
line(file
->readLine(4096).trimmed());
100 QByteArray
encoding(line
.trimmed());
101 if (encoding
== "UTF-8")
102 codec
= TextCodec(65001);
104 _errorString
= "Invalid/unknown encoding";
110 QString
datum(line
.trimmed());
111 gcs
= GCS::gcs(datum
);
113 _errorString
= "Invalid/unknown datum";
119 QByteArray
cs(line
.trimmed());
121 _errorString
= "Invalid/unknown coordinate system";
126 {QStringList
list(codec
.toString(line
).split(' ', SKIP_EMPTY
));
127 if (list
.size() < 4) {
128 _errorString
= "Parse error";
131 Coordinates
c(lon(list
.at(3)), lat(list
.at(2)));
133 _errorString
= "Invalid coordinates";
137 Trackpoint
t(gcs
.toWGS84(c
));
139 if (list
.size() > 5) {
140 QDateTime
ts(timestamp(list
.at(4), list
.at(5)));
144 if (list
.size() > 7) {
145 qreal elevation
= list
.at(7).toDouble(&ok
);
147 _errorString
= "Invalid altitude";
150 t
.setElevation(elevation
);
154 tracks
.append(SegmentData());
158 tracks
.last().last().append(t
);}
161 {QStringList
list(codec
.toString(line
).split(' ', SKIP_EMPTY
));
162 if (list
.size() < 5) {
163 _errorString
= "Parse error";
166 Coordinates
c(lon(list
.at(4)), lat(list
.at(3)));
168 _errorString
= "Invalid coordinates";
172 Waypoint
w(gcs
.toWGS84(c
));
173 QString
name(list
.at(1));
174 w
.setName(name
.replace('_', ' ').trimmed());
176 if (list
.size() > 6) {
177 QDateTime
ts(timestamp(list
.at(5), list
.at(6)));
181 if (list
.size() > 7) {
182 qreal elevation
= list
.at(7).toDouble(&ok
);
184 _errorString
= "Invalid altitude";
187 w
.setElevation(elevation
);
190 w
.setDescription(list
.mid(8).join(' '));
193 routes
.last().append(w
);
201 QStringList
list(codec
.toString(line
).split(','));
202 if (list
.size() && waypoints
.size())
203 waypoints
.last().setSymbol(list
.at(0).trimmed());}
206 {QStringList
list(codec
.toString(line
).split(','));
207 routes
.append(RouteData());
209 routes
.last().setName(list
.at(1));
217 if (!(waypoint
| route
| track
)) {
218 _errorString
= "No valid data found";