6 #include <QXmlStreamReader>
8 uint qHash(const QPoint& p)
10 return p.x() * 17 ^ p.y();
14 qreal max(qreal a, qreal b){
22 qreal min(qreal a, qreal b){
30 QString stringDateFromSeconds(qreal amount){
34 int hours = static_cast<int>(amount/3600);
35 int minutes = static_cast<int>((static_cast<int>(amount)%3600)/60);
36 int seconds = (static_cast<int>(amount)%3600)%60;
38 QString dateString=QString("%1h %2m %3s").arg(hours).arg(minutes).arg(seconds);
40 //qDebug()<<"amount " << amount << " seconds has been transformated to:" << dateString;
44 qreal toRad(qreal degrees){
45 qreal radians = degrees*PI/180;
49 Track* readFromXML(QString fileName){
51 // I need this function to work by now, When I've time I've to make it proper
52 // It doesn't work with no valid XML files!!!
54 QFile* file= new QFile(fileName);
57 qDebug() << "going to read file:" << fileName;
59 Track* myTrack = new Track();
60 myTrack->addActivity("doesn'tmatter");
62 if (!file->open(QIODevice::ReadOnly | QIODevice::Text)) {
63 qDebug() << "Error: Cannot read file "
64 << qPrintable(fileName) << ": "
65 << qPrintable(file->errorString());
71 if(fileName.endsWith(".tcx",Qt::CaseInsensitive)){
73 }else if(fileName.endsWith(".gpx",Qt::CaseInsensitive)){
76 qDebug()<<"Error: XML not recognized. " << "nameFile:" << fileName;
79 QXmlStreamReader xml(file);
81 while (!xml.atEnd() && !xml.hasError()) {
83 /* Read next element.*/
84 QXmlStreamReader::TokenType token = xml.readNext();
85 /* If token is just StartDocument, we'll go to next.*/
86 if(token == QXmlStreamReader::StartDocument) {
89 /* If token is StartElement, we'll see if we can read it.*/
90 if(token == QXmlStreamReader::StartElement) {
91 // just read Positions, dont care about nothing more...
92 // this means, all activities, laps or track sequences are
93 // processed as a single one!
95 if(fileType==XMLFile_GPX){
96 if(xml.name() == "trkpt") {
97 GpsPoint* point = parseGPXGpsPoint(xml);
98 //qDebug()<<"adding point: " << point->toString();
99 myTrack->addPoint(point);
103 }else if(fileType==XMLFile_TCX){
104 if(xml.name() == "Trackpoint") {
105 GpsPoint* point = parseTCXGpsPoint(xml);
106 //qDebug()<<"adding point: " << point->toString();
107 myTrack->addPoint(point);
113 if(xml.name()=="name"){
114 myTrack->setName(parseStringElement(xml,"name"));
117 if(xml.name()=="Activity" && !nameFound){
119 myTrack->setName(parseAttribute(xml,"Activity","Sport"));
124 /* Error handling. */
126 qDebug() << "Error: in readFromXML "
127 << qPrintable(fileName) << ": "
128 << qPrintable(file->errorString());
130 /* Removes any device() or data from the reader
131 * and resets its internal state to the initial state. */
132 qDebug()<<"clearing xml!";
134 qDebug() << "going to return myTrack";
138 qreal parseDoubleAttribute(QXmlStreamReader& xml, const char* stringElement, const char* stringAttribute){
139 QString sValue = parseAttribute(xml,stringElement,stringAttribute);
140 return sValue.toDouble();
143 QString parseAttribute(QXmlStreamReader& xml, const char* stringElement, const char* stringAttribute){
145 QString value = QString();
146 if(xml.tokenType() == QXmlStreamReader::StartElement && (xml.name() == stringElement)) {
147 // Let's get the attributes
148 QXmlStreamAttributes attributes = xml.attributes();
149 // Let's check that element has the attribute
150 if(attributes.hasAttribute(stringAttribute)) {
151 value.append(attributes.value(stringAttribute).toString());
157 QString parseStringElement(QXmlStreamReader& xml,const char* stringElement){
159 // It is suposed the XML is valid!
160 QString value = QString();
161 if(xml.tokenType() == QXmlStreamReader::StartElement && (xml.name() == stringElement)) {
162 /* We've found the element */
165 if(xml.tokenType() == QXmlStreamReader::Characters) {
167 value.append(xml.text().toString());
173 qreal parseDoubleElement(QXmlStreamReader& xml,const char* stringElement){
174 // It is suposed the XML is valid!
176 if(xml.tokenType() == QXmlStreamReader::StartElement && (xml.name() == stringElement)) {
177 /* We've found the element */
180 if(xml.tokenType() == QXmlStreamReader::Characters) {
181 /* Now we can add it to the point.*/
182 QString valueString = xml.text().toString();
183 value=valueString.toDouble();
189 QDateTime parseDateElement(QXmlStreamReader& xml,const char* stringElement){
190 // It is suposed the XML is valid!
192 if(xml.tokenType() == QXmlStreamReader::StartElement && (xml.name() == stringElement)) {
193 /* We've found the element */
196 if(xml.tokenType() == QXmlStreamReader::Characters) {
197 /* Now we can add it to the point.*/
198 QString valueString = xml.text().toString();
199 value = QDateTime::fromString(valueString,XML_DATE_FORMAT);
206 GpsPoint* parseGPXGpsPoint(QXmlStreamReader& xml){
207 GpsPoint* point = new GpsPoint(0,0,0);
208 /* Let's check that we're really getting a Trackpoint. */
209 if(xml.tokenType() != QXmlStreamReader::StartElement &&
210 xml.name() == "trkpt") {
213 // Let's take latitude and longitude attributes.
215 point->setLatitude(parseDoubleAttribute(xml,"trkpt","lat"));
216 point->setLongitude(parseDoubleAttribute(xml,"trkpt","lon"));
220 while(!(xml.tokenType() == QXmlStreamReader::EndElement &&
221 xml.name() == "trkpt")){
223 if(xml.tokenType() == QXmlStreamReader::StartElement) {
225 if(xml.name() == "ele"){
226 //qDebug()<<"found ele element";
227 point->setElevation(parseDoubleElement(xml,"ele"));
229 if(xml.name() == "time"){
230 point->setTime(parseDateElement(xml,"time"));
231 //qDebug()<<"found Trackpoint element";
239 GpsPoint* parseTCXGpsPoint(QXmlStreamReader& xml){
241 GpsPoint* point = new GpsPoint(0,0,0);
242 /* Let's check that we're really getting a Trackpoint. */
243 if(xml.tokenType() != QXmlStreamReader::StartElement &&
244 xml.name() == "Trackpoint") {
250 while(!(xml.tokenType() == QXmlStreamReader::EndElement &&
251 xml.name() == "Trackpoint")){
253 if(xml.tokenType() == QXmlStreamReader::StartElement) {
255 if(xml.name() == "Time"){
256 //qDebug()<<"found Time element";
257 point->setTime(parseDateElement(xml,"Time"));
259 if(xml.name() == "Position"){
260 //qDebug()<<"found Position element";
262 while(!(xml.tokenType() == QXmlStreamReader::EndElement &&
263 xml.name() == "Position")){
264 if(xml.tokenType()==QXmlStreamReader::StartElement && xml.name() == "LongitudeDegrees"){
265 //qDebug()<<"found LongitudeDegrees element";
266 point->setLongitude(parseDoubleElement(xml,"LongitudeDegrees"));
267 }if(xml.tokenType()==QXmlStreamReader::StartElement && xml.name() == "LatitudeDegrees"){
268 //qDebug()<<"found LatitudeDegrees element";
269 point->setLatitude(parseDoubleElement(xml,"LatitudeDegrees"));
272 //qDebug()<<"element readed: " << xml.name();
275 if(xml.tokenType()==QXmlStreamReader::StartElement && xml.name() == "AltitudeMeters"){
276 point->setElevation(parseDoubleElement(xml,"AltitudeMeters"));
277 //qDebug()<<"found Trackpoint element";
279 if(xml.tokenType()==QXmlStreamReader::StartElement && xml.name() == "DistanceMeters"){
280 point->setDistancePrev(parseDoubleElement(xml,"DistanceMeters"));
281 //qDebug()<<"found Trackpoint element";