diff options
Diffstat (limited to 'plugins-alternative/CopyEngine/Rsync/ReadThread.h')
-rw-r--r-- | plugins-alternative/CopyEngine/Rsync/ReadThread.h | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/plugins-alternative/CopyEngine/Rsync/ReadThread.h b/plugins-alternative/CopyEngine/Rsync/ReadThread.h new file mode 100644 index 0000000..1d1eabc --- /dev/null +++ b/plugins-alternative/CopyEngine/Rsync/ReadThread.h @@ -0,0 +1,144 @@ +/** \file ReadThread.h +\brief Thread changed to open/close and read the source file +\author alpha_one_x86 +\version 0.3 +\date 2011 */ + +#ifndef READTHREAD_H +#define READTHREAD_H + +#include <QThread> +#include <QByteArray> +#include <QSemaphore> +#include <QTimer> +#include <QDateTime> +#include <QFileInfo> +#include <QCryptographicHash> + +#include "WriteThread.h" +#include "Environment.h" +#include "StructEnumDefinition_CopyEngine.h" +#include "AvancedQFile.h" + +/// \brief Thread changed to open/close and read the source file +class ReadThread : public QThread +{ + Q_OBJECT +public: + explicit ReadThread(); + ~ReadThread(); +protected: + void run(); +public: + /// \brief open with the name and copy mode + void open(const QString &name,const CopyMode &mode); + /// \brief return the error string + QString errorString(); + //QByteArray read(qint64 position,qint64 maxSize); + /// \brief stop the copy + void stop(); + /// \brief put the copy in pause + bool pause(); + /// \brief resume the copy + void resume(); + /// \brief get the size of the source file + qint64 size(); + /// \brief get the last good position + qint64 getLastGoodPosition(); + /// \brief start the reading of the source file + void startRead(); + /// \brief set the current max speed in KB/s + int setMaxSpeed(int maxSpeed); + /// \brief set block size in KB + bool setBlockSize(const int blockSize); + /// \brief reopen after an error + void reopen(); + /// \brief set the write thread + void setWriteThread(WriteThread * writeThread); + #ifdef ULTRACOPIER_PLUGIN_DEBUG + /// \brief to set the id + void setId(int id); + /// \brief stat + enum ReadStat + { + Idle=0, + InodeOperation=1, + Read=2, + WaitWritePipe=3, + Checksum=4 + }; + ReadStat stat; + #endif + /// \brief return if it's reading + bool isReading(); + /// \brief executed at regular interval to do a speed throling + void timeOfTheBlockCopyFinished(); + /// \brief do the fake open + void fakeOpen(); + /// \brief do the fake readIsStarted + void fakeReadIsStarted(); + /// \brief do the fake readIsStopped + void fakeReadIsStopped(); + /// do the checksum + void startCheckSum(); +public slots: + /// \brief to reset the copy, and put at the same state when it just open + void seekToZeroAndWait(); + void postOperation(); + /// do the checksum + void checkSum(); +signals: + void error(); + void isInPause(); + void opened(); + void readIsStarted(); + void readIsStopped(); + void closed(); + void isSeekToZeroAndWait(); + void checkIfIsWait(); + void resumeAfterErrorByRestartAll(); + void resumeAfterErrorByRestartAtTheLastPosition(); + void checksumFinish(const QByteArray&); + // internal signals + void internalStartOpen(); + void internalStartChecksum(); + void internalStartReopen(); + void internalStartRead(); + void internalStartClose(); + /// \brief To debug source + void debugInformation(DebugLevel level,QString fonction,QString text,QString file,int ligne); + +private: + QString name; + QString errorString_internal; + AvancedQFile file; + volatile bool stopIt; + CopyMode mode; + qint64 lastGoodPosition; + volatile int blockSize; + volatile int maxSpeed; ///< The max speed in KB/s, 0 for no limit + QSemaphore waitNewClockForSpeed; + volatile int numberOfBlockCopied; ///< Multiple for count the number of block copied + volatile int multiplicatorForBigSpeed; ///< Multiple for count the number of block needed + volatile int MultiForBigSpeed; + WriteThread* writeThread; + int id; + QSemaphore isOpen; + volatile bool putInPause; + volatile bool isInReadLoop; + volatile bool seekToZero; + volatile bool tryStartRead; + qint64 size_at_open; + QDateTime mtime_at_open; + bool fakeMode; + //internal function + bool seek(qint64 position);/// \todo search if is use full +private slots: + bool internalOpen(bool resetLastGoodPosition=true); + bool internalReopen(); + void internalRead(); + void internalClose(bool callByTheDestructor=false); + void isInWait(); +}; + +#endif // READTHREAD_H |