qt5base-lts/examples/network/torrent/filemanager.h
Mårten Nordheim 1a55c8d887 Torrent example: update usage of integer types
Some of the 'int's are purposefully 32-bit because that's what the
protocol is, but others aren't. So, be more explicit.

Task-number: QTBUG-110622
Pick-to: 6.5
Change-Id: I338abca1f13b0c95f49a6f52933712f43f147590
Reviewed-by: Konrad Kujawa <konrad.kujawa@qt.io>
Reviewed-by: Timur Pocheptsov <timur.pocheptsov@qt.io>
Reviewed-by: Marc Mutz <marc.mutz@qt.io>
2023-04-11 18:25:42 +01:00

107 lines
2.5 KiB
C++

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