bool QLandmarkFileHandlerGpx::readGpx() { /* <xsd:complexType name="gpxType"> <xsd:sequence> <xsd:element name="metadata" type="metadataType" minOccurs="0" /> <xsd:element name="wpt" type="wptType" minOccurs="0" maxOccurs="unbounded" /> <xsd:element name="rte" type="rteType" minOccurs="0" maxOccurs="unbounded" /> <xsd:element name="trk" type="trkType" minOccurs="0" maxOccurs="unbounded" /> <xsd:element name="extensions" type="extensionsType" minOccurs="0" /> </xsd:sequence> <xsd:attribute name="version" type="xsd:string" use="required" fixed="1.1" /> <xsd:attribute name="creator" type="xsd:string" use="required" /> </xsd:complexType> */ if (!m_reader->readNextStartElement()) { m_reader->raiseError("Expected a root element named \"gpx\" (no root element found)."); return false; } if (m_reader->name() != "gpx") { m_reader->raiseError(QString("The root element is expected to have the name \"gpx\" (root element was named \"%1\").").arg(m_reader->name().toString())); return false; } if (m_reader->attributes().hasAttribute("version")) { QString version = m_reader->attributes().value("version").toString(); if (version != "1.1") { m_reader->raiseError(QString("Only version 1.1. of the GPX schema is supported (version found was \"%1\").").arg(version)); return false; } } else { m_reader->raiseError("The element \"gpx\" did not have the required attribute \"version\"."); return false; } if (m_reader->attributes().hasAttribute("creator")) { // Not used outside of schema compliance check } else { m_reader->raiseError("The element \"gpx\" did not have the required attribute \"creator\"."); return false; } if (!m_reader->readNextStartElement()) { m_reader->skipCurrentElement(); return true; } if (m_reader->name() == "metadata") { // Not used outside of schema compliance check m_reader->skipCurrentElement(); if (!m_reader->readNextStartElement()) { m_reader->skipCurrentElement(); return true; } } while (m_reader->name() == "wpt") { if (m_cancel && (*m_cancel==true)) { m_errorCode = QLandmarkManager::CancelError; m_errorString = "Import of gpx file was canceled"; return false; } QLandmark landmark; if (!readWaypoint(landmark, "wpt")) { return false; } m_waypoints.append(landmark); if(!m_reader->readNextStartElement()) { m_reader->skipCurrentElement(); return true; } } while (m_reader->name() == "rte") { if (m_cancel && (*m_cancel==true)) { m_errorCode = QLandmarkManager::CancelError; m_errorString = "Import of gpx file was canceled"; return false; } QList<QLandmark> route; if (!readRoute(route)) return false; m_routes.append(route); if(!m_reader->readNextStartElement()) { m_reader->skipCurrentElement(); return true; } } while (m_reader->name() == "trk") { if (m_cancel && (*m_cancel==true)) { m_errorCode = QLandmarkManager::CancelError; m_errorString = "Import of gpx file was canceled"; return false; } QList<QLandmark> track; if (!readTrack(track)) return false; m_tracks.append(track); if(!m_reader->readNextStartElement()) { m_reader->skipCurrentElement(); return true; } } if (m_reader->name() == "extensions") { // Not used outside of schema compliance check m_reader->skipCurrentElement(); if (!m_reader->readNextStartElement()) { m_reader->skipCurrentElement(); return true; } } m_reader->raiseError(QString("The element \"gpx\" did not expect a child element named \"%1\" at this point (unknown child element or child element out of order).").arg(m_reader->name().toString())); return false; }
bool QLandmarkFileHandlerGpx::readRoute(QList<QLandmark> &route) { /* <xsd:complexType name="rteType"> <xsd:sequence> <xsd:element name="name" type="xsd:string" minOccurs="0" /> <xsd:element name="cmt" type="xsd:string" minOccurs="0" /> <xsd:element name="desc" type="xsd:string" minOccurs="0" /> <xsd:element name="src" type="xsd:string" minOccurs="0" /> <xsd:element name="link" type="linkType" minOccurs="0" maxOccurs="unbounded" /> <xsd:element name="number" type="xsd:nonNegativeInteger" minOccurs="0" /> <xsd:element name="type" type="xsd:string" minOccurs="0" /> <xsd:element name="extensions" type="extensionsType" minOccurs="0" /> <xsd:element name="rtept" type="wptType" minOccurs="0" maxOccurs="unbounded" /> </xsd:sequence> </xsd:complexType> */ Q_ASSERT(m_reader->isStartElement() && (m_reader->name() == "rte")); if (!m_reader->readNextStartElement()) return true; QList<QString> unusedNames1; unusedNames1 << "name"; unusedNames1 << "cmt"; unusedNames1 << "desc"; unusedNames1 << "src"; for (int i = 0; i < unusedNames1.size(); ++i) { if (m_reader->name() == unusedNames1.at(i)) { // Not used outside of schema compliance check m_reader->skipCurrentElement(); if (!m_reader->readNextStartElement()) return true; } } while (m_reader->name() == "link") { // Not used outside of schema compliance check m_reader->skipCurrentElement(); if (!m_reader->readNextStartElement()) return true; } QList<QString> unusedNames2; unusedNames2 << "number"; unusedNames2 << "type"; unusedNames2 << "extensions"; for (int i = 0; i < unusedNames2.size(); ++i) { if (m_reader->name() == unusedNames2.at(i)) { // Not used outside of schema compliance check m_reader->skipCurrentElement(); if (!m_reader->readNextStartElement()) return true; } } while (m_reader->name() == "rtept") { QLandmark landmark; if (!readWaypoint(landmark, "rtept")) return false; route << landmark; if (!m_reader->readNextStartElement()) return true; } m_reader->raiseError(QString("The element \"rte\" did not expect a child element named \"%1\" at this point (unknown child element or child element out of order).").arg(m_reader->name().toString())); return false; }
bool QgsGPXFeatureIterator::fetchFeature( QgsFeature &feature ) { feature.setValid( false ); if ( mClosed ) return false; if ( mRequest.filterType() == QgsFeatureRequest::FilterFid ) { bool res = readFid( feature ); close(); if ( res ) geometryToDestinationCrs( feature, mTransform ); return res; } if ( mSource->mFeatureType == QgsGPXProvider::WaypointType ) { // go through the list of waypoints and return the first one that is in // the bounds rectangle for ( ; mWptIter != mSource->data->waypointsEnd(); ++mWptIter ) { if ( readWaypoint( *mWptIter, feature ) ) { ++mWptIter; geometryToDestinationCrs( feature, mTransform ); return true; } } } else if ( mSource->mFeatureType == QgsGPXProvider::RouteType ) { // go through the routes and return the first one that is in the bounds // rectangle for ( ; mRteIter != mSource->data->routesEnd(); ++mRteIter ) { if ( readRoute( *mRteIter, feature ) ) { ++mRteIter; geometryToDestinationCrs( feature, mTransform ); return true; } } } else if ( mSource->mFeatureType == QgsGPXProvider::TrackType ) { // go through the tracks and return the first one that is in the bounds // rectangle for ( ; mTrkIter != mSource->data->tracksEnd(); ++mTrkIter ) { if ( readTrack( *mTrkIter, feature ) ) { ++mTrkIter; geometryToDestinationCrs( feature, mTransform ); return true; } } } close(); return false; }