Read also pos from the stations.qpl file
[quandoparte] / application / stationlistmodel.cpp
1 #include "stationlistmodel.h"
2
3 #include <QFile>
4 #include <QDebug>
5 #include <QStandardItem>
6 #include <QGeoCoordinate>
7
8 QTM_USE_NAMESPACE
9 Q_DECLARE_METATYPE(QGeoCoordinate)
10
11 StationListModel::StationListModel(QObject *parent) :
12     QStandardItemModel(parent)
13
14 {
15     setRowCount(0);
16 }
17
18 bool StationListModel::load(const QString &filename)
19 {
20     QFile file(filename);
21
22     qDebug() << "loading filename:" << filename;
23
24     if (!file.open(QFile::ReadOnly | QFile::Text)) {
25         qDebug() << "cannot open file:" << filename;
26         return false;
27     }
28     reader.setDevice(&file);
29     reader.readNext();
30     while (!reader.atEnd()) {
31         if (reader.isStartElement()) {
32             if(reader.name() == "stations") {
33                 readStationsElement();
34             } else {
35                 reader.raiseError(tr("Not a qpl file"));
36             }
37         } else {
38             reader.readNext();
39         }
40     }
41     file.close();
42     if (reader.hasError()) {
43         qDebug() << "parser error for:" << filename;
44         return false;
45     } else if (file.error() != QFile::NoError) {
46         qDebug() << "file error for:" << filename;
47         return false;
48     }
49     return true;
50 }
51
52 void StationListModel::readStationsElement()
53 {
54     qDebug() << "reading stations element";
55
56     reader.readNext();
57     while (!reader.atEnd()) {
58         if (reader.isEndElement()) {
59             reader.readNext();
60             break;
61         } else if (reader.isStartElement()) {
62             if (reader.name() == "station") {
63                 readStationElement();
64             } else {
65                 skipUnknownElement();
66             }
67         } else {
68             reader.readNext();
69         }
70     }
71 }
72
73 void StationListModel::readStationElement()
74 {
75     qDebug() << "reading station element";
76
77     QStandardItem *item = new QStandardItem;
78     reader.readNext();
79     while (!reader.atEnd()) {
80         if (reader.isEndElement()) {
81             this->appendRow(item);
82             reader.readNext();
83             break;
84         } else if (reader.isStartElement()) {
85             if (reader.name() == "pos") {
86                 readPosElement(item);
87             } else  if (reader.name() == "name") {
88                 readNameElement(item);
89             } else {
90                 skipUnknownElement();
91             }
92         } else {
93             reader.readNext();
94         }
95     }
96 }
97
98 void StationListModel::readPosElement(QStandardItem *item)
99 {
100     qDebug() << "reading pos element";
101
102     QStringList coordinates = reader.readElementText().split(",");
103     QGeoCoordinate pos = QGeoCoordinate(coordinates[0].toDouble(), coordinates[1].toDouble());
104     item->setData(QVariant::fromValue(pos));
105     qDebug() << "pos:" << pos;
106     reader.readElementText();
107     if (reader.isEndElement()) {
108         reader.readNext();
109     }
110 }
111
112 void StationListModel::readNameElement(QStandardItem *item)
113 {
114     qDebug() << "reading name element";
115
116     item->setText(reader.readElementText());
117     qDebug() << "name:" << item->text();
118     if (reader.isEndElement()) {
119         reader.readNext();
120     }
121 }
122
123 void StationListModel::skipUnknownElement()
124 {
125     qDebug() << "skipping unknown element";
126
127     reader.readNext();
128     while (!reader.atEnd()) {
129         if (reader.isEndElement()) {
130             reader.readNext();
131             break;
132         } else if (!reader.isStartElement()) {
133             skipUnknownElement();
134         } else {
135             reader.readNext();
136         }
137     }
138 }