summaryrefslogtreecommitdiff
path: root/plugins-alternative/CopyEngine/Rsync/TransferThread.h
blob: 3ee6d35015e9e1e58684e0a22ad4c70b093b426a (plain)
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