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