-
Notifications
You must be signed in to change notification settings - Fork 0
/
gpscsv.cpp
90 lines (86 loc) · 2.51 KB
/
gpscsv.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include "gpscsv.h"
#include <QTextDecoder>
#include <stdlib.h>
GpsCsv::GpsCsv(QString filename)
: CGps(filename) {
//m_codec = QTextCodec::codecForLocale();
m_pos = 0;
m_string = "";
m_eof = false;
}
int GpsCsv::parsefile() {
QFile file(fn);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
return FileErr;
}
if (!readFile(&file)) return FileErr;
file.close();
QStringList qsl = parseLine();
int typepos, timepos, latpos, lonpos, elevpos, namepos;
typepos = qsl.indexOf("TYPE");
timepos = qsl.indexOf("TIME");
latpos = qsl.indexOf("LAT");
lonpos = qsl.indexOf("LON");
elevpos = qsl.indexOf("ALT");
namepos = qsl.indexOf("NAME");
if (typepos == -1 || timepos == -1 || latpos == -1 || lonpos == -1) return ParseErr;
double lat, lon, elev = 0;
QString name = "";
QDateTime timestamp;
while (!m_eof) {
qsl = parseLine();
if (m_eof) break;
if (qsl.at(typepos) == "P") {
timestamp = QDateTime::fromString(qsl.at(timepos), TimeDate_GPS);
lat = qsl.at(latpos).toDouble();
lon = qsl.at(lonpos).toDouble();
if (elevpos > 0) elev = qsl.at(elevpos).toDouble();
if (namepos > 0) {
name = qsl.at(namepos);
}
// TODO TYPEs
addElement(lat, lon, elev, timestamp, TrackPoint::TRACK_POINT, name);
}
}
loaded = true;
return OK;
}
bool GpsCsv::readFile(QIODevice *m_device) {
//READ DATA FROM DEVICE
if (m_device && m_device->isReadable()) {
QTextDecoder dec(QTextCodec::codecForLocale());
m_string = dec.toUnicode(m_device->readAll());
} else {
return false;
}
return true;
}
QStringList GpsCsv::parseLine() {
QStringList list;
list.clear();
bool quotes = false;
QString field;
field.clear();
QChar c;
while (m_pos < m_string.length()) {
c = m_string.at(m_pos);
if (!quotes && c == '"')
quotes = true;
else if (quotes && c == '"') {
quotes = false;
} else if (!quotes && c == ',') {
list << field;
field.clear();
} else if ((!quotes) && (c == 0x0A || c == 0x0D)) {
list << field;
field.clear();
m_pos++;
return list;
} else {
field += c;
}
m_pos++;
}
m_eof = true;
return list;
}