~ubuntu-clock-dev/ubuntu-clock-app/reboot-packaging

« back to all changes in this revision

Viewing changes to backend/modules/Timezone/xmltimezonemodel.cpp

  • Committer: Nekhelesh Ramananthan
  • Date: 2014-07-15 12:50:49 UTC
  • mfrom: (20.1.24 10-world-clocks)
  • Revision ID: krnekhelesh@gmail.com-20140715125049-hhsn7hpe6tqrn3vz
- Added a page to select world cities. It provides search as you type using the new SDK SortFilterModel feature.
- Added a XML file with a list of popular cities.
- The local time at the cities are retrieved using QTimezone and QDateTime classes and used via a QAbstractListModel to automatically update the city list every second.

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * Copyright (C) 2014 Canonical Ltd
 
3
 *
 
4
 * This program is free software: you can redistribute it and/or modify
 
5
 * it under the terms of the GNU General Public License version 3 as
 
6
 * published by the Free Software Foundation.
 
7
 *
 
8
 * This program is distributed in the hope that it will be useful,
 
9
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 
10
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
11
 * GNU General Public License for more details.
 
12
 *
 
13
 * You should have received a copy of the GNU General Public License
 
14
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
15
 */
 
16
 
 
17
#include <QFile>
 
18
#include <QDebug>
 
19
#include <QXmlStreamReader>
 
20
 
 
21
#include "xmltimezonemodel.h"
 
22
 
 
23
XmlTimeZoneModel::XmlTimeZoneModel(QObject *parent):
 
24
    TimeZoneModel(parent)
 
25
{
 
26
}
 
27
 
 
28
QUrl XmlTimeZoneModel::source() const
 
29
{
 
30
    return m_source;
 
31
}
 
32
 
 
33
void XmlTimeZoneModel::setSource(const QUrl &source)
 
34
{
 
35
    if (m_source == source) {
 
36
        // Don't parse the file again if the source is the same already
 
37
        return;
 
38
    }
 
39
 
 
40
    // Change the property and let people know by emitting the changed signal
 
41
    m_source = source;
 
42
    emit sourceChanged();
 
43
 
 
44
    // Ultimately load the file
 
45
    loadTimeZonesFromXml();
 
46
}
 
47
 
 
48
void XmlTimeZoneModel::loadTimeZonesFromXml()
 
49
{
 
50
    // Let qml know that the model will be cleared and rebuilt
 
51
    beginResetModel();
 
52
 
 
53
    m_timeZones.clear();
 
54
 
 
55
    QFile file(m_source.path());
 
56
    if (!file.open(QFile::ReadOnly)) {
 
57
        qWarning() << "Can't open" << m_source << ". Model will be empty.";
 
58
        endResetModel();
 
59
        return;
 
60
    }
 
61
 
 
62
    QXmlStreamReader reader(&file);
 
63
    bool haveCities = false;
 
64
    bool isCityName = false;
 
65
    bool isCountryName = false;
 
66
    bool isTzId = false;
 
67
 
 
68
    TimeZone tz;
 
69
    while (!reader.atEnd() && !reader.hasError()) {
 
70
        QXmlStreamReader::TokenType token = reader.readNext();
 
71
 
 
72
        // Skip any header
 
73
        if(token == QXmlStreamReader::StartDocument) {
 
74
            continue;
 
75
        }
 
76
 
 
77
        if (token == QXmlStreamReader::StartElement) {
 
78
 
 
79
            // skip anything outside the Cities tag
 
80
            if (!haveCities) {
 
81
                if (reader.name() == "Cities") {
 
82
                    haveCities = true;
 
83
                }
 
84
                continue;
 
85
            }
 
86
 
 
87
            if (reader.name() == "City") {
 
88
                // A new time zone begins. clear tz
 
89
                tz = TimeZone();
 
90
            }
 
91
            if (reader.name() == "cityName") {
 
92
                isCityName = true;
 
93
            }
 
94
            if (reader.name() == "countryName") {
 
95
                isCountryName = true;
 
96
            }
 
97
            if (reader.name() == "timezoneID") {
 
98
                isTzId = true;
 
99
            }
 
100
        }
 
101
 
 
102
        if (token == QXmlStreamReader::Characters) {
 
103
 
 
104
            if (isCityName) {
 
105
                tz.cityName = reader.text().toString();
 
106
            }
 
107
            if (isCountryName) {
 
108
                tz.country = reader.text().toString();
 
109
            }
 
110
            if (isTzId) {
 
111
                tz.timeZoneId = reader.text().toString();
 
112
            }
 
113
        }
 
114
 
 
115
        if (token == QXmlStreamReader::EndElement) {
 
116
            if (reader.name() == "Cities") {
 
117
                haveCities = false;
 
118
            }
 
119
            if (reader.name() == "City") {
 
120
                // A time zone has ended. insert it into list
 
121
                m_timeZones.append(tz);
 
122
                qDebug() << "appended tz:" << tz.cityName << tz.country << tz.timeZoneId;
 
123
            }
 
124
            if (reader.name() == "cityName") {
 
125
                isCityName = false;
 
126
            }
 
127
            if (reader.name() == "countryName") {
 
128
                isCountryName = false;
 
129
            }
 
130
            if (reader.name() == "timezoneID") {
 
131
                isTzId = false;
 
132
            }
 
133
        }
 
134
    }
 
135
 
 
136
    // Let QML know that the model is usable again.
 
137
    endResetModel();
 
138
}