summaryrefslogtreecommitdiff
path: root/plugins/CopyEngine/Ultracopier-0.3/ListThread.h
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/CopyEngine/Ultracopier-0.3/ListThread.h')
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/ListThread.h340
1 files changed, 340 insertions, 0 deletions
diff --git a/plugins/CopyEngine/Ultracopier-0.3/ListThread.h b/plugins/CopyEngine/Ultracopier-0.3/ListThread.h
new file mode 100644
index 0000000..f053e86
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/ListThread.h
@@ -0,0 +1,340 @@
+/** \file ListThread.h
+\brief Define the list thread, and management to the action to do
+\author alpha_one_x86
+\version 0.3
+\date 2011 */
+
+#ifndef LISTTHREAD_H
+#define LISTTHREAD_H
+
+#include <QThread>
+#include <QObject>
+#include <QList>
+#include <QStringList>
+#include <QFileInfo>
+#include <QSemaphore>
+#include <QTextStream>
+#include <QFile>
+
+#include "../../../interface/PluginInterface_CopyEngine.h"
+#include "scanFileOrFolder.h"
+#include "TransferThread.h"
+#include "MkPath.h"
+#include "RmPath.h"
+#include "Environment.h"
+
+/// \brief Define the list thread, and management to the action to do
+class ListThread : public QThread
+{
+ Q_OBJECT
+public:
+ explicit ListThread(FacilityInterface * facilityInterface);
+ ~ListThread();
+ //duplication copy detection
+ /** \brief compare the current sources of the copy, with the passed arguments
+ * \param sources the sources list to compares with the current sources list
+ * \return true if have same sources, else false (or empty) */
+ bool haveSameSource(QStringList sources);
+ /** \brief compare the current destination of the copy, with the passed arguments
+ * \param destination the destination to compares with the current destination
+ * \return true if have same destination, else false (or empty) */
+ bool haveSameDestination(QString destination);
+ //external soft like file browser have send copy/move list to do
+ /** \brief send copy with destination
+ * \param sources the sources list to copy
+ * \param destination the destination to copy
+ * \return true if the copy have been accepted */
+ bool newCopy(QStringList sources,QString destination);
+ /** \brief send move without destination, ask the destination
+ * \param sources the sources list to move
+ * \param destination the destination to move
+ * \return true if the move have been accepted */
+ bool newMove(QStringList sources,QString destination);
+ /** \brief get the speed limitation
+ * < -1 if not able, 0 if disabled */
+ qint64 getSpeedLimitation();
+ /** \brief to set drives detected
+ * specific to this copy engine */
+ void setDrive(QStringList drives);
+ /// \brief to set the collision action
+ void setCollisionAction(FileExistsAction alwaysDoThisActionForFileExists);
+ /** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+ void syncTransferList();
+ /// \brief to store one action to do
+ struct actionToDoTransfer
+ {
+ quint64 id;
+ qint64 size;///< Used to set: used in case of transfer or remainingInode for drop folder
+ QFileInfo source;///< Used to set: source for transfer, folder to create, folder to drop
+ QFileInfo destination;
+ CopyMode mode;
+ bool isRunning;///< store if the action si running
+ //TransferThread * transfer; // -> see transferThreadList
+ };
+ QList<actionToDoTransfer> actionToDoListTransfer;
+ /// \brief get action type
+ enum ActionType
+ {
+ ActionType_MkPath=1,
+ ActionType_RmPath=2
+ };
+ /// \brief to store one action to do
+ struct actionToDoInode
+ {
+ ActionType type;///< \see ActionType
+ quint64 id;
+ qint64 size;///< Used to set: used in case of transfer or remainingInode for drop folder
+ QFileInfo folder;///< Used to set: source for transfer, folder to create, folder to drop
+ bool isRunning;///< store if the action si running
+ };
+ QList<actionToDoInode> actionToDoListInode;
+ QList<actionToDoInode> actionToDoListInode_afterTheTransfer;
+ int numberOfInodeOperation;
+ //dir operation thread queue
+ MkPath mkPathQueue;
+ RmPath rmPathQueue;
+ //to get the return value from copyEngine
+ bool getReturnBoolToCopyEngine();
+ QPair<quint64,quint64> getReturnPairQuint64ToCopyEngine();
+ ItemOfCopyList getReturnItemOfCopyListToCopyEngine();
+public slots:
+ //action on the copy
+ /// \brief put the transfer in pause
+ void pause();
+ /// \brief resume the transfer
+ void resume();
+ /** \brief skip one transfer entry
+ * \param id id of the file to remove */
+ void skip(const quint64 &id);
+ /** \brief skip as interanl one transfer entry
+ * \param id id of the file to remove */
+ bool skipInternal(const quint64 &id);
+ /// \brief cancel all the transfer
+ void cancel();
+ //edit the transfer list
+ /** \brief remove the selected item
+ * \param ids ids is the id list of the selected items */
+ void removeItems(const QList<int> &ids);
+ /** \brief move on top of the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsOnTop(QList<int> ids);
+ /** \brief move up the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsUp(QList<int> ids);
+ /** \brief move down the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsDown(QList<int> ids);
+ /** \brief move on bottom of the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsOnBottom(QList<int> ids);
+ /// \brief export the transfer list into a file
+ void exportTransferList(const QString &fileName);
+ /// \brief import the transfer list into a file
+ void importTransferList(const QString &fileName);
+ /// \brief set the folder local colision
+ void setFolderColision(FolderExistsAction alwaysDoThisActionForFolderExists);
+ /** \brief to set the speed limitation
+ * -1 if not able, 0 if disabled */
+ bool setSpeedLimitation(const qint64 &speedLimitation);
+ /// \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 block size in KB
+ void setBlockSize(const int blockSize);
+ /// \brief set auto start
+ void setAutoStart(const bool autoStart);
+ /// \brief set check destination folder
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ /// \brief set data local to the thread
+ void setAlwaysFileExistsAction(FileExistsAction alwaysDoThisActionForFileExists);
+ /// \brief do new actions, start transfer
+ void doNewActions_start_transfer();
+ /** \brief lunch the pre-op or inode op
+ 1) locate the next next item to do into the both list
+ 1a) optimisation posible on the mkpath/rmpath
+ 2) determine what need be lunched
+ 3) lunch it, rerun the 2)
+ */
+ void doNewActions_inode_manipulation();
+ /// \brief restart transfer if it can
+ void restartTransferIfItCan();
+
+ /// \brief update the transfer stat
+ void newTransferStat(TransferThread::TransferStat stat,quint64 id);
+private:
+ QSemaphore mkpathTransfer;
+ QString sourceDrive;
+ bool sourceDriveMultiple;
+ bool stopIt;
+ QString destinationDrive;
+ bool destinationDriveMultiple;
+ QList<scanFileOrFolder *> scanFileOrFolderThreadsPool;
+ int numberOfTransferIntoToDoList;
+ QList<TransferThread *> transferThreadList;
+ scanFileOrFolder * newScanThread(CopyMode mode);
+ quint64 bytesToTransfer;
+ quint64 bytesTransfered;
+ bool autoStart;
+ bool putInPause;
+ QList<returnActionOnCopyList> actionDone;///< to action to send to the interface
+ quint64 idIncrementNumber;///< to store the last id returned
+ qint64 actualRealByteTransfered;
+ int preOperationNumber;
+ int numberOfTranferRuning;
+ QList<quint64> orderStarted;///< list the order id
+ int maxSpeed;
+ FolderExistsAction alwaysDoThisActionForFolderExists;
+ bool checkDestinationFolderExists;
+
+ //add file transfer to do
+ quint64 addToTransfer(const QFileInfo& source,const QFileInfo& destination,const CopyMode& mode);
+ //generate id number
+ quint64 generateIdNumber();
+ //warning the first entry is accessible will copy
+ bool removeItems(quint64 id);
+ //put on top
+ bool moveOnTopItem(quint64 id);
+ //move up
+ bool moveUpItem(quint64 id);
+ //move down
+ bool moveDownItem(quint64 id);
+ //put on bottom
+ bool moveOnBottomItem(quint64 id);
+ //general transfer
+ void startGeneralTransfer();
+ //debug windows if needed
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ QTimer timerUpdateDebugDialog;
+ #endif
+ FacilityInterface * facilityInterface;
+ //temp variable for not always alocate the memory
+ int int_for_loop,int_for_internal_loop,int_for_transfer_thread_search,loop_size,loop_sub_size,loop_sub_size_transfer_thread_search,number_rm_path_moved;
+ TransferThread *temp_transfer_thread;
+ bool isFound;
+ bool updateTheStatus_listing,updateTheStatus_copying;
+ EngineActionInProgress updateTheStatus_action_in_progress;
+ QSemaphore waitConstructor,waitCancel;
+ int actionToDoListTransfer_count,actionToDoListInode_count;
+ bool doTransfer,doInode;
+ qint64 oversize,currentProgression;
+ TransferThread* currentTransferThread;
+ //memory variable for transfer thread creation
+ bool doRightTransfer;
+ bool keepDate;
+ int blockSize;
+ QStringList drives;
+ FileExistsAction alwaysDoThisActionForFileExists;
+ //to return value to the copyEngine
+ bool returnBoolToCopyEngine;
+ QPair<quint64,quint64> returnPairQuint64ToCopyEngine;
+ QList<ItemOfCopyList> returnListItemOfCopyListToCopyEngine;
+ ItemOfCopyList returnItemOfCopyListToCopyEngine;
+ //send action done timer
+ QTimer timerActionDone;
+ //send progression timer
+ QTimer timerProgression;
+private slots:
+ void scanThreadHaveFinish(bool skipFirstRemove=false);
+ void updateTheStatus();
+ void fileTransfer(const QFileInfo &sourceFileInfo,const QFileInfo &destinationFileInfo,const CopyMode &mode);
+ //mkpath event
+ void mkPathFirstFolderFinish();
+ //rmpath event
+ void rmPathFirstFolderFinish();
+ //transfer is finished
+ void transferIsFinished();
+ /** \brief put the current file at bottom in case of error
+ \note ONLY IN CASE OF ERROR */
+ void transferPutAtBottom();
+ //transfer is finished
+ void transferInodeIsClosed();
+ //debug windows if needed
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ void timedUpdateDebugDialog();
+ #endif
+ //dialog message
+ /// \note Can be call without queue because all call will be serialized
+ void fileAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFile(const QFileInfo &fileInfo,const QString &errorString);
+ /// \note Can be call without queue because all call will be serialized
+ void folderAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFolder(const QFileInfo &fileInfo,const QString &errorString);
+ //to run the thread
+ void run();
+ /// \to create transfer thread
+ void createTransferThread();
+ //mk path to do
+ quint64 addToMkPath(const QString& folder);
+ //add rm path to do
+ void addToRmPath(const QString& folder,const int& inodeToRemove);
+ //send action done
+ void sendActionDone();
+ //send progression
+ void sendProgression();
+ //send the progression
+ void syncTransferList_internal();
+signals:
+ //send information about the copy
+ void actionInProgess(EngineActionInProgress); //should update interface information on this event
+
+ void newActionOnList(const QList<returnActionOnCopyList> &);///very important, need be temporized to group the modification to do and not flood the interface
+ void syncReady();
+
+ /** \brief to get the progression for a specific file
+ * \param id the id of the transfer, id send during population the transfer list
+ * first = current transfered byte, second = byte to transfer */
+ void pushFileProgression(const QList<ProgressionItem> &progressionList);
+ //get information about the copy
+ /** \brief to get the general progression
+ * first = current transfered byte, second = byte to transfer */
+ void pushGeneralProgression(const quint64 &,const quint64 &);
+
+ void newFolderListing(const QString &path);
+ void newCollisionAction(QString action);
+ void newErrorAction(QString action);
+ void isInPause(bool);
+
+ void cancelAll();
+
+ //send error occurred
+ void error(QString path,quint64 size,QDateTime mtime,QString error);
+ //for the extra logging
+ void rmPath(QString path);
+ void mkPath(QString path);
+ /// \brief To debug source
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ void debugInformation(DebugLevel level,QString fonction,QString text,QString file,int ligne);
+ #endif
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ void updateTheDebugInfo(QStringList,QStringList,int);
+ #endif
+
+ //other signal
+ /// \note Can be call without queue because all call will be serialized
+ void send_fileAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread);
+ /// \note Can be call without queue because all call will be serialized
+ void send_errorOnFile(QFileInfo fileInfo,QString errorString,TransferThread * thread);
+ /// \note Can be call without queue because all call will be serialized
+ void send_folderAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,scanFileOrFolder * thread);
+ /// \note Can be call without queue because all call will be serialized
+ void send_errorOnFolder(QFileInfo fileInfo,QString errorString,scanFileOrFolder * thread);
+ //send the progression
+ void send_syncTransferList();
+ //mkpath error event
+ void mkPathErrorOnFolder(QFileInfo fileInfo,QString errorString);
+ //rmpath error event
+ void rmPathErrorOnFolder(QFileInfo fileInfo,QString errorString);
+ //to close
+ void tryCancel();
+ //to ask new transfer thread
+ void askNewTransferThread();
+
+ void warningTransferList(QString warning);
+ void errorTransferList(QString error);
+};
+
+#endif // LISTTHREAD_H