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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
|
/** \file TransferThread.h
\brief Thread changed to manage the inode operation, the signals, canceling, pre and post operations
\author alpha_one_x86
\version 0.3
\date 2011 */
#ifndef TRANSFERTHREAD_H
#define TRANSFERTHREAD_H
#include <QThread>
#include <QFileInfo>
#include <QString>
#include <QList>
#include <QStringList>
#include <QDateTime>
#include <QDir>
#include "ReadThread.h"
#include "WriteThread.h"
#include "Environment.h"
#include "StructEnumDefinition_CopyEngine.h"
/// \brief Thread changed to manage the inode operation, the signals, canceling, pre and post operations
class TransferThread : public QThread
{
Q_OBJECT
public:
explicit TransferThread();
~TransferThread();
/// \brief get transfer stat
TransferStat getStat();
/// \brief get drive of an file or folder
QString getDrive(QString fileOrFolder);
/// \brief set drive list, used in getDrive()
void setDrive(QStringList drives);
#ifdef ULTRACOPIER_PLUGIN_DEBUG
/// \brief to set the id
void setId(int id);
/// \brief get the reading letter
QChar readingLetter();
/// \brief get the writing letter
QChar writingLetter();
#endif
/// \brief to have semaphore, and try create just one by one
void setMkpathTransfer(QSemaphore *mkpathTransfer);
/// \brief to store the transfer id
quint64 transferId;
/// \brief to store the transfer size
quint64 transferSize;
void set_doChecksum(bool doChecksum);
void set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible);
void set_checksumOnlyOnError(bool checksumOnlyOnError);
void set_osBuffer(bool osBuffer);
void set_osBufferLimited(bool osBufferLimited);
//not copied size, because that's count to the checksum, ...
quint64 realByteTransfered();
protected:
void run();
signals:
//to send state
void preOperationStopped();
void checkIfItCanBeResumed();
//void transferStarted();//not sended (and not used then)
void readStopped();
void writeStopped();
void postOperationStopped();
//get dialog
void fileAlreadyExists(QFileInfo,QFileInfo,bool isSame);
void errorOnFile(QFileInfo,QString);
//internal signal
void internalStartPostOperation();
void internalStartPreOperation();
void internalStartResumeAfterErrorAndSeek();
/// \brief To debug source
void debugInformation(DebugLevel level,QString fonction,QString text,QString file,int ligne);
void tryPutAtBottom();
//force into the right thread
void internalTryStartTheTransfer();
/// \brief update the transfer stat
void pushStat(TransferStat,quint64);
public slots:
/// \brief to start the transfer of data
void startTheTransfer();
/// \brief to set files to transfer
void setFiles(const QString &source,const qint64 &size,const QString &destination,const CopyMode &mode);
/// \brief to set file exists action to do
void setFileExistsAction(const FileExistsAction &action);
/// \brief to set the new name of the destination
void setFileRename(const QString &nameForRename);
/// \brief to start the transfer of data
void setAlwaysFileExistsAction(const FileExistsAction &action);
/// \brief set the copy info and options before runing
void setRightTransfer(const bool doRightTransfer);
/// \brief set keep date
void setKeepDate(const bool keepDate);
/// \brief set the current max speed in KB/s
void setMaxSpeed(int maxSpeed);
/// \brief set block size in KB
bool setBlockSize(const unsigned int blockSize);
/// \brief pause the copy
void pause();
/// \brief resume the copy
void resume();
/// \brief stop the copy
void stop();
/// \brief skip the copy
void skip();
/// \brief retry after error
void retryAfterError();
/// \brief return info about the copied size
qint64 copiedSize();
/// \brief put the current file at bottom
void putAtBottom();
/// \brief set rsync
void setRsync(const bool rsync);
void set_osBufferLimit(unsigned int osBufferLimit);
void setRenamingRules(QString firstRenamingRule,QString otherRenamingRule);
private slots:
void preOperation();
void readIsReady();
void writeIsReady();
void readIsFinish();
void writeIsFinish();
void readIsClosed();
void writeIsClosed();
void postOperation();
void getWriteError();
void getReadError();
void readChecksumFinish(const QByteArray&);
void writeChecksumFinish(const QByteArray&);
void compareChecksum();
//void syncAfterErrorAndReadFinish();
void readThreadIsSeekToZeroAndWait();
void writeThreadIsReopened();
void readThreadResumeAfterError();
//to filter the emition of signal
void readIsStopped();
void writeIsStopped();
//speed limitation
void timeOfTheBlockCopyFinished();
//force into the right thread
void internalStartTheTransfer();
private:
enum MoveReturn
{
MoveReturn_skip=0,
MoveReturn_moved=1,
MoveReturn_error=2
};
TransferStat transfer_stat;
ReadThread readThread;
WriteThread writeThread;
QString source;
QString destination;
CopyMode mode;
QTimer clockForTheCopySpeed; ///< For the speed throttling
bool doRightTransfer;
bool keepDate;
bool readIsReadyVariable;
bool writeIsReadyVariable;
bool readIsOpenVariable;
bool writeIsOpenVariable;
bool readIsFinishVariable;
bool writeIsFinishVariable;
bool readIsClosedVariable;
bool writeIsClosedVariable;
bool canBeMovedDirectlyVariable;
bool rsync;
QByteArray sourceChecksum,destinationChecksum;
volatile bool stopIt;
volatile bool canStartTransfer;
int blockSize;
bool retry;
QFileInfo sourceInfo;
QFileInfo destinationInfo;
QStringList mountSysPoint;
qint64 size;
FileExistsAction fileExistsAction;
FileExistsAction alwaysDoFileExistsAction;
bool needSkip,needRemove;
QDateTime maxTime;
int id;
QSemaphore *mkpathTransfer;
bool doChecksum,real_doChecksum;
bool checksumIgnoreIfImpossible;
bool checksumOnlyOnError;
bool osBuffer;
bool osBufferLimited;
unsigned int osBufferLimit;
QString firstRenamingRule;
QString otherRenamingRule;
//error management
bool writeError,writeError_source_seeked,writeError_destination_reopened;
bool readError;
bool fileContentError;
//different pre-operation
bool isSame();
bool destinationExists();
bool canBeMovedDirectly();
void tryMoveDirectly();
void ifCanStartTransfer();
//fonction to edit the file date time
bool changeFileDateTime(const QString &source,const QString &destination);
void resetExtraVariable();
//error management function
void resumeTransferAfterWriteError();
//to send state
bool sended_state_preOperationStopped;
bool sended_state_readStopped;
bool sended_state_writeStopped;
//different post-operation
bool checkIfAllIsClosed();
bool doFilePostOperation();
//different pre-operation
void tryOpen();
};
#endif // TRANSFERTHREAD_H
|