#ifndef CHEAT_REPOSITORY_H #define CHEAT_REPOSITORY_H #include #include #include #include #include #include #include #include #include class QNetworkReply; namespace Cheats { struct RemoteFile { QString name; QString title; QString version; QString format; [[nodiscard]] bool IsSupported() const; [[nodiscard]] QUrl Url() const; }; struct CatalogResult { QList files; QString error; }; [[nodiscard]] CatalogResult ParseIndex(const QByteArray& data, const QString& format, const QString& title_id); class CheatRepository final: public QObject { Q_OBJECT public: explicit CheatRepository(QObject* parent = nullptr); void Load(const QString& title_id); void Fetch(const RemoteFile& file); void CancelFetch(); signals: void CatalogLoaded(QList files, QString error); void FileLoaded(QByteArray data, QString error); private: QNetworkReply* Request(const QUrl& url, qint64 limit, std::function complete); QNetworkAccessManager m_network; QList m_catalog_replies; QPointer m_file_reply; QList m_files; QStringList m_errors; int m_catalog_generation = 0; int m_fetch_generation = 0; int m_pending = 0; }; } // namespace Cheats #endif // CHEAT_REPOSITORY_H