1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
/** \file WriteThread.h
\brief Thread changed to open/close and write the destination file
\author alpha_one_x86
\licence GPL3, see the file COPYING */
#ifndef WRITETHREAD_H
#define WRITETHREAD_H
#include <QThread>
#include <QByteArray>
#include <QString>
#include <QMutex>
#include <QSemaphore>
#include <QCryptographicHash>
#include "Environment.h"
#include "StructEnumDefinition_CopyEngine.h"
#include "AvancedQFile.h"
/// \brief Thread changed to open/close and write the destination file
class WriteThread : public QThread
{
Q_OBJECT
public:
explicit WriteThread();
~WriteThread();
/// \brief to have semaphore to do mkpath one by one
void setMkpathTransfer(QSemaphore *mkpathTransfer);
protected:
void run();
public:
/// \brief open the destination to open it
void open(const QFileInfo &file,const uint64_t &startSize,const bool &buffer,const int &numberOfBlock,const bool &sequential);
/// \brief to return the error string
std::string errorString() const;
/// \brief to stop all
void stop();
/// \brief to write data
bool write(const QByteArray &data);
#ifdef ULTRACOPIER_PLUGIN_DEBUG
/// \brief to set the id
void setId(int id);
/// \brief get the write stat
enum WriteStat
{
Idle=0,
InodeOperation=1,
Write=2,
Close=3,
Read=5,
Checksum=6
};
WriteStat stat;
#endif
/// \brief do the fake open
void fakeOpen();
/// \brief do the fake writeIsStarted
void fakeWriteIsStarted();
/// \brief do the fake writeIsStopped
void fakeWriteIsStopped();
/// do the checksum
void startCheckSum();
/// \brief set block size in KB
bool setBlockSize(const int blockSize);
/// \brief get the last good position
int64_t getLastGoodPosition() const;
/// \brief buffer is empty
bool bufferIsEmpty();
#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
/// \brief set the current max speed in KB/s
void setMultiForBigSpeed(const int &multiForBigSpeed);
#endif
void pause();
void resume();
void reemitStartOpen();
public slots:
/// \brief start the operation
void postOperation();
/// \brief flush buffer
void flushBuffer();
/// \brief set the end is detected
void endIsDetected();
/// \brief reopen the file
void reopen();
/// \brief flush and seek to zero
void flushAndSeekToZero();
/// do the checksum
void checkSum();
void setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles);
/// \brief executed at regular interval to do a speed throling
void timeOfTheBlockCopyFinished();
void resumeNotStarted();
signals:
void error() const;
void opened() const;
void reopened() const;
void writeIsStarted() const;
void writeIsStopped() const;
void flushedAndSeekedToZero() const;
void closed() const;
void checksumFinish(const QByteArray&) const;
//internal signals
void internalStartOpen() const;
void internalStartChecksum() const;
void internalStartReopen() const;
void internalStartWrite() const;
void internalStartClose() const;
void internalStartEndOfFile() const;
void internalStartFlushAndSeekToZero() const;
/// \brief To debug source
void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
private:
std::string errorString_internal;
AvancedQFile file;
volatile bool stopIt;
volatile bool postOperationRequested;
volatile int blockSize;//only used in checksum
int numberOfBlock;
QMutex accessList; ///< For use the list
static QMultiHash<QString,WriteThread *> writeFileList;
static QMutex writeFileListMutex;
#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
QSemaphore waitNewClockForSpeed,waitNewClockForSpeed2;
volatile int numberOfBlockCopied,numberOfBlockCopied2; ///< Multiple for count the number of block copied
volatile int multiplicatorForBigSpeed; ///< Multiple for count the number of block needed
volatile int MultiForBigSpeed;
#endif
QSemaphore writeFull;
volatile bool writeFullBlocked;
QSemaphore isOpen;
QSemaphore pauseMutex;
volatile bool putInPause;
QList<QByteArray> theBlockList; ///< Store the block list
uint64_t lastGoodPosition;
QByteArray blockArray; ///< temp data for block writing, the data
int64_t bytesWriten; ///< temp data for block writing, the bytes writen
int id;
volatile bool endDetected;
uint64_t startSize;
QSemaphore *mkpathTransfer;
bool fakeMode;
bool buffer;
bool needRemoveTheFile;
volatile bool sequential;
bool deletePartiallyTransferredFiles;
#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
volatile int multiForBigSpeed; ///< Multiple for count the number of block needed
#endif
private slots:
bool internalOpen();
void internalWrite();
void internalCloseSlot();
void internalClose(bool emitSignal=true);
void internalReopen();
void internalEndOfFile();
void internalFlushAndSeekToZero();
};
#endif // WRITETHREAD_H
|