File indexing completed on 2024-04-21 03:49:49

0001 // SPDX-License-Identifier: LGPL-2.1-or-later
0002 //
0003 // SPDX-FileCopyrightText: 2023 Torsten Rahn <rahn@kde.org>
0004 //
0005 
0006 #ifndef OWSSERVICEMANAGER_H
0007 #define OWSSERVICEMANAGER_H
0008 
0009 #include <QObject>
0010 #include <QNetworkAccessManager>
0011 #include <QImage>
0012 #include <QDomDocument>
0013 
0014 class QNetworkReply;
0015 
0016 namespace Marble
0017 {
0018 
0019 enum OwsServiceType {
0020     NoOwsType,
0021     WmsType,
0022     WmtsType,
0023     WfsType,
0024     WcsType
0025 };
0026 
0027 enum OwsCapabilitiesStatus {
0028     OwsCapabilitiesNone,
0029     OwsCapabilitiesSuccess,
0030     OwsCapabilitiesNoOwsServer,
0031     OwsCapabilitiesReplyUnreadable,
0032     OwsCapabilitiesFailed
0033 };
0034 
0035 
0036 enum WmsImageStatus {
0037     WmsImageNone,
0038     WmsImageSuccess,
0039     WmsImageFailed,
0040     WmsImageFailedServerMessage
0041 };
0042 
0043 class OwsMappingCapabilities {
0044 
0045 public:
0046     OwsMappingCapabilities();
0047 
0048     void setVersion(const QString& version);
0049     QString version() const; // "1.1.1" or "1.3.0"
0050 
0051     void setTitle(const QString& title);
0052     QString title() const;
0053 
0054     void setAbstract(const QString& abstract);
0055     QString abstract() const;
0056 
0057     QStringList layers() const;
0058 
0059     QString title(const QString& layer);
0060     QString abstract(const QString& layer);
0061     QString style(const QString& layer);
0062 
0063     void setOwsLayerMetaInfo(const QMap<QString, QStringList>& wmsLayerMetaInfo);
0064     QMap<QString, QStringList> owsLayerMetaInfo() const;
0065 
0066 protected:
0067     QString m_version;
0068     QString m_title;
0069     QString m_abstract;
0070 
0071     QMap<QString, QStringList> m_owsLayerMetaInfo; // layerName -> Title, Abstract, LegendUrl, Style
0072 };
0073 
0074 class WmsCapabilities : public OwsMappingCapabilities {
0075 
0076 public:
0077     WmsCapabilities();
0078 
0079 
0080     void setContactInformation(const QString& info);
0081     QString contactInformation() const;
0082 
0083     void setFees(const QString& fee);
0084     QString fees() const;
0085 
0086     QStringList projections(const QString& layer);
0087     QString boundingBox(const QString& layer, const QString& projection);
0088     QString legendUrl(const QString& layer);
0089     QStringList styles(const QStringList& layers);
0090     QString boundingBoxNSEWDegrees(const QStringList& layers, const QString& projection);
0091 
0092     void setReferenceSystemType(const QString& refSystem);
0093     QString referenceSystemType() const; // SRS (1.1.1) or CRS (1.3.0)
0094 
0095     void setWmsLayerCoordinateSystems(const QMap<QString, QMap<QString, QString>>& wmsLayerCoordinateSystems);
0096     QMap<QString, QMap<QString, QString>> wmsLayerCoordinateSystems() const;
0097 
0098     void setFormats(const QStringList& formats);
0099     QStringList formats();
0100 
0101     QString m_referenceSystemType;
0102 
0103     QString m_contactInformation;
0104     QString m_fees;
0105 
0106     QMap<QString, QMap<QString, QString>> m_wmsLayerCoordinateSystems; // layerId -> epsg -> bbox
0107 
0108     QStringList m_formats; // png, jpg, ...
0109 };
0110 
0111 class WmtsCapabilities : public OwsMappingCapabilities {
0112 
0113 public:
0114     WmtsCapabilities();
0115 
0116     void setWmtsTileMatrixSets(const QMap<QString, QStringList> & wmtsTileMatrixSets);
0117     QMap<QString, QStringList> wmtsTileMatrixSets() const;
0118     void setWmtsTileResource(const QMap<QString, QMap<QString, QString>> & wmtsTileResource);
0119     QMap<QString, QMap<QString, QString>> wmtsTileResource() const;
0120 
0121     QMap<QString, QStringList> m_wmtsTileMatrixSets; //  layerId -> TileMatrixSets
0122     QMap<QString, QMap<QString, QString>> m_wmtsTileResource; // layerId -> Format -> RessourceUrl
0123 };
0124 
0125 enum ImageResultType {
0126     GenericImage,
0127     LevelZeroTile,
0128     PreviewImage,
0129     LegendImage
0130 };
0131 
0132 class ImageRequestResult {
0133 
0134 public:
0135     ImageRequestResult();
0136 
0137     void setImageStatus(WmsImageStatus imageStatus);
0138     WmsImageStatus imageStatus() const;
0139 
0140     void setResultImage(const QImage& image);
0141     QImage resultImage() const;
0142 
0143     void setResultRaw(const QByteArray& resultRaw);
0144     QByteArray resultRaw() const;
0145 
0146     void setResultFormat(const QString& resultFormat);
0147     QString resultFormat() const;
0148 
0149     void setResultType(const ImageResultType);
0150     ImageResultType resultType() const;
0151 
0152 private:
0153     WmsImageStatus m_imageStatus;
0154     QImage m_resultImage;
0155     QByteArray m_resultRaw;
0156     QString m_resultFormat;
0157     ImageResultType m_resultType;
0158 };
0159 
0160 class OwsServiceManager : public QObject
0161 {
0162     Q_OBJECT
0163 public:
0164     explicit OwsServiceManager(QObject *parent = nullptr);
0165 
0166 public Q_SLOTS:
0167     void queryOwsCapabilities(const QUrl& queryUrl, const QString& serviceString = "WMS");
0168     void queryWmsMap(const QUrl& url, const QString& layers, const QString& projection,
0169                      const QString& bbox, const QString& format, const QString& styles = QString());
0170     void queryWmsLevelZeroTile(const QUrl& url, const QString &layers, const QString &projection,
0171                             const QString &format, const QString &styles = QString());
0172     void queryWmsPreviewImage(const QUrl& url, const QString &layers, const QString &projection,
0173                            const QString &format, const QString &styles = QString());
0174     void queryWmsLegendImage(const QUrl& url);
0175 
0176     void queryWmtsLevelZeroTile(const QString& url, const QString& style, const QString& tileMatrixSet);
0177     void queryWmtsPreviewImage(const QString& url, const QString& style, const QString& tileMatrixSet);
0178     void queryWmtsTile(const QString& url, const QString& style, const QString& tileMatrixSet,
0179                        const QString& tileMatrix, const QString& tileRow, const QString& tileCol);
0180 
0181     void queryXYZPreviewImage(const QString& urlString);
0182     void queryXYZLevelZeroTile(const QString& urlString);
0183     void queryXYZImage(const QString urlString);    
0184 
0185     void handleAuthentication(QNetworkReply *reply, QAuthenticator *authenticator);
0186 
0187     void setCapabilitiesStatus(OwsCapabilitiesStatus capabilitiesStatus);
0188     OwsCapabilitiesStatus capabilitiesStatus() const;
0189 
0190     OwsServiceType owsServiceType();
0191     WmsCapabilities wmsCapabilities();
0192     WmtsCapabilities wmtsCapabilities();
0193     ImageRequestResult imageRequestResult();
0194 
0195     QImage resultImage();
0196     QByteArray resultRaw();
0197     QString resultFormat();
0198     ImageResultType resultType();
0199 
0200 Q_SIGNALS:
0201     void wmsCapabilitiesReady();
0202     void wmtsCapabilitiesReady();
0203     void imageRequestResultReady();
0204 
0205 private Q_SLOTS:
0206     void parseOwsCapabilities(QNetworkReply* reply);
0207     void parseWmsCapabilities(QNetworkReply* reply);
0208     void parseWmtsCapabilities(QNetworkReply* reply);
0209     void parseImageResult(QNetworkReply* reply);
0210 
0211 private:
0212     QUrl m_url;
0213     QDomDocument m_xml;
0214     QNetworkAccessManager m_capabilitiesAccessManager;
0215     QNetworkAccessManager m_imageAccessManager;
0216     OwsCapabilitiesStatus m_capabilitiesStatus;
0217     OwsServiceType m_owsServiceType;
0218     WmsCapabilities m_wmsCapabilities;
0219     WmtsCapabilities m_wmtsCapabilities;
0220     ImageRequestResult m_imageRequestResult;
0221 };
0222 
0223 }
0224 
0225 #endif // OWSSERVICEMANAGER_H