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
| /***************************************************************************
CopyThread.h
-------------------
Begin : Fri Dec 21 2007 22:42 alpha_one_x86
Project : Ultracopier
Email : alpha.super-one@laposte.net
Note : See README for copyright and developer
Target : Define the class of the copyThread
****************************************************************************/
#include "env.h"
#ifndef COPY_THREAD_H
#define COPY_THREAD_H
#include <QThread>
#include <QFile>
#include <QDir>
#include <QWaitCondition>
#include <QMutex>
#include <QTimer>
#include <QTime>
#include <QCryptographicHash>
#include <QByteArray>
#include <QMutexLocker>
#include "WriteThread.h"
/** \brief Thread for do the copy.
This thread do the copy, it store the permanently options, and use shared memory for get and set the variable, and use signal/slot for the events.
*/
class copyThread : public QThread
{
Q_OBJECT
public slots:
//add one entry to source dir list
void addEntryToDirList(const QString& theDir);
//add one entry to empty dir destination list
void addEntryToEmptyDestinationDirList(const QString& theDir);
//set the copy info and options before runing
void setRightCopy(const int doRightCopy);
//set keep date
void setKeepDate(const int);
//set the current max speed in KB/s
void setMaxSpeed(int tempMaxSpeed);
//set if in copy or move mode
void setMovingMode(const bool setMove);
//set block size
bool setBlockSize(const int block=64);
//set prealoc file size
void setPreallocateFileSize(const bool prealloc);
//add item to list
void addToList(quint64 id,const QString& source,qint64 size,const QString& destination);
//pause the copy
void pauseCopy();
//resume the copy
void resumeCopy();
//stop the current copy
void stopTheCopy();
//skip the current file
void skipCurrentFile();
//return the progression percent
int getProgressionPercent(const int max=100);
//return the progression percent
int getProgressionPercentTotal(const int max=100);
//get copy speed in byte per second
QString getCopySpeed();
//set thread write
void setThreadWrite(int useWriteThread);
//insert at end without count
void insterAtEndWithoutCount(copyItemInternal theItem);
public:
enum currentStat {
Stopped,
Paused,
Running
}; ///< Enumeration for have copy state
//the contructor
copyThread();
//the desytructor
~copyThread();
/// \brief set action on file exist
void fileExistsAction(int action);
/// \brief set action on error
void errorAction(int action);
/// \brief get current file copied as String as Name and
QString getCurrentFileCopied();
/// \brief return text overall
QString getTextOverall();
/// \brief lenght of copy list
int lenghtOfCopyList();
/// \brief number of item removed
int getNumberOfItemRemoved();
/// \brief return the statut
currentStat getCurrentStat();
/// \brief Return string for the
static QString intToQtringSize(qint64 num);
//remove one entry
void removeItems(QList<int> ids);
//put on top
returnIdsTransaction putOnTop(QList<int> ids);
//move up
returnIdsTransaction moveUp(QList<int> ids);
//move down
returnIdsTransaction moveDown(QList<int> ids);
//put on bottom
returnIdsTransaction putOnBottom(QList<int> ids);
signals:
/// \brief error on file or folder, bouton enable, file path, error message
void errorOnFile(int,QString,QString);
/// \brief signal emited when file is same
void fileIsSame(QString);
/// \brief signal emited when file exists, Source, Destination
void fileIsExists(QString,QString);
protected:
void run();
void stop();
private:
// Remove all the empty source folder
void removeAllFolderEmpty(const QString& TheDir);
//try open file in special mode
bool tryOpenFileInSpecialMode(QFile *theFile,QIODevice::OpenMode theModeShouldBeUsed);
//remove source folder and create destination folder
void flush();
volatile bool stopped;
volatile bool waitInPause; ///< Wait in pause the thread
volatile bool stopIt; ///< For store the stop query
QString errorMessageInCopy; ///< The message error
qint64 totalCopiedSize; ///< The copied, read or manipuled size
qint64 previousSizeReturned; ///< Previous size returned
qint64 firstScanTot; ///< Store total size at first scan
qint64 firstScanCur; ///< Store curent size at first scan
volatile int maxSpeed; ///< The max speed in MB/s, 0 for no limit
volatile bool RightCopy; ///< Do rights copy
volatile bool movingMode; ///< Set if is in moving mode
volatile bool tooLateForWait; ///< Flag for know if it's too late for wait the next timer time out
volatile bool preallocation; ///< Flag for know if need preallocation
volatile bool keepDate; ///< For keep date file
volatile bool useWriteThread; ///< For set fi need write thread
QTime intervalCopySpeed; ///< For detect the interval beteew 2 copy speed mesurement
volatile int actionAfterUnlock; ///< For action after unlock the mutex
QList<QString> sourceDirList; ///< List of source dir for delete it in moving mode
QList<QString> emptyDestDir; ///< List of empty destination should be created
QTimer clockForTheCopySpeed; ///< For the speed throttling
QWaitCondition waitTimerIsEnd; ///< For wait a event for speed limitation
QWaitCondition controlMutex; ///< For stop/pause/resume copy
QMutex mutexWait; ///< For use the mutex to speed limitation
QMutex mutexWaitControl; ///< For use the mutex to control the copy
volatile int MultForBigSpeed; ///< Multiple for count the number of block needed
volatile int numberOfBlockCopied;///< Multiple for count the number of block copied
volatile int blockSizeCurrent; ///< The current size of the buffer
currentStat theCurrentStat; ///< The current stat
QFile *sourceFile; ///< For have global copie progression
QFile *destinationFile; ///< For have global copie progression
QMutex MultiThreadCopyList; ///< For be thread safe while operate on copy list
QMutex ErrorWaitAction; ///< For prevent multithread bug when error
int numberOfItemRemoved; ///< For unmber of item removed
int NumberOfFileTot; ///< For number of file to copy
int NumberOfFileCopied; ///< For number of file to copied
QString syntetizedStringCurrentFile;///< For store sytetized string for current file
QString syntetizedStringOverall;///< For store sytetized string for overall
bool copyHadBegin; ///< Store if copy had begin
bool skipThecurrentFile; ///< Skip the current file
// for copy list
QList<copyItemInternal> theCopyList;
private slots:
void timeOfTheBlockCopyFinished();
void pre_operation();
void post_operation();
};
#endif |
Partager