// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR BSD-3-Clause #ifndef FILEMANAGER_H #define FILEMANAGER_H #include #include #include #include #include #include "metainfo.h" QT_BEGIN_NAMESPACE class QByteArray; class QFile; class QTimerEvent; QT_END_NAMESPACE class FileManager : public QThread { Q_OBJECT public: FileManager(QObject *parent = nullptr); virtual ~FileManager(); inline void setMetaInfo(const MetaInfo &info) { metaInfo = info; } inline void setDestinationFolder(const QString &directory) { destinationPath = directory; } int read(int pieceIndex, int offset, int length); void write(int pieceIndex, int offset, const QByteArray &data); void verifyPiece(int pieceIndex); inline qint64 totalSize() const { return totalLength; } inline int pieceCount() const { return numPieces; } int pieceLengthAt(int pieceIndex) const; QBitArray completedPieces() const; void setCompletedPieces(const QBitArray &pieces); QString errorString() const; public slots: void startDataVerification(); signals: void dataRead(int id, int pieceIndex, int offset, const QByteArray &data); void error(); void verificationProgress(int percent); void verificationDone(); void pieceVerified(int pieceIndex, bool verified); protected: void run() override; private slots: bool verifySinglePiece(int pieceIndex); void wakeUp(); private: bool generateFiles(); QByteArray readBlock(int pieceIndex, int offset, int length); bool writeBlock(int pieceIndex, int offset, const QByteArray &data); void verifyFileContents(); struct WriteRequest { int pieceIndex; int offset; QByteArray data; }; struct ReadRequest { int pieceIndex; int offset; int length; int id; }; QString errString; QString destinationPath; MetaInfo metaInfo; QList files; QList sha1s; QBitArray verifiedPieces; bool newFile; int pieceLength; qint64 totalLength; int numPieces; int readId; bool startVerification; bool quit; bool wokeUp; QList writeRequests; QList readRequests; QList pendingVerificationRequests; QList newPendingVerificationRequests; QList fileSizes; mutable QMutex mutex; mutable QWaitCondition cond; }; #endif