Use the real file names for suffix extraction on Android
[GPXSee.git] / src / data / data.cpp
blob5d513febdbb179a14cf843b159a0f8b91b55fbb8
1 #include <QApplication>
2 #include <QFile>
3 #include <QFileInfo>
4 #include "common/util.h"
5 #include "gpxparser.h"
6 #include "tcxparser.h"
7 #include "csvparser.h"
8 #include "kmlparser.h"
9 #include "fitparser.h"
10 #include "igcparser.h"
11 #include "nmeaparser.h"
12 #include "oziparsers.h"
13 #include "locparser.h"
14 #include "slfparser.h"
15 #include "geojsonparser.h"
16 #include "exifparser.h"
17 #include "cupparser.h"
18 #include "gpiparser.h"
19 #include "smlparser.h"
20 #include "ov2parser.h"
21 #include "itnparser.h"
22 #include "onmoveparsers.h"
23 #include "twonavparser.h"
24 #include "data.h"
27 static GPXParser gpx;
28 static TCXParser tcx;
29 static KMLParser kml;
30 static FITParser fit;
31 static CSVParser csv;
32 static IGCParser igc;
33 static NMEAParser nmea;
34 static PLTParser plt;
35 static WPTParser wpt;
36 static RTEParser rte;
37 static LOCParser loc;
38 static SLFParser slf;
39 static GeoJSONParser geojson;
40 static EXIFParser exif;
41 static CUPParser cup;
42 static GPIParser gpi;
43 static SMLParser sml;
44 static OV2Parser ov2;
45 static ITNParser itn;
46 static OMDParser omd;
47 static GHPParser ghp;
48 static TwoNavParser twonav;
50 static QMultiMap<QString, Parser*> parsers()
52 QMultiMap<QString, Parser*> map;
54 map.insert("gpx", &gpx);
55 map.insert("tcx", &tcx);
56 map.insert("kml", &kml);
57 map.insert("kmz", &kml);
58 map.insert("fit", &fit);
59 map.insert("csv", &csv);
60 map.insert("igc", &igc);
61 map.insert("nmea", &nmea);
62 map.insert("plt", &plt);
63 map.insert("wpt", &wpt);
64 map.insert("rte", &rte);
65 map.insert("loc", &loc);
66 map.insert("slf", &slf);
67 map.insert("json", &geojson);
68 map.insert("geojson", &geojson);
69 map.insert("jpeg", &exif);
70 map.insert("jpg", &exif);
71 map.insert("cup", &cup);
72 map.insert("gpi", &gpi);
73 map.insert("sml", &sml);
74 map.insert("ov2", &ov2);
75 map.insert("itn", &itn);
76 map.insert("omd", &omd);
77 map.insert("ghp", &ghp);
78 map.insert("trk", &twonav);
79 map.insert("rte", &twonav);
80 map.insert("wpt", &twonav);
82 return map;
85 QMultiMap<QString, Parser*> Data::_parsers = parsers();
87 void Data::processData(QList<TrackData> &trackData, QList<RouteData> &routeData)
89 for (int i = 0; i < trackData.count(); i++)
90 _tracks.append(Track(trackData.at(i)));
91 for (int i = 0; i < routeData.count(); i++)
92 _routes.append(Route(routeData.at(i)));
95 Data::Data(const QString &fileName, bool tryUnknown)
97 QFile file(fileName);
98 QFileInfo fi(Util::displayName(fileName));
99 QList<TrackData> trackData;
100 QList<RouteData> routeData;
102 _valid = false;
103 _errorLine = 0;
105 if (!file.open(QFile::ReadOnly)) {
106 _errorString = qPrintable(file.errorString());
107 return;
110 QMultiMap<QString, Parser*>::iterator it;
111 QString suffix(fi.suffix().toLower());
112 if ((it = _parsers.find(suffix)) != _parsers.end()) {
113 while (it != _parsers.end() && it.key() == suffix) {
114 if (it.value()->parse(&file, trackData, routeData, _polygons,
115 _waypoints)) {
116 processData(trackData, routeData);
117 _valid = true;
118 return;
119 } else {
120 _errorLine = it.value()->errorLine();
121 _errorString = it.value()->errorString();
123 file.reset();
124 ++it;
127 qWarning("%s:", qPrintable(fileName));
128 for (it = _parsers.find(suffix); it != _parsers.end()
129 && it.key() == suffix; it++)
130 qWarning(" %s: line %d: %s", qPrintable(it.key()),
131 it.value()->errorLine(), qPrintable(it.value()->errorString()));
133 } else if (tryUnknown) {
134 for (it = _parsers.begin(); it != _parsers.end(); it++) {
135 if (it.value()->parse(&file, trackData, routeData, _polygons,
136 _waypoints)) {
137 processData(trackData, routeData);
138 _valid = true;
139 return;
141 file.reset();
144 qWarning("%s:", qPrintable(fileName));
145 for (it = _parsers.begin(); it != _parsers.end(); it++)
146 qWarning(" %s: line %d: %s", qPrintable(it.key()),
147 it.value()->errorLine(), qPrintable(it.value()->errorString()));
149 _errorLine = 0;
150 _errorString = "Unknown format";
154 QString Data::formats()
156 return
157 qApp->translate("Data", "Supported files") + " (" + filter().join(" ") + ");;"
158 + qApp->translate("Data", "CSV files") + " (*.csv);;"
159 + qApp->translate("Data", "CUP files") + " (*.cup);;"
160 + qApp->translate("Data", "FIT files") + " (*.fit);;"
161 + qApp->translate("Data", "GeoJSON files") + " (*.geojson *.json);;"
162 + qApp->translate("Data", "GPI files") + " (*.gpi);;"
163 + qApp->translate("Data", "GPX files") + " (*.gpx);;"
164 + qApp->translate("Data", "IGC files") + " (*.igc);;"
165 + qApp->translate("Data", "ITN files") + " (*.itn);;"
166 + qApp->translate("Data", "JPEG images") + " (*.jpg *.jpeg);;"
167 + qApp->translate("Data", "KML files") + " (*.kml *.kmz);;"
168 + qApp->translate("Data", "LOC files") + " (*.loc);;"
169 + qApp->translate("Data", "NMEA files") + " (*.nmea);;"
170 + qApp->translate("Data", "ONmove files") + " (*.omd *.ghp);;"
171 + qApp->translate("Data", "OV2 files") + " (*.ov2);;"
172 + qApp->translate("Data", "OziExplorer files") + " (*.plt *.rte *.wpt);;"
173 + qApp->translate("Data", "SLF files") + " (*.slf);;"
174 + qApp->translate("Data", "SML files") + " (*.sml);;"
175 + qApp->translate("Data", "TCX files") + " (*.tcx);;"
176 + qApp->translate("Data", "TwoNav files") + " (*.rte *.trk *.wpt);;"
177 + qApp->translate("Data", "All files") + " (*)";
180 QStringList Data::filter()
182 QStringList filter;
183 QString last;
185 for (QMultiMap<QString, Parser*>::iterator it = _parsers.begin();
186 it != _parsers.end(); it++) {
187 if (it.key() != last)
188 filter << "*." + it.key();
189 last = it.key();
192 return filter;