File indexing completed on 2024-04-28 15:39:05

0001 // SPDX-FileCopyrightText: 2020-2022 Tobias Leupold <tl at stonemx dot de>
0002 //
0003 // SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 
0005 #ifndef ELEVATIONENGINE_H
0006 #define ELEVATIONENGINE_H
0007 
0008 // Qt includes
0009 #include <QObject>
0010 #include <QHash>
0011 #include <QVector>
0012 
0013 // Local classes
0014 class Settings;
0015 class Coordinates;
0016 
0017 // Qt classes
0018 class QNetworkAccessManager;
0019 class QNetworkReply;
0020 class QTimer;
0021 
0022 class ElevationEngine : public QObject
0023 {
0024     Q_OBJECT
0025 
0026 public:
0027     enum Target {
0028         Image,
0029         Bookmark
0030     };
0031 
0032     explicit ElevationEngine(QObject *parent, Settings *settings);
0033     void request(Target target, const QVector<QString> &ids,
0034                  const QVector<Coordinates> &coordinates);
0035 
0036 Q_SIGNALS:
0037     void lookupFailed(const QString &errorMessage);
0038     void notAllPresent(int locationsCount, int elevationsCount);
0039     void elevationProcessed(Target target, const QVector<QString> &ids,
0040                             const QVector<double> &elevations);
0041 
0042 private Q_SLOTS:
0043     void processNextRequest();
0044     void cleanUpRequest(QNetworkReply *request);
0045     void processReply(QNetworkReply *reply);
0046 
0047 private: // Functions
0048     void removeRequest(QNetworkReply *request);
0049 
0050 private: // Variables
0051     struct RequestData
0052     {
0053         Target target;
0054         QVector<QString> ids;
0055     };
0056 
0057     Settings *m_settings;
0058 
0059     QNetworkAccessManager *m_manager;
0060 
0061     QTimer *m_requestTimer;
0062     QVector<Target> m_queuedTargets;
0063     QVector<QVector<QString>> m_queuedIds;
0064     QVector<QString> m_queuedLocations;
0065 
0066     QHash<QNetworkReply *, RequestData> m_requests;
0067 
0068 };
0069 
0070 #endif // ELEVATIONENGINE_H