/* * This file is part of the Flowee project * Copyright (C) 2022 Tom Zander * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef PRICEHISTORYDATAPROVIDER_H #define PRICEHISTORYDATAPROVIDER_H #include #include #include #include #include #include class PriceHistoryDataProvider : public QObject { Q_OBJECT public: explicit PriceHistoryDataProvider(const QString &basedir, const QString ¤cy, QObject *parent = nullptr); void addPrice(const QString ¤cy, uint32_t timestamp, int price); Q_INVOKABLE int historicalPrice(const QDateTime ×tamp) const { return historicalPrice(timestamp.toTime_t()); } int historicalPrice(uint32_t timestamp) const; QString currencyName() const; void setCurrency(const QString &newCurrency); /** * Adding values may trigger the 'processLog' method * automatically unless this value is set to false. * Default is true. */ void setAllowLogCompression(bool newAllowLogCompression); bool allowLogCompression() const; /// if there is no historical data, try to populate it void initialPopulate(); public slots: void processLog(); private: QString m_currency; struct Currency { // a single currency and historical things we know about it. QString id; ///< the language ID (EUR/USD etc) Streaming::ConstBuffer valueBlob; // a raw list of time/value pairs. /// a append-only list of time/value pairs (as stored in the log file) std::vector > logValues; /// the log file where we append newly queries currency values QFile *log = nullptr; }; const Currency *currencyData(const QString &name) const; enum AutoCreate { FetchOnly, FetchOrCreate }; Currency *currencyData(const QString &name, AutoCreate autoCreate); std::vector m_currencies; QString m_basedir; bool m_allowLogCompression = true; }; class InitialHistoryFetcher : public QObject { Q_OBJECT public: explicit InitialHistoryFetcher(QObject *parent = nullptr); void fetch(const QString &path, const QString ¤cy); signals: void success(const QString ¤cy); private: QNetworkAccessManager m_network; }; #endif