summaryrefslogtreecommitdiff
path: root/src/plugins/geoservices/nokia/qgeocodexmlparser.cpp
diff options
context:
space:
mode:
authorChris Adams <chris.adams@jollamobile.com>2016-11-04 15:14:07 +1000
committerAlex Blasche <alexander.blasche@qt.io>2016-11-16 06:36:23 +0000
commit78c73ebf88fbb97ebb796fc71e76232af5c8f1d3 (patch)
treeb225fea6cf830aa3b32eb316387e23de29f9f5df /src/plugins/geoservices/nokia/qgeocodexmlparser.cpp
parent81f626f062d95abe49fcb7d8f098e54646c04034 (diff)
downloadqtlocation-78c73ebf88fbb97ebb796fc71e76232af5c8f1d3.tar.gz
Update "nokia" geoservices plugin to use HERE APIs
The old Nokia URL endpoints are being deprecated. This commit updates the "nokia" plugin to use the modern HERE API endpoints. It also removes the (now nonexistent) China-specific URLs. Change-Id: Ieaf75cef1538d0ebb6a22623fc041ab504cf491f Reviewed-by: Alex Blasche <alexander.blasche@qt.io>
Diffstat (limited to 'src/plugins/geoservices/nokia/qgeocodexmlparser.cpp')
-rw-r--r--src/plugins/geoservices/nokia/qgeocodexmlparser.cpp573
1 files changed, 0 insertions, 573 deletions
diff --git a/src/plugins/geoservices/nokia/qgeocodexmlparser.cpp b/src/plugins/geoservices/nokia/qgeocodexmlparser.cpp
deleted file mode 100644
index 89738869..00000000
--- a/src/plugins/geoservices/nokia/qgeocodexmlparser.cpp
+++ /dev/null
@@ -1,573 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2015 The Qt Company Ltd.
-** Contact: http://www.qt.io/licensing/
-**
-** This file is part of the QtLocation module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL3$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see http://www.qt.io/terms-conditions. For further
-** information use the contact form at http://www.qt.io/contact-us.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 3 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPLv3 included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 3 requirements
-** will be met: https://www.gnu.org/licenses/lgpl.html.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 2.0 or later as published by the Free
-** Software Foundation and appearing in the file LICENSE.GPL included in
-** the packaging of this file. Please review the following information to
-** ensure the GNU General Public License version 2.0 requirements will be
-** met: http://www.gnu.org/licenses/gpl-2.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "qgeocodexmlparser.h"
-
-#include <QtCore/QXmlStreamReader>
-#include <QtCore/QThreadPool>
-#include <QtPositioning/QGeoLocation>
-#include <QtPositioning/QGeoAddress>
-#include <QtPositioning/QGeoCoordinate>
-#include <QtPositioning/QGeoRectangle>
-
-QT_BEGIN_NAMESPACE
-
-QGeoCodeXmlParser::QGeoCodeXmlParser()
-{
-}
-
-QGeoCodeXmlParser::~QGeoCodeXmlParser()
-{
-}
-
-void QGeoCodeXmlParser::setBounds(const QGeoShape &bounds)
-{
- m_bounds = bounds;
-}
-
-void QGeoCodeXmlParser::parse(const QByteArray &data)
-{
- m_data = data;
- QThreadPool::globalInstance()->start(this);
-}
-
-void QGeoCodeXmlParser::run()
-{
- m_reader = new QXmlStreamReader(m_data);
-
- if (!parseRootElement())
- emit error(m_reader->errorString());
- else
- emit results(m_results);
-
- delete m_reader;
- m_reader = 0;
-}
-
-bool QGeoCodeXmlParser::parseRootElement()
-{
- /*
- <xsd:element name="places">
- <xsd:complexType>
- <xsd:sequence>
- <xsd:element minOccurs="0" maxOccurs="unbounded" name="place" type="gc:Place"/>
- </xsd:sequence>
- <xsd:attribute name="resultCode" type="gc:ResultCodes"/>
- <xsd:attribute name="resultDescription" type="xsd:string"/>
- <xsd:attribute name="resultsTotal" type="xsd:nonNegativeInteger"/>
- </xsd:complexType>
- </xsd:element>
-
- <xsd:simpleType name="ResultCodes">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="OK"/>
- <xsd:enumeration value="FAILED"/>
- </xsd:restriction>
- </xsd:simpleType>
- */
-
- if (m_reader->readNextStartElement()) {
- if (m_reader->name() == "places") {
- if (m_reader->attributes().hasAttribute("resultCode")) {
- QStringRef result = m_reader->attributes().value("resultCode");
- if (result == "FAILED") {
- QString resultDesc = m_reader->attributes().value("resultDescription").toString();
- if (resultDesc.isEmpty())
- resultDesc = "The attribute \"resultCode\" of the element \"places\" indicates that the request failed.";
-
- m_reader->raiseError(resultDesc);
-
- return false;
- } else if (result != "OK") {
- m_reader->raiseError(QString("The attribute \"resultCode\" of the element \"places\" has an unknown value (value was %1).").arg(result.toString()));
- return false;
- }
- }
-
- while (m_reader->readNextStartElement()) {
- if (m_reader->name() == "place") {
- QGeoLocation location;
-
- if (!parsePlace(&location))
- return false;
-
- if (!m_bounds.isValid() || m_bounds.contains(location.coordinate()))
- m_results.append(location);
- } else {
- m_reader->raiseError(QString("The element \"places\" did not expect a child element named \"%1\".").arg(m_reader->name().toString()));
- return false;
- }
- }
- } else {
- m_reader->raiseError(QString("The root element is expected to have the name \"places\" (root element was named \"%1\").").arg(m_reader->name().toString()));
- return false;
- }
- } else {
- m_reader->raiseError("Expected a root element named \"places\" (no root element found).");
- return false;
- }
-
- if (m_reader->readNextStartElement()) {
- m_reader->raiseError(QString("A single root element named \"places\" was expected (second root element was named \"%1\")").arg(m_reader->name().toString()));
- return false;
- }
-
- return true;
-}
-
-
-//Note: the term Place here is semi-confusing since
-// the xml 'place' is actually a location ie coord + address
-bool QGeoCodeXmlParser::parsePlace(QGeoLocation *location)
-{
- /*
- <xsd:complexType name="Place">
- <xsd:all>
- <xsd:element name="location" type="gc:Location"/>
- <xsd:element minOccurs="0" name="address" type="gc:Address"/>
- <xsd:element minOccurs="0" name="alternatives" type="gc:Alternatives"/>
- </xsd:all>
- <xsd:attribute name="title" type="xsd:string" use="required"/>
- <xsd:attribute name="language" type="gc:LanguageCode" use="required"/>
- </xsd:complexType>
-
- <xsd:simpleType name="LanguageCode">
- <xsd:restriction base="xsd:string">
- <xsd:length value="3"/>
- </xsd:restriction>
- </xsd:simpleType>
- */
-
- Q_ASSERT(m_reader->isStartElement() && m_reader->name() == "place");
-
- if (!m_reader->attributes().hasAttribute("title")) {
- m_reader->raiseError("The element \"place\" did not have the required attribute \"title\".");
- return false;
- }
-
- if (!m_reader->attributes().hasAttribute("language")) {
- //m_reader->raiseError("The element \"place\" did not have the required attribute \"language\".");
- //return false;
- } else {
- QString lang = m_reader->attributes().value("language").toString();
-
- if (lang.length() != 3) {
- m_reader->raiseError(QString("The attribute \"language\" of the element \"place\" was not of length 3 (length was %1).").arg(lang.length()));
- return false;
- }
- }
-
- bool parsedLocation = false;
- bool parsedAddress = false;
- bool parsedAlternatives = false;
-
- while (m_reader->readNextStartElement()) {
- QString name = m_reader->name().toString();
- if (name == "location") {
- if (parsedLocation) {
- m_reader->raiseError("The element \"place\" has multiple child elements named \"location\" (exactly one expected)");
- return false;
- }
-
- if (!parseLocation(location))
- return false;
-
- parsedLocation = true;
- } else if (name == "address") {
- if (parsedAddress) {
- m_reader->raiseError("The element \"place\" has multiple child elements named \"address\" (at most one expected)");
- return false;
- }
-
- QGeoAddress address;
- if (!parseAddress(&address))
- return false;
- else
- location->setAddress(address);
-
- location->setAddress(address);
-
- parsedAddress = true;
- } else if (name == "alternatives") {
- if (parsedAlternatives) {
- m_reader->raiseError("The element \"place\" has multiple child elements named \"alternatives\" (at most one expected)");
- return false;
- }
-
- // skip alternatives for now
- // need to work out if we have a use for them at all
- // and how to store them if we get them
- m_reader->skipCurrentElement();
-
- parsedAlternatives = true;
- } else {
- m_reader->raiseError(QString("The element \"place\" did not expect a child element named \"%1\".").arg(m_reader->name().toString()));
- return false;
- }
- }
-
- if (!parsedLocation) {
- m_reader->raiseError("The element \"place\" has no child elements named \"location\" (exactly one expected)");
- return false;
- }
-
- return true;
-}
-
-//Note: the term Place here is semi-confusing since
-// the xml 'location' is actually a parital location i.e coord
-// as opposed to coord + address
-bool QGeoCodeXmlParser::parseLocation(QGeoLocation *location)
-{
- /*
- <xsd:complexType name="Location">
- <xsd:all>
- <xsd:element name="position" type="gc:GeoCoord"/>
- <xsd:element minOccurs="0" name="boundingBox" type="gc:GeoBox"/>
- </xsd:all>
- </xsd:complexType>
-
- <xsd:complexType name="GeoBox">
- <xsd:sequence>
- <xsd:element name="topLeft" type="gc:GeoCoord"/>
- <xsd:element name="bottomRight" type="gc:GeoCoord"/>
- </xsd:sequence>
- </xsd:complexType>
- */
-
- Q_ASSERT(m_reader->isStartElement() && m_reader->name() == "location");
-
- bool parsedPosition = false;
- bool parsedBounds = false;
-
- while (m_reader->readNextStartElement()) {
- QString name = m_reader->name().toString();
- if (name == "position") {
- if (parsedPosition) {
- m_reader->raiseError("The element \"location\" has multiple child elements named \"position\" (exactly one expected)");
- return false;
- }
-
- QGeoCoordinate coord;
- if (!parseCoordinate(&coord, "position"))
- return false;
-
- location->setCoordinate(coord);
-
- parsedPosition = true;
- } else if (name == "boundingBox") {
- if (parsedBounds) {
- m_reader->raiseError("The element \"location\" has multiple child elements named \"boundingBox\" (at most one expected)");
- return false;
- }
-
- QGeoRectangle bounds;
-
- if (!parseBoundingBox(&bounds))
- return false;
-
- location->setBoundingBox(bounds);
-
- parsedBounds = true;
- } else {
- m_reader->raiseError(QString("The element \"location\" did not expect a child element named \"%1\".").arg(m_reader->name().toString()));
- return false;
- }
- }
-
- if (!parsedPosition) {
- m_reader->raiseError("The element \"location\" has no child elements named \"position\" (exactly one expected)");
- return false;
- }
-
- return true;
-}
-
-bool QGeoCodeXmlParser::parseAddress(QGeoAddress *address)
-{
- /*
- <xsd:complexType name="Address">
- <xsd:sequence>
- <xsd:element minOccurs="0" maxOccurs="1" name="country" type="xsd:string"/>
- <xsd:element minOccurs="0" maxOccurs="1" name="countryCode" type="gc:CountryCode"/>
- <xsd:element minOccurs="0" maxOccurs="1" name="state" type="xsd:string"/>
- <xsd:element minOccurs="0" maxOccurs="1" name="county" type="xsd:string"/>
- <xsd:element minOccurs="0" maxOccurs="1" name="city" type="xsd:string"/>
- <xsd:element minOccurs="0" maxOccurs="1" name="district" type="xsd:string"/>
- <xsd:element minOccurs="0" maxOccurs="1" name="thoroughfare" type="gc:Thoroughfare"/>
- <xsd:element minOccurs="0" maxOccurs="1" name="postCode" type="xsd:string"/>
- </xsd:sequence>
- <xsd:attribute name="type" type="xsd:string"/>
- </xsd:complexType>
-
- <xsd:simpleType name="CountryCode">
- <xsd:restriction base="xsd:string">
- <xsd:length value="3" fixed="true"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:complexType name="Thoroughfare">
- <xsd:sequence>
- <xsd:element minOccurs="0" name="name" type="xsd:string"/>
- <xsd:element minOccurs="0" name="number" type="xsd:string"/>
- </xsd:sequence>
- </xsd:complexType>
- */
-
- Q_ASSERT(m_reader->isStartElement() && m_reader->name() == "address");
-
- // currently ignoring the type of the address
-
- if (!m_reader->readNextStartElement())
- return true;
-
- if (m_reader->name() == "country") {
- address->setCountry(m_reader->readElementText());
- if (!m_reader->readNextStartElement())
- return true;
- }
-
- if (m_reader->name() == "countryCode") {
- address->setCountryCode(m_reader->readElementText());
-
- if (address->countryCode().length() != 3) {
- m_reader->raiseError(QString("The text of the element \"countryCode\" was not of length 3 (length was %1).").arg(address->countryCode().length()));
- return false;
- }
-
- if (!m_reader->readNextStartElement())
- return true;
- }
-
- if (m_reader->name() == "state") {
- address->setState(m_reader->readElementText());
- if (!m_reader->readNextStartElement())
- return true;
- }
-
- if (m_reader->name() == "county") {
- address->setCounty(m_reader->readElementText());
- if (!m_reader->readNextStartElement())
- return true;
- }
-
- if (m_reader->name() == "city") {
- address->setCity(m_reader->readElementText());
- if (!m_reader->readNextStartElement())
- return true;
- }
-
- if (m_reader->name() == "district") {
- address->setDistrict(m_reader->readElementText());
- if (!m_reader->readNextStartElement())
- return true;
- }
-
- bool inThoroughfare = false;
-
- if (m_reader->name() == "thoroughfare") {
- inThoroughfare = m_reader->readNextStartElement();
-
- if (inThoroughfare && (m_reader->name() == "name")) {
- address->setStreet(m_reader->readElementText());
- if (!m_reader->readNextStartElement())
- inThoroughfare = false;
- }
-
- if (inThoroughfare && (m_reader->name() == "number")) {
- address->setStreet(m_reader->readElementText() + ' ' + address->street());
- if (!m_reader->readNextStartElement())
- inThoroughfare = false;
- }
-
- if (inThoroughfare) {
- m_reader->raiseError(QString("The element \"thoroughFare\" did not expect the child element \"%1\" at this point (unknown child element or child element out of order).").arg(m_reader->name().toString()));
- return false;
- }
-
- if (!m_reader->readNextStartElement())
- return true;
- }
-
- if (m_reader->name() == "postCode") {
- address->setPostalCode(m_reader->readElementText());
- if (!m_reader->readNextStartElement())
- return true;
- }
-
- m_reader->raiseError(QString("The element \"address\" did not expect the child element \"%1\" at this point (unknown child element or child element out of order).").arg(m_reader->name().toString()));
- return false;
-}
-
-bool QGeoCodeXmlParser::parseBoundingBox(QGeoRectangle *bounds)
-{
- /*
- <xsd:complexType name="GeoBox">
- <xsd:sequence>
- <xsd:element name="topLeft" type="gc:GeoCoord"/>
- <xsd:element name="bottomRight" type="gc:GeoCoord"/>
- </xsd:sequence>
- </xsd:complexType>
- */
-
- Q_ASSERT(m_reader->isStartElement() && m_reader->name() == "boundingBox");
-
- if (!m_reader->readNextStartElement()) {
- m_reader->raiseError("The element \"boundingBox\" was expected to have 2 child elements (0 found)");
- return false;
- }
-
- QGeoCoordinate nw;
-
- if (m_reader->name() == "topLeft") {
- if (!parseCoordinate(&nw, "topLeft"))
- return false;
- } else {
- m_reader->raiseError(QString("The element \"boundingBox\" expected this child element to be named \"topLeft\" (found an element named \"%1\")").arg(m_reader->name().toString()));
- return false;
- }
-
- if (!m_reader->readNextStartElement()) {
- m_reader->raiseError("The element \"boundingBox\" was expected to have 2 child elements (1 found)");
- return false;
- }
-
- QGeoCoordinate se;
-
- if (m_reader->name() == "bottomRight") {
- if (!parseCoordinate(&se, "bottomRight"))
- return false;
- } else {
- m_reader->raiseError(QString("The element \"boundingBox\" expected this child element to be named \"bottomRight\" (found an element named \"%1\")").arg(m_reader->name().toString()));
- return false;
- }
-
- if (m_reader->readNextStartElement()) {
- m_reader->raiseError("The element \"boundingBox\" was expected to have 2 child elements (more than 2 found)");
- return false;
- }
-
- *bounds = QGeoRectangle(nw, se);
-
- return true;
-}
-
-bool QGeoCodeXmlParser::parseCoordinate(QGeoCoordinate *coordinate, const QString &elementName)
-{
- /*
- <xsd:complexType name="GeoCoord">
- <xsd:sequence>
- <xsd:element name="latitude" type="gc:Latitude"/>
- <xsd:element name="longitude" type="gc:Longitude"/>
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:simpleType name="Latitude">
- <xsd:restriction base="xsd:float">
- <xsd:minInclusive value="-90.0"/>
- <xsd:maxInclusive value="90.0"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="Longitude">
- <xsd:restriction base="xsd:float">
- <xsd:minInclusive value="-180.0"/>
- <xsd:maxInclusive value="180.0"/>
- </xsd:restriction>
- </xsd:simpleType>
- */
-
- Q_ASSERT(m_reader->isStartElement() && m_reader->name() == elementName);
-
- if (!m_reader->readNextStartElement()) {
- m_reader->raiseError(QString("The element \"%1\" was expected to have 2 child elements (0 found)").arg(elementName));
- return false;
- }
-
- if (m_reader->name() == "latitude") {
- bool ok = false;
- QString s = m_reader->readElementText();
- double lat = s.toDouble(&ok);
-
- if (!ok) {
- m_reader->raiseError(QString("The element \"latitude\" expected a value convertable to type float (value was \"%1\")").arg(s));
- return false;
- }
-
- if (lat < -90.0 || 90.0 < lat) {
- m_reader->raiseError(QString("The element \"latitude\" expected a value between -90.0 and 90.0 inclusive (value was %1)").arg(lat));
- return false;
- }
-
- coordinate->setLatitude(lat);
- } else {
- m_reader->raiseError(QString("The element \"%1\" expected this child element to be named \"latitude\" (found an element named \"%2\")").arg(elementName).arg(m_reader->name().toString()));
- }
-
- if (!m_reader->readNextStartElement()) {
- m_reader->raiseError(QString("The element \"%1\" was expected to have 2 child elements (1 found)").arg(elementName));
- return false;
- }
-
- if (m_reader->name() == "longitude") {
- bool ok = false;
- QString s = m_reader->readElementText();
- double lng = s.toDouble(&ok);
-
- if (!ok) {
- m_reader->raiseError(QString("The element \"longitude\" expected a value convertable to type float (value was \"%1\")").arg(s));
- return false;
- }
-
- if (lng < -180.0 || 180.0 < lng) {
- m_reader->raiseError(QString("The element \"longitude\" expected a value between -180.0 and 180.0 inclusive (value was %1)").arg(lng));
- return false;
- }
-
- coordinate->setLongitude(lng);
- } else {
- m_reader->raiseError(QString("The element \"%1\" expected this child element to be named \"longitude\" (found an element named \"%2\")").arg(elementName).arg(m_reader->name().toString()));
- }
-
- if (m_reader->readNextStartElement()) {
- m_reader->raiseError(QString("The element \"%1\" was expected to have 2 child elements (more than 2 found)").arg(elementName));
- return false;
- }
-
- return true;
-}
-
-QT_END_NAMESPACE