summaryrefslogtreecommitdiff
path: root/plugins/CopyEngine
diff options
context:
space:
mode:
authorThomas Preud'homme <robotux@celest.fr>2013-01-04 14:50:19 +0100
committerThomas Preud'homme <robotux@celest.fr>2013-01-04 14:50:19 +0100
commit8f9f382e1c97cab2e72e97495650c73ac4b97314 (patch)
tree78510a0d81368c09b56f444fb19bb132c8bc3009 /plugins/CopyEngine
Imported Upstream version 0.3.0.5
Diffstat (limited to 'plugins/CopyEngine')
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/AvancedQFile.cpp94
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/AvancedQFile.h32
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/CompilerInfo.h1
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/DebugEngineMacro.h25
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Environment.h12
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/ar/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/de/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/el/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/es/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/fr/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/hi/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/id/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/it/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/ja/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/nl/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/no/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/pl/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/pt/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/ru/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/th/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/tr/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/zh/translation.ts459
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/ListThread.cpp1479
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/ListThread.h340
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/ListThread_InodeAction.cpp54
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/MkPath.cpp100
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/MkPath.h56
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/ReadThread.cpp513
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/ReadThread.h137
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/RmPath.cpp127
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/RmPath.h56
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/StructEnumDefinition.h1
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/StructEnumDefinition_CopyEngine.h51
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/TransferThread.cpp977
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/TransferThread.h202
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Variable.h33
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/WriteThread.cpp344
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/WriteThread.h114
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/copyEngine-collision-and-error.cpp565
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/copyEngine.cpp492
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/copyEngine.h293
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/copyEngine.pro68
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/debugDialog.cpp70
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/debugDialog.h40
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/debugDialog.ui100
-rwxr-xr-xplugins/CopyEngine/Ultracopier-0.3/documentation.dox41
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/factory.cpp239
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/factory.h81
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.cpp78
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.h45
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.ui220
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.cpp176
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.h56
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.ui367
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.cpp143
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.h53
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.ui192
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.cpp96
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.h50
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.ui282
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/informations.xml27
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/options.ui149
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/scanFileOrFolder.cpp235
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/scanFileOrFolder.h69
64 files changed, 16778 insertions, 0 deletions
diff --git a/plugins/CopyEngine/Ultracopier-0.3/AvancedQFile.cpp b/plugins/CopyEngine/Ultracopier-0.3/AvancedQFile.cpp
new file mode 100644
index 0000000..af5805b
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/AvancedQFile.cpp
@@ -0,0 +1,94 @@
+/** \file AvancedQFile.cpp
+\brief Define the QFile herited class to set file date/time
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include "AvancedQFile.h"
+
+#ifdef Q_CC_GNU
+//this next header is needed to change file time/date under gcc
+#include <utime.h>
+#include <errno.h>
+#endif
+
+//source
+//hSrc=CreateFile(pData->pfiSrcFile->GetFullFilePath(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffer ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL);
+//destination
+//hDst=CreateFile(pData->strDstFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffer ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL);
+
+bool AvancedQFile::setCreated(QDateTime time)
+{
+ time_t ctime=time.toTime_t();
+ #ifdef Q_CC_GNU
+ //creation time not exists into unix world
+ Q_UNUSED(ctime)
+ return true;
+ #else
+ setErrorString(tr("Not supported on this platform"));
+ return false;
+ #endif
+}
+
+bool AvancedQFile::setLastModified(QDateTime time)
+{
+ time_t actime=QFileInfo(*this).lastRead().toTime_t();
+ //protect to wrong actime
+ if(actime<0)
+ actime=0;
+ time_t modtime=time.toTime_t();
+ if(modtime<0)
+ {
+ setErrorString(tr("Last modified date is wrong"));
+ return false;
+ }
+ #ifdef Q_CC_GNU
+ //this function avalaible on unix and mingw
+ utimbuf butime;
+ butime.actime=actime;
+ butime.modtime=modtime;
+ int returnVal=utime(this->fileName().toLocal8Bit().data(),&butime);
+ if(returnVal==0)
+ return true;
+ else
+ {
+ setErrorString(strerror(errno));
+ return false;
+ }
+ #else
+ setErrorString(tr("Not supported on this platform"));
+ return false;
+ #endif
+}
+
+bool AvancedQFile::setLastRead(QDateTime time)
+{
+ time_t modtime=QFileInfo(*this).lastModified().toTime_t();
+ //protect to wrong actime
+ if(modtime<0)
+ modtime=0;
+ time_t actime=time.toTime_t();
+ if(actime<0)
+ {
+ setErrorString(tr("Last access date is wrong"));
+ return false;
+ }
+ #ifdef Q_CC_GNU
+ //this function avalaible on unix and mingw
+ utimbuf butime;
+ butime.actime=actime;
+ butime.modtime=modtime;
+ int returnVal=utime(this->fileName().toLocal8Bit().data(),&butime);
+ if(returnVal==0)
+ return true;
+ else
+ {
+ setErrorString(strerror(errno));
+ return false;
+ }
+ #else
+ setErrorString(tr("Not supported on this platform"));
+ return false;
+ #endif
+}
+
diff --git a/plugins/CopyEngine/Ultracopier-0.3/AvancedQFile.h b/plugins/CopyEngine/Ultracopier-0.3/AvancedQFile.h
new file mode 100644
index 0000000..284cf02
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/AvancedQFile.h
@@ -0,0 +1,32 @@
+/** \file AvancedQFile.h
+\brief Define the QFile herited class to set file date/time
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#ifndef AVANCEDQFILE_H
+#define AVANCEDQFILE_H
+
+#include <QFile>
+#include <QDateTime>
+#include <QFileInfo>
+
+/// \brief devired class from QFile to set time/date on file
+class AvancedQFile : public QFile
+{
+ Q_OBJECT
+public:
+ /// \brief set created date, not exists in unix world
+ bool setCreated(QDateTime time);
+ /// \brief set last modification date
+ bool setLastModified(QDateTime time);
+ /// \brief set last read date
+ bool setLastRead(QDateTime time);
+
+/* //fileName
+ void close();
+ bool open ( FILE * fh, OpenMode mode )
+ bool open ( int fd, OpenMode mode )*/
+};
+
+#endif // AVANCEDQFILE_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/CompilerInfo.h b/plugins/CopyEngine/Ultracopier-0.3/CompilerInfo.h
new file mode 100644
index 0000000..84625b9
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/CompilerInfo.h
@@ -0,0 +1 @@
+#include "../../../CompilerInfo.h"
diff --git a/plugins/CopyEngine/Ultracopier-0.3/DebugEngineMacro.h b/plugins/CopyEngine/Ultracopier-0.3/DebugEngineMacro.h
new file mode 100644
index 0000000..ad08d4f
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/DebugEngineMacro.h
@@ -0,0 +1,25 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+/// \brief Macro for the debug log
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+ #if defined (__FILE__) && defined (__LINE__)
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) emit debugInformation(a,__func__,b,__FILE__,__LINE__)
+ #else
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) emit debugInformation(a,__func__,b)
+ #endif
+#else // ULTRACOPIER_PLUGIN_DEBUG
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) void()
+#endif // ULTRACOPIER_PLUGIN_DEBUG
+
+#endif // DEBUGENGINEMACRO_H
+
+
+
+
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Environment.h b/plugins/CopyEngine/Ultracopier-0.3/Environment.h
new file mode 100644
index 0000000..7ac6f16
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Environment.h
@@ -0,0 +1,12 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "StructEnumDefinition_CopyEngine.h"
+#include "DebugEngineMacro.h"
+#include "CompilerInfo.h"
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/ar/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/ar/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/ar/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/de/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/de/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/de/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/el/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/el/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/el/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/es/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/es/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/es/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/fr/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/fr/translation.ts
new file mode 100644
index 0000000..dcf87c6
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/fr/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr" sourcelanguage="en">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation>Non supporté sur cette plateforme</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation>Date de dernière modification du fichier fausse</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation>Date du dernier accès au fichier fausse</translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="52"/>
+ <source>Unable to create the folder</source>
+ <translation>Impossible de créer le répertoire</translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="234"/>
+ <source>Unable to read the source file: </source>
+ <translation>Impossible de lire le fichier source: </translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="52"/>
+ <source>Unable to remove the folder</source>
+ <translation>Impossible de supprimer le répertoire</translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation>Copie de </translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation>Choisir le répertoire source</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation>Sélectionnez un ou plusieurs fichiers à ouvrir</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation>Tous les fichiers</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation>Selectionnez le répertoire de destination</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation>Demander</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation>Passer</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation>Ecraser</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation>Ecraser si plus récent</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if the last modification dates are different</source>
+ <translation>Ecraser si les dates de modifications sont différentes</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation>Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation>Mettre à la fin de la liste</translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation>Erreur sur le fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation>Nom de fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation>&amp;Toujours effectuer cette action</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation>Mettre à la fin</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation>Réessayer</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Passer</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation>Le fichier existe</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation>Source</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation>Destination</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation>Nom de fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggérer un &amp;nouveau nom</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation>&amp;Toujours effectuer cette action</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation>&amp;Ecraser</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Passer</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation>Ecraser si plus récent</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation>Ecraser si la date de modification est différente</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation>Copie de </translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation>Ces fichiers sont identiques</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation>La source et la destination sont identiques</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation>Nom de fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggérer un &amp;nouveau nom</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation>&amp;Toujours effectuer cette action</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Passer</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation>Copie de </translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation>Les répertoires sont identiques</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation>Source</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation>Destination</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation>La source et la destination sont identiques</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation>Nom de répertoire</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggérer un &amp;nouveau nom</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation>&amp;Toujours effectuer cette action</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation>Fusionner</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation>Passer</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation>Copie de </translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation>Transférer les droits des fichiers</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation>Garder la date du fichier</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation>En cas d&apos;erreur de répertoire</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation>Demander</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation>Passer</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation>Fusionner</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation>Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation>Vérifier si le répertoire de destination existe</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation>Taille de block</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation>Ko</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation>Démmarer automatiquement le transfert</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder collision</source>
+ <translation>Lors d&apos;une collision de dossier</translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation>Copie de </translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation>Le répertoire n&apos;existe pas</translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation>Le répertoire n&apos;est pas lisible</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/hi/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/hi/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/hi/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/id/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/id/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/id/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/it/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/it/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/it/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/ja/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/ja/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/ja/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/nl/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/nl/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/nl/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/no/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/no/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/no/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/pl/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/pl/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/pl/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/pt/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/pt/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/pt/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/ru/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/ru/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/ru/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/th/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/th/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/th/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/tr/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/tr/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/tr/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Languages/zh/translation.ts b/plugins/CopyEngine/Ultracopier-0.3/Languages/zh/translation.ts
new file mode 100644
index 0000000..1c3692c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Languages/zh/translation.ts
@@ -0,0 +1,459 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="17"/>
+ <location filename="../../AvancedQFile.cpp" line="48"/>
+ <location filename="../../AvancedQFile.cpp" line="79"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="31"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="62"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="51"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="231"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="51"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="281"/>
+ <location filename="../../TransferThread.cpp" line="282"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="124"/>
+ <location filename="../../copyEngine.cpp" line="141"/>
+ <source>Select destination directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="188"/>
+ <location filename="../../copyEngine.cpp" line="201"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="189"/>
+ <location filename="../../copyEngine.cpp" line="202"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="190"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="191"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="192"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="193"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="203"/>
+ <source>Put to end of the list</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="225"/>
+ <source>Select source directory</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="239"/>
+ <source>Select one or more files to open</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="241"/>
+ <source>All files</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="70"/>
+ <location filename="../../fileExistsDialog.cpp" line="71"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="66"/>
+ <location filename="../../fileIsSameDialog.cpp" line="67"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="61"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>When folder colision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="112"/>
+ <location filename="../../scanFileOrFolder.cpp" line="138"/>
+ <source>Copy of </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="157"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="159"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/ListThread.cpp b/plugins/CopyEngine/Ultracopier-0.3/ListThread.cpp
new file mode 100644
index 0000000..7f022d8
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/ListThread.cpp
@@ -0,0 +1,1479 @@
+#include "ListThread.h"
+
+/// \todo do pushed or instant mount point (setDrive, ...)
+/// \todo semaphore to prevent dual mkpath
+/// \todo repair the mkpath, to use mkpath class before file transfer to have the folder
+/// \todo do QThread( parent )
+/** \todo when overwrite with large inode operation, it not start specificly the first in the list
+ When that's is finish, send start file at real transfer start, not inode operation start **/
+/** \todo group setCollisionAction(FileExistsAction alwaysDoThisActionForFileExists) and setAlwaysFileExistsAction(FileExistsAction alwaysDoThisActionForFileExists)
+ and check if I can choose case by case if I wish overwrite, skip, ... */
+/// \todo move directly the folder when it's needed
+/// \todo connect folder error of mkpath and rmpath class
+
+ListThread::ListThread(FacilityInterface * facilityInterface)
+{
+ qRegisterMetaType<DebugLevel>("DebugLevel");
+ qRegisterMetaType<ItemOfCopyList>("ItemOfCopyList");
+ qRegisterMetaType<QFileInfo>("QFileInfo");
+ qRegisterMetaType<CopyMode>("CopyMode");
+
+ moveToThread(this);
+ start(HighPriority);
+ this->facilityInterface = facilityInterface;
+ putInPause = false;
+ sourceDrive = "";
+ sourceDriveMultiple = false;
+ destinationDrive = "";
+ destinationDriveMultiple = false;
+ stopIt = false;
+ bytesToTransfer = 0;
+ bytesTransfered = 0;
+ idIncrementNumber = 1;
+ actualRealByteTransfered = 0;
+ preOperationNumber = 0;
+ numberOfTranferRuning = 0;
+ numberOfTransferIntoToDoList = 0;
+ numberOfInodeOperation = 0;
+ maxSpeed = 0;
+ doRightTransfer = false;
+ keepDate = false;
+ blockSize = 1024;
+ alwaysDoThisActionForFileExists = FileExists_NotSet;
+
+ #if ! defined (Q_CC_GNU)
+ ui->keepDate->setEnabled(false);
+ ui->keepDate->setToolTip("Not supported with this compiler");
+ #endif
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ connect(&timerUpdateDebugDialog,SIGNAL(timeout()),this,SLOT(timedUpdateDebugDialog()));
+ timerUpdateDebugDialog.start(ULTRACOPIER_PLUGIN_DEBUG_WINDOW_TIMER);
+ #endif
+ connect(&timerActionDone,SIGNAL(timeout()), this,SLOT(sendActionDone()));
+ connect(&timerProgression,SIGNAL(timeout()), this,SLOT(sendProgression()));
+ connect(this, SIGNAL(tryCancel()), this,SLOT(cancel()), Qt::QueuedConnection);
+ connect(this, SIGNAL(askNewTransferThread()), this,SLOT(createTransferThread()), Qt::QueuedConnection);
+ connect(&mkPathQueue, SIGNAL(firstFolderFinish()), this,SLOT(mkPathFirstFolderFinish()), Qt::QueuedConnection);
+ connect(&rmPathQueue, SIGNAL(firstFolderFinish()), this,SLOT(rmPathFirstFolderFinish()), Qt::QueuedConnection);
+ connect(&mkPathQueue, SIGNAL(errorOnFolder(QFileInfo,QString)), this,SIGNAL(mkPathErrorOnFolder(QFileInfo,QString)), Qt::QueuedConnection);
+ connect(&rmPathQueue, SIGNAL(errorOnFolder(QFileInfo,QString)), this,SIGNAL(rmPathErrorOnFolder(QFileInfo,QString)), Qt::QueuedConnection);
+ connect(this, SIGNAL(send_syncTransferList()), this,SLOT(syncTransferList_internal()), Qt::QueuedConnection);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(&mkPathQueue, SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)), this,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)), Qt::QueuedConnection);
+ connect(&rmPathQueue, SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)), this,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)), Qt::QueuedConnection);
+ #endif // ULTRACOPIER_PLUGIN_DEBUG
+
+ emit askNewTransferThread();
+ mkpathTransfer.release();
+ timerActionDone.setSingleShot(true);
+ timerActionDone.setInterval(ULTRACOPIER_PLUGIN_TIME_UPDATE_TRASNFER_LIST);
+ timerProgression.setSingleShot(true);
+ timerProgression.setInterval(ULTRACOPIER_PLUGIN_TIME_UPDATE_PROGRESSION);
+}
+
+ListThread::~ListThread()
+{
+ emit tryCancel();
+ waitCancel.acquire();
+ wait();
+}
+
+//transfer is finished
+void ListThread::transferInodeIsClosed()
+{
+ numberOfInodeOperation--;
+ temp_transfer_thread=qobject_cast<TransferThread *>(QObject::sender());
+ if(temp_transfer_thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("transfer thread not located!"));
+ return;
+ }
+ isFound=false;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ int countLocalParse=0;
+ #endif
+ if(temp_transfer_thread->getStat()!=TransferThread::Idle)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("transfer thread not idle!"));
+ return;
+ }
+ int_for_internal_loop=0;
+ loop_size=actionToDoListTransfer.size();
+ while(int_for_internal_loop<loop_size)
+ {
+ if(actionToDoListTransfer.at(int_for_internal_loop).id==temp_transfer_thread->transferId)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("[%1] have finish, put at idle; for id: %2").arg(int_for_internal_loop).arg(temp_transfer_thread->transferId));
+ returnActionOnCopyList newAction;
+ newAction.type=RemoveItem;
+ newAction.addAction.id=temp_transfer_thread->transferId;
+ newAction.userAction.position=int_for_internal_loop;
+ actionDone << newAction;
+ /// \todo check if item is at the right thread
+ actionToDoListTransfer.removeAt(int_for_internal_loop);
+ if(actionToDoListTransfer.size()==0 && actionToDoListInode.size()==0 && actionToDoListInode_afterTheTransfer.size()==0)
+ updateTheStatus();
+ /// \todo add the oversize to all size here
+ bytesTransfered+=temp_transfer_thread->transferSize;
+ temp_transfer_thread->transferId=0;
+ temp_transfer_thread->transferSize=0;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ countLocalParse++;
+ #endif
+ isFound=true;
+ //emit newActionOnList();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"numberOfTranferRuning: "+QString::number(numberOfTranferRuning));
+ if(actionToDoListTransfer.size()==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"numberOfTranferRuning==0");
+ actionToDoListInode << actionToDoListInode_afterTheTransfer;
+ actionToDoListInode_afterTheTransfer.clear();
+ doNewActions_inode_manipulation();
+ }
+ break;
+ }
+ int_for_internal_loop++;
+ }
+ if(!isFound)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("unable to found item into the todo list, id: %1, index: %2").arg(temp_transfer_thread->transferId).arg(int_for_loop));
+ temp_transfer_thread->transferId=0;
+ temp_transfer_thread->transferSize=0;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("countLocalParse: %1, actionToDoList.size(): %2").arg(countLocalParse).arg(actionToDoListTransfer.size()));
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(countLocalParse!=1)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("countLocalParse != 1"));
+ #endif
+ doNewActions_inode_manipulation();
+}
+
+//transfer is finished
+void ListThread::transferIsFinished()
+{
+ temp_transfer_thread=qobject_cast<TransferThread *>(QObject::sender());
+ if(temp_transfer_thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("transfer thread not located!"));
+ return;
+ }
+// emit newTransferStop(temp_transfer_thread->transferId);
+ numberOfTranferRuning--;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start transferIsFinished(), numberOfTranferRuning: "+QString::number(numberOfTranferRuning));
+ doNewActions_start_transfer();
+}
+
+/** \brief put the current file at bottom in case of error
+\note ONLY IN CASE OF ERROR */
+void ListThread::transferPutAtBottom()
+{
+ TransferThread *transfer=qobject_cast<TransferThread *>(QObject::sender());
+ if(transfer==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("transfer thread not located!"));
+ return;
+ }
+ transfer->skip();
+ bool isFound=false;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ int countLocalParse=0;
+ #endif
+ int index=0;
+ loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ if(transferThreadList.at(index)==transfer)
+ {
+ int indexAction=0;
+ while(indexAction<actionToDoListTransfer.size())
+ {
+ if(actionToDoListTransfer.at(indexAction).id==transferThreadList.at(index)->transferId)
+ {
+ //push for interface at the end
+ returnActionOnCopyList newAction;
+ newAction.type=MoveItem;
+ newAction.addAction.id=transferThreadList.at(index)->transferId;
+ newAction.userAction.position=actionToDoListTransfer.size()-1;
+ actionDone << newAction;
+ //do the wait stat
+ actionToDoListTransfer[index].isRunning=false;
+ //move at the end
+ actionToDoListTransfer.move(indexAction,actionToDoListTransfer.size()-1);
+ //reset the thread list stat
+ transferThreadList[index]->transferId=0;
+ transferThreadList[index]->transferSize=0;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ countLocalParse++;
+ #endif
+ isFound=true;
+ break;
+ }
+ indexAction++;
+ }
+ if(!isFound)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("unable to found item into the todo list, id: %1, index: %2").arg(transferThreadList.at(index)->transferId).arg(index));
+ transferThreadList[index]->transferId=0;
+ transferThreadList[index]->transferSize=0;
+ }
+ break;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("countLocalParse: %1").arg(countLocalParse));
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(countLocalParse!=1)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("countLocalParse != 1"));
+ #endif
+}
+
+//set the copy info and options before runing
+void ListThread::setRightTransfer(const bool doRightTransfer)
+{
+ this->doRightTransfer=doRightTransfer;
+ int index=0;
+ loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setRightTransfer(doRightTransfer);
+ index++;
+ }
+}
+
+//set keep date
+void ListThread::setKeepDate(const bool keepDate)
+{
+ this->keepDate=keepDate;
+ int index=0;
+ loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setKeepDate(keepDate);
+ index++;
+ }
+}
+
+//set block size in KB
+void ListThread::setBlockSize(const int blockSize)
+{
+ this->blockSize=blockSize;
+ int index=0;
+ loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setBlockSize(blockSize);
+ index++;
+ }
+}
+
+//set auto start
+void ListThread::setAutoStart(const bool autoStart)
+{
+ this->autoStart=autoStart;
+}
+
+//set check destination folder
+void ListThread::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+{
+ this->checkDestinationFolderExists=checkDestinationFolderExists;
+ for(int i=0;i<scanFileOrFolderThreadsPool.size();i++)
+ scanFileOrFolderThreadsPool.at(i)->setCheckDestinationFolderExists(checkDestinationFolderExists && alwaysDoThisActionForFolderExists!=FolderExists_Merge);
+}
+
+void ListThread::fileTransfer(const QFileInfo &sourceFileInfo,const QFileInfo &destinationFileInfo,const CopyMode &mode)
+{
+ addToTransfer(sourceFileInfo,destinationFileInfo,mode);
+}
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::haveSameSource(QStringList sources)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ if(sourceDriveMultiple)
+ return false;
+ if(sourceDrive.isEmpty())
+ return true;
+ int index=0;
+ while(index<sources.size())
+ {
+// if(threadOfTheTransfer.getDrive(sources.at(index))!=sourceDrive)
+// return false;
+ index++;
+ }
+ return true;
+}
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::haveSameDestination(QString destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ if(destinationDriveMultiple)
+ return false;
+ if(destinationDrive.isEmpty())
+ return true;
+ int index=0;
+ while(index<destination.size())
+ {
+// if(threadOfTheTransfer.getDrive(destination.at(index))!=destinationDrive)
+// return false;
+ index++;
+ }
+ return true;
+}
+
+scanFileOrFolder * ListThread::newScanThread(CopyMode mode)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start with: "+QString::number(mode));
+
+ //create new thread because is auto-detroyed
+ scanFileOrFolderThreadsPool << new scanFileOrFolder(mode);
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(finishedTheListing()), this,SLOT(scanThreadHaveFinish()), Qt::QueuedConnection);
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(fileTransfer(QFileInfo,QFileInfo,CopyMode)), this,SLOT(fileTransfer(QFileInfo,QFileInfo,CopyMode)), Qt::QueuedConnection);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)), this,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)));
+ #endif
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(newFolderListing(QString)), this,SIGNAL(newFolderListing(QString)));
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(addToRmPath(QString,int)), this,SLOT(addToRmPath(QString,int)), Qt::QueuedConnection);
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(addToMkPath(QString)), this,SLOT(addToMkPath(QString)), Qt::QueuedConnection);
+
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(errorOnFolder(QFileInfo,QString)), this,SLOT(errorOnFolder(QFileInfo,QString)), Qt::QueuedConnection);
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(folderAlreadyExists(QFileInfo,QFileInfo,bool)), this,SLOT(folderAlreadyExists(QFileInfo,QFileInfo,bool)), Qt::QueuedConnection);
+ scanFileOrFolderThreadsPool.last()->setCheckDestinationFolderExists(checkDestinationFolderExists && alwaysDoThisActionForFolderExists!=FolderExists_Merge);
+ if(scanFileOrFolderThreadsPool.size()==1)
+ updateTheStatus();
+ return scanFileOrFolderThreadsPool.last();
+}
+
+void ListThread::scanThreadHaveFinish(bool skipFirstRemove)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"listing thread have finish, skipFirstRemove: "+QString::number(skipFirstRemove));
+ if(!skipFirstRemove)
+ {
+ QObject * senderThread = sender();
+ if(senderThread==NULL)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"sender pointer null (plugin copy engine)");
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start the next thread, scanFileOrFolderThreadsPool.size(): "+QString::number(scanFileOrFolderThreadsPool.size()));
+ bool isFound=false;
+ int index=0;
+ while(index<scanFileOrFolderThreadsPool.size())
+ {
+ if(senderThread==scanFileOrFolderThreadsPool.at(index))
+ {
+ if(index!=0)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"scanFileOrFolderThread is not the first (plugin copy engine)");
+ delete scanFileOrFolderThreadsPool.at(index);
+ scanFileOrFolderThreadsPool.removeAt(index);
+ if(scanFileOrFolderThreadsPool.size()==0)
+ updateTheStatus();
+ isFound=true;
+ break;
+ }
+ index++;
+ }
+ if(!isFound)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"sender pointer not found (plugin copy engine)");
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start the next thread, scanFileOrFolderThreadsPool.size(): "+QString::number(scanFileOrFolderThreadsPool.size()));
+ if(scanFileOrFolderThreadsPool.size()>0)
+ {
+ //then start the next listing threads
+ if(scanFileOrFolderThreadsPool.first()->isFinished())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"Start listing thread");
+ scanFileOrFolderThreadsPool.first()->start();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"The listing thread is already running");
+ }
+ else
+ {
+ if(autoStart)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"Auto start the copy");
+ startGeneralTransfer();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"Put the copy engine in pause");
+ putInPause=true;
+ emit isInPause(true);
+ }
+ }
+}
+
+void ListThread::startGeneralTransfer()
+{
+ doNewActions_inode_manipulation();
+ timerProgression.start();
+}
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::newCopy(QStringList sources,QString destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+sources.join(";")+", destination: "+destination);
+ scanFileOrFolder * scanFileOrFolderThread = newScanThread(Copy);
+ if(scanFileOrFolderThread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to get new thread");
+ return false;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start the listing");
+ scanFileOrFolderThread->addToList(sources,destination);
+ scanThreadHaveFinish(true);
+ return true;
+}
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::newMove(QStringList sources,QString destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ scanFileOrFolder * scanFileOrFolderThread = newScanThread(Move);
+ if(scanFileOrFolderThread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to get new thread");
+ return false;
+ }
+ scanFileOrFolderThread->addToList(sources,destination);
+ scanThreadHaveFinish(true);
+/* int index=0;
+ while(index<sources.size() && !sourceDriveMultiple)
+ {
+ QString tempDrive=threadOfTheTransfer.getDrive(sources.at(index));
+ if(sourceDrive=="")
+ sourceDrive=tempDrive;
+ if(tempDrive!=sourceDrive)
+ sourceDriveMultiple=true;
+ index++;
+ }*/
+/* QString tempDrive=threadOfTheTransfer.getDrive(destination);
+ if(!destinationDriveMultiple)
+ {
+ if(tempDrive=="")
+ destinationDrive=tempDrive;
+ if(tempDrive!=destinationDrive)
+ destinationDriveMultiple=true;
+ }*/
+ return true;
+}
+
+void ListThread::setDrive(QStringList drives)
+{
+ this->drives=drives;
+ int index=0;
+ loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setDrive(drives);
+ index++;
+ }
+}
+
+void ListThread::setCollisionAction(FileExistsAction alwaysDoThisActionForFileExists)
+{
+ this->alwaysDoThisActionForFileExists=alwaysDoThisActionForFileExists;
+ int index=0;
+ loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ index++;
+ }
+}
+
+/** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+void ListThread::syncTransferList()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ emit send_syncTransferList();
+}
+
+//set the folder local colision
+void ListThread::setFolderColision(FolderExistsAction alwaysDoThisActionForFolderExists)
+{
+ this->alwaysDoThisActionForFolderExists=alwaysDoThisActionForFolderExists;
+}
+
+bool ListThread::getReturnBoolToCopyEngine()
+{
+ return returnBoolToCopyEngine;
+}
+
+QPair<quint64,quint64> ListThread::getReturnPairQuint64ToCopyEngine()
+{
+ return returnPairQuint64ToCopyEngine;
+}
+
+ItemOfCopyList ListThread::getReturnItemOfCopyListToCopyEngine()
+{
+ return returnItemOfCopyListToCopyEngine;
+}
+
+void ListThread::pause()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Seam already in pause!");
+ return;
+ }
+ putInPause=true;
+ int index=0;
+ loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->pause();
+ index++;
+ }
+ emit isInPause(true);
+}
+
+void ListThread::resume()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ if(!putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Seam already resumed!");
+ return;
+ }
+ putInPause=false;
+ startGeneralTransfer();
+ doNewActions_start_transfer();
+ int index=0;
+ loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ transferThreadList.at(index)->resume();
+ index++;
+ }
+ emit isInPause(false);
+}
+
+void ListThread::skip(const quint64 &id)
+{
+ skipInternal(id);
+// emit newActionOnList();
+}
+
+bool ListThread::skipInternal(const quint64 &id)
+{
+ int index=0;
+ loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ if(transferThreadList.at(index)->transferId==id)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("skip one transfer: %1").arg(id));
+ transferThreadList.at(index)->skip();
+ return true;
+ }
+ index++;
+ }
+ int_for_internal_loop=0;
+ loop_size=actionToDoListTransfer.size();
+ while(int_for_internal_loop<loop_size)
+ {
+ if(actionToDoListTransfer.at(int_for_internal_loop).id==id)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("[%1] remove at not running, for id: %2").arg(int_for_internal_loop).arg(id));
+ returnActionOnCopyList newAction;
+ newAction.type=RemoveItem;
+ newAction.addAction.id=id;
+ newAction.userAction.position=int_for_internal_loop;
+ actionDone << newAction;
+ actionToDoListTransfer.removeAt(int_for_internal_loop);
+ if(actionToDoListTransfer.size()==0 && actionToDoListInode.size()==0 && actionToDoListInode_afterTheTransfer.size()==0)
+ updateTheStatus();
+ return true;
+ }
+ int_for_internal_loop++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("skip transfer not found: %1").arg(id));
+ return false;
+}
+
+void ListThread::cancel()
+{
+ if(stopIt)
+ {
+ waitCancel.release();
+ return;
+ }
+ stopIt=true;
+ disconnect(this);
+ int index=0;
+ loop_size=transferThreadList.size();
+ while(index<loop_size)
+ {
+ transferThreadList.at(index)->stop();
+ delete transferThreadList.at(index);//->deleteLayer();
+ transferThreadList[index]=NULL;
+ index++;
+ }
+ index=0;
+ loop_size=scanFileOrFolderThreadsPool.size();
+ while(index<loop_size)
+ {
+ scanFileOrFolderThreadsPool.at(index)->stop();
+ delete scanFileOrFolderThreadsPool.at(index);//->deleteLayer();
+ scanFileOrFolderThreadsPool[index]=NULL;
+ index++;
+ }
+ quit();
+ waitCancel.release();
+}
+
+//speed limitation
+qint64 ListThread::getSpeedLimitation()
+{
+ return maxSpeed;
+}
+
+bool ListThread::setSpeedLimitation(const qint64 &speedLimitation)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"maxSpeed: "+QString::number(maxSpeed));
+ maxSpeed=speedLimitation;
+ int_for_loop=0;
+ loop_size=transferThreadList.size();
+ while(int_for_loop<loop_size)
+ {
+ transferThreadList.at(int_for_loop)->setMaxSpeed(speedLimitation/ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER);
+ int_for_loop++;
+ }
+ return true;
+}
+
+void ListThread::updateTheStatus()
+{
+ /*if(threadOfTheTransfer.haveContent())
+ copy=true;*/
+ updateTheStatus_listing=scanFileOrFolderThreadsPool.size()>0;
+ updateTheStatus_copying=actionToDoListTransfer.size()>0 || actionToDoListInode.size()>0 || actionToDoListInode_afterTheTransfer.size()>0;
+ if(updateTheStatus_copying && updateTheStatus_listing)
+ updateTheStatus_action_in_progress=CopyingAndListing;
+ else if(updateTheStatus_listing)
+ updateTheStatus_action_in_progress=Listing;
+ else if(updateTheStatus_copying)
+ updateTheStatus_action_in_progress=Copying;
+ else
+ updateTheStatus_action_in_progress=Idle;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"emit actionInProgess("+QString::number(updateTheStatus_action_in_progress)+")");
+ emit actionInProgess(updateTheStatus_action_in_progress);
+ if(updateTheStatus_action_in_progress==Idle)
+ sendActionDone();
+}
+
+//set data local to the thread
+void ListThread::setAlwaysFileExistsAction(FileExistsAction alwaysDoThisActionForFileExists)
+{
+ this->alwaysDoThisActionForFileExists=alwaysDoThisActionForFileExists;
+ int_for_loop=0;
+ loop_size=transferThreadList.size();
+ while(int_for_loop<loop_size)
+ {
+ transferThreadList.at(int_for_loop)->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ int_for_loop++;
+ }
+}
+
+//mk path to do
+quint64 ListThread::addToMkPath(const QString& folder)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"folder: "+folder);
+ actionToDoInode temp;
+ temp.type = ActionType_MkPath;
+ temp.id = generateIdNumber();
+ temp.folder.setFile(folder);
+ temp.isRunning = false;
+ actionToDoListInode << temp;
+ return temp.id;
+}
+
+//add rm path to do
+void ListThread::addToRmPath(const QString& folder,const int& inodeToRemove)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"folder: "+folder+",inodeToRemove: "+QString::number(inodeToRemove));
+ actionToDoInode temp;
+ temp.type = ActionType_RmPath;
+ temp.id = generateIdNumber();
+ temp.size = inodeToRemove;
+ temp.folder.setFile(folder);
+ temp.isRunning = false;
+ if(inodeToRemove==0)
+ actionToDoListInode << temp;
+ else
+ actionToDoListInode_afterTheTransfer << temp;
+}
+
+//send action done
+void ListThread::sendActionDone()
+{
+ if(actionDone.size()>0)
+ {
+ emit newActionOnList(actionDone);
+ actionDone.clear();
+ }
+ if(actionToDoListTransfer.size()>0)
+ timerActionDone.start();
+}
+
+//send progression
+void ListThread::sendProgression()
+{
+ if(actionToDoListTransfer.size()==0)
+ return;
+ qint64 copiedSize,totalSize,localOverSize;
+ QList<ProgressionItem> progressionList;
+ TransferThread *thread;
+ oversize=0;
+ currentProgression=0;
+ int_for_loop=0;
+ loop_size=transferThreadList.size();
+ while(int_for_loop<loop_size)
+ {
+ thread=transferThreadList.at(int_for_loop);
+ if(thread->getStat()==TransferThread::Transfer)
+ {
+ copiedSize=thread->copiedSize();
+ currentProgression+=copiedSize;
+ if(copiedSize>(qint64)thread->transferSize)
+ localOverSize=copiedSize-thread->transferSize;
+ totalSize=thread->transferSize+localOverSize;
+ ProgressionItem tempItem;
+ tempItem.current=copiedSize;
+ tempItem.id=thread->transferId;
+ tempItem.total=totalSize;
+ progressionList << tempItem;
+ oversize+=localOverSize;
+ }
+ int_for_loop++;
+ }
+ emit pushFileProgression(progressionList);
+ emit pushGeneralProgression(bytesTransfered+currentProgression,bytesToTransfer+oversize);
+ timerProgression.start();
+}
+
+//send the progression
+void ListThread::syncTransferList_internal()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ emit syncReady();
+ actionDone.clear();
+ //do list operation
+ TransferThread *transferThread;
+ loop_size=actionToDoListTransfer.size();
+ loop_sub_size=transferThreadList.size();
+ //this loop to have at max ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT*ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT, not ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT*transferThreadList.size()
+ for(int_for_loop=0; int_for_loop<loop_size; ++int_for_loop) {
+ const actionToDoTransfer &item=actionToDoListTransfer.at(int_for_loop);
+ returnActionOnCopyList newAction;
+ newAction.type = AddingItem;
+ newAction.addAction.id = item.id;
+ newAction.addAction.sourceFullPath = item.source.absoluteFilePath();
+ newAction.addAction.sourceFileName = item.source.fileName();
+ newAction.addAction.destinationFullPath = item.destination.absoluteFilePath();
+ newAction.addAction.destinationFileName = item.destination.fileName();
+ newAction.addAction.size = item.size;
+ newAction.addAction.mode = item.mode;
+ actionDone << newAction;
+ if(item.isRunning)
+ {
+ for(int_for_internal_loop=0; int_for_internal_loop<loop_sub_size; ++int_for_internal_loop) {
+ transferThread=transferThreadList.at(int_for_internal_loop);
+ returnActionOnCopyList newAction;
+ newAction.type = PreOperation;
+ newAction.addAction.id = item.id;
+ newAction.addAction.sourceFullPath = item.source.absoluteFilePath();
+ newAction.addAction.sourceFileName = item.source.fileName();
+ newAction.addAction.destinationFullPath = item.destination.absoluteFilePath();
+ newAction.addAction.destinationFileName = item.destination.fileName();
+ newAction.addAction.size = item.size;
+ newAction.addAction.mode = item.mode;
+ actionDone << newAction;
+ if(transferThread->getStat()!=TransferThread::PreOperation)
+ {
+ returnActionOnCopyList newAction;
+ switch(transferThread->getStat())
+ {
+ case TransferThread::Transfer:
+ newAction.type=Transfer;
+ break;
+ case TransferThread::PostTransfer:
+ newAction.type=PostOperation;
+ break;
+ default:
+ break;
+ }
+ newAction.addAction.id = item.id;
+ actionDone << newAction;
+ }
+ }
+ }
+ }
+}
+
+//add file transfer to do
+quint64 ListThread::addToTransfer(const QFileInfo& source,const QFileInfo& destination,const CopyMode& mode)
+{
+ //ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"source: "+source.absoluteFilePath()+", destination: "+destination.absoluteFilePath());
+ if(actionToDoListTransfer.size()==0)
+ timerActionDone.start();
+ //add to transfer list
+ numberOfTransferIntoToDoList++;
+ bytesToTransfer+= source.size();
+ actionToDoTransfer temp;
+ temp.id = generateIdNumber();
+ temp.size = source.size();
+ temp.source = source;
+ temp.destination= destination;
+ temp.mode = mode;
+ temp.isRunning = false;
+ actionToDoListTransfer << temp;
+ //push the new transfer to interface
+ returnActionOnCopyList newAction;
+ newAction.type = AddingItem;
+ newAction.addAction.id = temp.id;
+ newAction.addAction.sourceFullPath = source.absoluteFilePath();
+ newAction.addAction.sourceFileName = source.fileName();
+ newAction.addAction.destinationFullPath = destination.absoluteFilePath();
+ newAction.addAction.destinationFileName = destination.fileName();
+ newAction.addAction.size = temp.size;
+ newAction.addAction.mode = mode;
+ actionDone << newAction;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"source: "+source.absoluteFilePath()+",destination: "+destination.absoluteFilePath()+", add entry: "+QString::number(temp.id));
+ return temp.id;
+}
+
+//generate id number
+quint64 ListThread::generateIdNumber()
+{
+ idIncrementNumber++;
+ if(idIncrementNumber>(((quint64)1024*1024)*1024*1024*2))
+ idIncrementNumber=0;
+ return idIncrementNumber;
+}
+
+//warning the first entry is accessible will copy
+void ListThread::removeItems(const QList<int> &ids)
+{
+ for(int i=0;i<ids.size();i++)
+ skipInternal(ids.at(i));
+// emit newActionOnList();
+}
+
+//put on top
+void ListThread::moveItemsOnTop(QList<int> ids)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ //do list operation
+ int indexToMove=0;
+ loop_size=actionToDoListTransfer.size();
+ for (int i=0; i<loop_size; ++i) {
+ if(ids.contains(actionToDoListTransfer.at(i).id))
+ {
+ ids.removeOne(actionToDoListTransfer.at(i).id);
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("move item ")+QString::number(i)+" to "+QString::number(indexToMove));
+ returnActionOnCopyList newAction;
+ newAction.type=MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=indexToMove;
+ newAction.userAction.position=i;
+ actionDone << newAction;
+ actionToDoListTransfer.move(i,indexToMove);
+ indexToMove++;
+ if(ids.size()==0)
+ {
+ //emit newActionOnList();
+ return;
+ }
+ }
+ }
+// emit newActionOnList();
+}
+
+//move up
+void ListThread::moveItemsUp(QList<int> ids)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ //do list operation
+ int lastGoodPositionExtern=0;
+ int lastGoodPositionReal=0;
+ bool haveGoodPosition=false;
+ bool haveChanged=false;
+ loop_size=actionToDoListTransfer.size();
+ for (int i=0; i<loop_size; ++i) {
+ if(ids.contains(actionToDoListTransfer.at(i).id))
+ {
+ if(haveGoodPosition)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("move item ")+QString::number(i)+" to "+QString::number(i-1));
+ returnActionOnCopyList newAction;
+ newAction.type=MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=lastGoodPositionExtern;
+ newAction.userAction.position=i;
+ actionDone << newAction;
+ actionToDoListTransfer.swap(i,lastGoodPositionReal);
+ haveChanged=true;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("Try move up false, item ")+QString::number(i));
+ ids.removeOne(actionToDoListTransfer.at(i).id);
+ if(ids.size()==0)
+ {
+/* if(haveChanged)
+ emit newActionOnList();*/
+ return;
+ }
+ }
+ else
+ {
+ lastGoodPositionExtern++;
+ lastGoodPositionReal=i;
+ haveGoodPosition=true;
+ }
+ }
+ //emit newActionOnList();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"stop");
+}
+
+//move down
+void ListThread::moveItemsDown(QList<int> ids)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ //do list operation
+ int lastGoodPositionExtern=numberOfTransferIntoToDoList;
+ int lastGoodPositionReal=0;
+ bool haveGoodPosition=false;
+ bool haveChanged=false;
+ for (int i=actionToDoListTransfer.size()-1; i>=0; --i) {
+ if(ids.contains(actionToDoListTransfer.at(i).id))
+ {
+ if(haveGoodPosition)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("move item ")+QString::number(i)+" to "+QString::number(i+1));
+ returnActionOnCopyList newAction;
+ newAction.type=MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=lastGoodPositionReal;
+ newAction.userAction.position=i;
+ actionDone << newAction;
+ actionToDoListTransfer.swap(i,lastGoodPositionReal);
+ haveChanged=true;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("Try move up false, item ")+QString::number(i));
+ }
+ ids.removeOne(actionToDoListTransfer.at(i).id);
+ if(ids.size()==0)
+ {
+/* if(haveChanged)
+ emit newActionOnList();*/
+ return;
+ }
+ }
+ else
+ {
+ lastGoodPositionExtern--;
+ lastGoodPositionReal=i;
+ haveGoodPosition=true;
+ }
+ }
+ //emit newActionOnList();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"stop");
+}
+
+//put on bottom
+void ListThread::moveItemsOnBottom(QList<int> ids)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ //do list operation
+ int lastGoodPositionExtern=numberOfTransferIntoToDoList;
+ int lastGoodPositionReal=actionToDoListTransfer.size()-1;
+ for (int i=lastGoodPositionReal; i>=0; --i) {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("Check action on item ")+QString::number(i));
+ if(ids.contains(actionToDoListTransfer.at(i).id))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("move item ")+QString::number(i)+" to "+QString::number(lastGoodPositionReal));
+ ids.removeOne(actionToDoListTransfer.at(i).id);
+ returnActionOnCopyList newAction;
+ newAction.type=MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=lastGoodPositionExtern;
+ newAction.userAction.position=i;
+ actionDone << newAction;
+ actionToDoListTransfer.move(i,lastGoodPositionReal);
+ lastGoodPositionReal--;
+ lastGoodPositionExtern--;
+ if(ids.size()==0)
+ {
+// emit newActionOnList();
+ return;
+ }
+ }
+ }
+// emit newActionOnList();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"stop");
+}
+
+void ListThread::exportTransferList(const QString &fileName)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ QFile transferFile(fileName);
+ if(transferFile.open(QIODevice::WriteOnly|QIODevice::Truncate))
+ {
+ transferFile.write(QString("Ultracopier-0.3;CopyEngine-0.3\n").toUtf8());
+ int size=actionToDoListTransfer.size();
+ for (int index=0;index<size;++index) {
+ if(actionToDoListTransfer.at(index).mode==Copy)
+ transferFile.write(QString("Copy;%1;%2\n").arg(actionToDoListTransfer.at(index).source.absoluteFilePath()).arg(actionToDoListTransfer.at(index).destination.absoluteFilePath()).toUtf8());
+ else
+ transferFile.write(QString("Move;%1;%2\n").arg(actionToDoListTransfer.at(index).source.absoluteFilePath()).arg(actionToDoListTransfer.at(index).destination.absoluteFilePath()).toUtf8());
+ }
+ transferFile.close();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Unable to save the transfer list: %1").arg(transferFile.errorString()));
+ emit errorTransferList(tr("Unable to save the transfer list: %1").arg(transferFile.errorString()));
+ return;
+ }
+}
+
+void ListThread::importTransferList(const QString &fileName)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ QFile transferFile(fileName);
+ if(transferFile.open(QIODevice::ReadOnly))
+ {
+ QString content;
+ QByteArray data=transferFile.readLine();
+ if(data.size()<=0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Problem at the reading, or file size is null"));
+ emit errorTransferList(tr("Problem at the reading, or file size is null"));
+ return;
+ }
+ content=QString::fromUtf8(data);
+ if(content!="Ultracopier-0.3;CopyEngine-0.3\n")
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Wrong header: \"%1\"").arg(content));
+ emit errorTransferList(tr("Wrong header: \"%1\"").arg(content));
+ return;
+ }
+ bool errorFound=false,ignored_by_wrong_type=false;
+ QRegExp correctLine("^(Copy|Move);[^;]+;[^;]+\n$");
+ QStringList args;
+ CopyMode mode;
+ do
+ {
+ data=transferFile.readLine();
+ if(data.size()>0)
+ {
+ content=QString::fromUtf8(data);
+ //do the import here
+ if(content.contains(correctLine))
+ {
+ content.remove("\n");
+ args=content.split(";");
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("New data to import: %1,%2,%3").arg(args.at(0)).arg(args.at(1)).arg(args.at(2)));
+ if(args.at(0)=="Copy")
+ mode=Copy;
+ else
+ mode=Move;
+ addToTransfer(QFileInfo(args.at(1)),QFileInfo(args.at(2)),mode);
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Wrong line syntax: %1").arg(content));
+ errorFound=true;
+ }
+ }
+ }
+ while(data.size()>0);
+ transferFile.close();
+ if(errorFound)
+ emit warningTransferList(tr("Some error have been found during the line parsing"));
+ else if(ignored_by_wrong_type)
+ emit warningTransferList(tr("Some list is ignored because it not corresponds to the window transfer type"));
+// emit newActionOnList();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Unable to open the transfer list: %1").arg(transferFile.errorString()));
+ emit errorTransferList(tr("Unable to open the transfer list: %1").arg(transferFile.errorString()));
+ return;
+ }
+}
+
+//do new actions
+void ListThread::doNewActions_start_transfer()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("actionToDoListTransfer.size(): %1, numberOfTranferRuning: ").arg(actionToDoListTransfer.size()).arg(numberOfTranferRuning));
+ if(stopIt || putInPause)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ //lunch the transfer in WaitForTheTransfer
+ int_for_loop=0;
+ loop_size=transferThreadList.size();
+ while(int_for_loop<loop_size && numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER)
+ {
+ if(transferThreadList.at(int_for_loop)->getStat()==TransferThread::WaitForTheTransfer)
+ {
+ transferThreadList.at(int_for_loop)->startTheTransfer();
+ numberOfTranferRuning++;
+ }
+ int_for_loop++;
+ }
+ int_for_loop=0;
+ while(int_for_loop<loop_size && numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER)
+ {
+ if(transferThreadList.at(int_for_loop)->getStat()==TransferThread::PreOperation)
+ {
+ transferThreadList.at(int_for_loop)->startTheTransfer();
+ numberOfTranferRuning++;
+ }
+ int_for_loop++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"numberOfTranferRuning: "+QString::number(numberOfTranferRuning));
+}
+
+/** \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 ListThread::doNewActions_inode_manipulation()
+{
+ //ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("actionToDoList.size(): %1").arg(actionToDoList.size()));
+ if(stopIt || putInPause)
+ return;
+ //ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ //lunch the pre-op or inode op
+ int_for_loop=0;
+ int_for_internal_loop=0;
+ number_rm_path_moved=0;
+ int_for_transfer_thread_search=0;
+ actionToDoListTransfer_count=actionToDoListTransfer.count();
+ actionToDoListInode_count=actionToDoListInode.count();
+ loop_sub_size_transfer_thread_search=transferThreadList.size();
+ //search the next transfer action to do
+ while(int_for_loop<actionToDoListTransfer_count)
+ {
+ if(!actionToDoListTransfer[int_for_loop].isRunning)
+ {
+ //search the next inode action to do
+ while(int_for_internal_loop<actionToDoListInode_count)
+ {
+ if(!actionToDoListInode[int_for_internal_loop].isRunning)
+ {
+ if(actionToDoListTransfer[int_for_loop].id<actionToDoListInode[int_for_internal_loop].id)
+ {
+ //do the tranfer action in the next code
+ break;
+ }
+ else
+ {
+ //do the inode action
+ #include "ListThread_InodeAction.cpp"
+ }
+ }
+ int_for_internal_loop++;
+ }
+ actionToDoTransfer& currentActionToDoTransfer=actionToDoListTransfer[int_for_loop];
+ //do the tranfer action
+ while(int_for_transfer_thread_search<loop_sub_size_transfer_thread_search)
+ {
+ /**
+ transferThreadList.at(int_for_transfer_thread_search)->transferId==0) /!\ important!
+ Because the other thread can have call doNewAction before than this thread have the finish event parsed!
+ I this case it lose all data
+ */
+ currentTransferThread=transferThreadList[int_for_transfer_thread_search];
+ if(currentTransferThread->getStat()==TransferThread::Idle && currentTransferThread->transferId==0) // /!\ important!
+ {
+ currentTransferThread->transferId=currentActionToDoTransfer.id;
+ currentTransferThread->transferSize=currentActionToDoTransfer.size;
+ currentTransferThread->setFiles(
+ currentActionToDoTransfer.source.absoluteFilePath(),
+ currentActionToDoTransfer.size,
+ currentActionToDoTransfer.destination.absoluteFilePath(),
+ currentActionToDoTransfer.mode
+ );
+ currentActionToDoTransfer.isRunning=true;
+
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("[%1] id: %2 is idle, use it for %3").arg(int_for_loop).arg(currentTransferThread->transferId).arg(currentActionToDoTransfer.destination.absoluteFilePath()));
+
+ /// \note wrong position? Else write why it's here
+ returnActionOnCopyList newAction;
+ newAction.type = PreOperation;
+ newAction.addAction.id = currentActionToDoTransfer.id;
+ newAction.addAction.sourceFullPath = currentActionToDoTransfer.source.absoluteFilePath();
+ newAction.addAction.sourceFileName = currentActionToDoTransfer.source.fileName();
+ newAction.addAction.destinationFullPath = currentActionToDoTransfer.destination.absoluteFilePath();
+ newAction.addAction.destinationFileName = currentActionToDoTransfer.destination.fileName();
+ newAction.addAction.size = currentActionToDoTransfer.size;
+ newAction.addAction.mode = currentActionToDoTransfer.mode;
+ actionDone << newAction;
+ int_for_transfer_thread_search++;
+ break;
+ }
+ int_for_transfer_thread_search++;
+ }
+ if(int_for_internal_loop==loop_sub_size_transfer_thread_search)
+ {
+ /// \note Can be normal when all thread is not initialized
+ //ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"unable to found free thread to do the transfer");
+ break;
+ }
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT)
+ return;
+ }
+ int_for_loop++;
+ }
+ //search the next inode action to do
+ while(int_for_internal_loop<actionToDoListInode_count)
+ {
+ if(!actionToDoListInode[int_for_internal_loop].isRunning)
+ {
+ //do the inode action
+ #include "ListThread_InodeAction.cpp"
+ }
+ int_for_internal_loop++;
+ }
+ //error checking
+ if((actionToDoListTransfer_count+actionToDoListInode_count)>ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("The index have been detected as out of max range: %1>%2").arg(actionToDoListTransfer_count+actionToDoListInode_count).arg(ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT));
+ return;
+ }
+}
+
+//restart transfer if it can
+void ListThread::restartTransferIfItCan()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ TransferThread *transfer=qobject_cast<TransferThread *>(QObject::sender());
+ if(transfer==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("transfer thread not located!"));
+ return;
+ }
+ if(numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER && transfer->getStat()==TransferThread::WaitForTheTransfer)
+ {
+ transfer->startTheTransfer();
+ numberOfTranferRuning++;
+ }
+ doNewActions_start_transfer();
+}
+
+/// \brief update the transfer stat
+void ListThread::newTransferStat(TransferThread::TransferStat stat,quint64 id)
+{
+ returnActionOnCopyList newAction;
+ switch(stat)
+ {
+ case TransferThread::Idle:
+ return;
+ break;
+ case TransferThread::PreOperation:
+ return;
+ break;
+ case TransferThread::WaitForTheTransfer:
+ return;
+ break;
+ case TransferThread::Transfer:
+ newAction.type=Transfer;
+ break;
+ case TransferThread::PostTransfer:
+ newAction.type=PostOperation;
+ break;
+ case TransferThread::PostOperation:
+ return;
+ break;
+ default:
+ break;
+ }
+ newAction.addAction.id = id;
+ actionDone << newAction;
+}
+
+void ListThread::mkPathFirstFolderFinish()
+{
+ int_for_loop=0;
+ loop_size=actionToDoListInode.size();
+ while(int_for_loop<loop_size)
+ {
+ if(actionToDoListInode.at(int_for_loop).type==ActionType_MkPath)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("stop mkpath: %1").arg(actionToDoListInode.at(int_for_loop).folder.absoluteFilePath()));
+ actionToDoListInode.removeAt(int_for_loop);
+ if(actionToDoListTransfer.size()==0 && actionToDoListInode.size()==0 && actionToDoListInode_afterTheTransfer.size()==0)
+ updateTheStatus();
+ numberOfInodeOperation--;
+ doNewActions_inode_manipulation();
+ return;
+ }
+ int_for_loop++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"unable to found item into the todo list");
+}
+
+void ListThread::rmPathFirstFolderFinish()
+{
+ int_for_loop=0;
+ loop_size=actionToDoListInode.size();
+ while(int_for_loop<loop_size)
+ {
+ if(actionToDoListInode.at(int_for_loop).type==ActionType_RmPath)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("stop rmpath: %1").arg(actionToDoListInode.at(int_for_loop).folder.absoluteFilePath()));
+ actionToDoListInode.removeAt(int_for_loop);
+ if(actionToDoListTransfer.size()==0 && actionToDoListInode.size()==0 && actionToDoListInode_afterTheTransfer.size()==0)
+ updateTheStatus();
+ numberOfInodeOperation--;
+ doNewActions_inode_manipulation();
+ return;
+ }
+ int_for_loop++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"unable to found item into the todo list");
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+
+void ListThread::timedUpdateDebugDialog()
+{
+ QStringList newList;
+ int index=0;
+ loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ QString stat;
+ switch(transferThreadList.at(index)->getStat())
+ {
+ case TransferThread::Idle:
+ stat="Idle";
+ break;
+ case TransferThread::PreOperation:
+ stat="PreOperation";
+ break;
+ case TransferThread::WaitForTheTransfer:
+ stat="WaitForTheTransfer";
+ break;
+ case TransferThread::Transfer:
+ stat="Transfer";
+ break;
+ case TransferThread::PostOperation:
+ stat="PostOperation";
+ break;
+ case TransferThread::PostTransfer:
+ stat="PostTransfer";
+ break;
+ default:
+ stat=QString("??? (%1)").arg(transferThreadList.at(index)->getStat());
+ break;
+ }
+ newList << QString("%1) (%3,%4) %2")
+ .arg(index)
+ .arg(stat)
+ .arg(transferThreadList.at(index)->readingLetter())
+ .arg(transferThreadList.at(index)->writingLetter());
+ index++;
+ }
+ QStringList newList2;
+ index=0;
+ loop_size=actionToDoListTransfer.size();
+ while(index<loop_size)
+ {
+ newList2 << QString("%1 %2 %3")
+ .arg(actionToDoListTransfer.at(index).source.absoluteFilePath())
+ .arg(actionToDoListTransfer.at(index).size)
+ .arg(actionToDoListTransfer.at(index).destination.absoluteFilePath());
+ if(index>(actionToDoListTransfer.size()+2))
+ {
+ newList2 << QString("...");
+ break;
+ }
+ index++;
+ }
+ emit updateTheDebugInfo(newList,newList2,numberOfInodeOperation);
+}
+
+#endif
+
+/// \note Can be call without queue because all call will be serialized
+void ListThread::fileAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame)
+{
+ emit send_fileAlreadyExists(source,destination,isSame,qobject_cast<TransferThread *>(sender()));
+}
+
+/// \note Can be call without queue because all call will be serialized
+void ListThread::errorOnFile(const QFileInfo &fileInfo,const QString &errorString)
+{
+ emit send_errorOnFile(fileInfo,errorString,qobject_cast<TransferThread *>(sender()));
+}
+
+/// \note Can be call without queue because all call will be serialized
+void ListThread::folderAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame)
+{
+ emit send_folderAlreadyExists(source,destination,isSame,qobject_cast<scanFileOrFolder *>(sender()));
+}
+
+/// \note Can be call without queue because all call will be serialized
+/// \todo all this part
+void ListThread::errorOnFolder(const QFileInfo &fileInfo,const QString &errorString)
+{
+ emit send_errorOnFolder(fileInfo,errorString,qobject_cast<scanFileOrFolder *>(sender()));
+}
+
+//to run the thread
+void ListThread::run()
+{
+ exec();
+}
+
+/// \to create transfer thread
+void ListThread::createTransferThread()
+{
+ if(stopIt)
+ return;
+ transferThreadList << new TransferThread();
+ TransferThread * last=transferThreadList.last();
+ last->transferId=0;
+ last->transferSize=0;
+ last->setRightTransfer(doRightTransfer);
+ last->setKeepDate(keepDate);
+ last->setBlockSize(blockSize);
+ last->setDrive(drives);
+ last->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ last->setMaxSpeed(maxSpeed/ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(last,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)),this,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)), Qt::QueuedConnection);
+ #endif // ULTRACOPIER_PLUGIN_DEBUG
+ connect(last,SIGNAL(errorOnFile(QFileInfo,QString)), this,SLOT(errorOnFile(QFileInfo,QString)), Qt::QueuedConnection);
+ connect(last,SIGNAL(fileAlreadyExists(QFileInfo,QFileInfo,bool)), this,SLOT(fileAlreadyExists(QFileInfo,QFileInfo,bool)), Qt::QueuedConnection);
+ connect(last,SIGNAL(tryPutAtBottom()), this,SLOT(transferPutAtBottom()), Qt::QueuedConnection);
+ connect(last,SIGNAL(readStopped()), this,SLOT(transferIsFinished()), Qt::QueuedConnection);
+ connect(last,SIGNAL(preOperationStopped()), this,SLOT(doNewActions_start_transfer()), Qt::QueuedConnection);
+ connect(last,SIGNAL(postOperationStopped()), this,SLOT(transferInodeIsClosed()), Qt::QueuedConnection);
+ connect(last,SIGNAL(checkIfItCanBeResumed()), this,SLOT(restartTransferIfItCan()), Qt::QueuedConnection);
+ last->start();
+ last->setObjectName(QString("transfer %1").arg(transferThreadList.size()-1));
+ last->setMkpathTransfer(&mkpathTransfer);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ last->setId(transferThreadList.size()-1);
+ #endif
+ if(transferThreadList.size()>=ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT)
+ return;
+ if(stopIt)
+ return;
+ doNewActions_inode_manipulation();
+ emit askNewTransferThread();
+}
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
diff --git a/plugins/CopyEngine/Ultracopier-0.3/ListThread_InodeAction.cpp b/plugins/CopyEngine/Ultracopier-0.3/ListThread_InodeAction.cpp
new file mode 100644
index 0000000..0fd2cf2
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/ListThread_InodeAction.cpp
@@ -0,0 +1,54 @@
+/** \file ListThread_InodeAction.cpp
+\brief To be included into ListThread.cpp, to optimize and prevent code duplication
+\see ListThread.cpp
+\author alpha_one_x86
+\version 0.3
+\date 2011 */
+
+//do the inode action
+actionToDoInode& currentActionToDoInode=actionToDoListInode[int_for_internal_loop];
+switch(currentActionToDoInode.type)
+{
+case ActionType_MkPath:
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("launch mkpath: %1").arg(currentActionToDoInode.folder.absoluteFilePath()));
+ mkPathQueue.addPath(currentActionToDoInode.folder.absoluteFilePath());
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT)
+ return;
+break;
+case ActionType_RmPath:
+/* What is this code?
+ if((int_for_loop+number_rm_path_moved)>=(loop_size-1))
+ {
+ if(numberOfTranferRuning)
+ break;
+ else
+ currentActionToDoInode.size=0;
+ }*/
+ //then empty (no file), can try remove it
+ if(true)//currentActionToDoInode.size==0
+ {
+ if(numberOfTranferRuning>0)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("skipped because already inode = 0 and transfer is running: %1").arg(currentActionToDoInode.folder.absoluteFilePath()));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("launch rmpath: %1").arg(currentActionToDoInode.folder.absoluteFilePath()));
+ rmPathQueue.addPath(currentActionToDoInode.folder.absoluteFilePath());
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT)
+ return;
+ }
+ else //have not finish all the transfer into it, do it later
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"should never pass here");
+ /*actionToDoListInode.move(int_for_internal_loop,actionToDoListInode_count-1);
+ currentActionToDoInode.id=generateIdNumber();
+ number_rm_path_moved++;
+ currentActionToDoInode.size=0;
+ continue;*/
+ }
+break;
+default:
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Wrong type at inode action"));
+ return;
+}
diff --git a/plugins/CopyEngine/Ultracopier-0.3/MkPath.cpp b/plugins/CopyEngine/Ultracopier-0.3/MkPath.cpp
new file mode 100644
index 0000000..dd71231
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/MkPath.cpp
@@ -0,0 +1,100 @@
+#include "MkPath.h"
+
+MkPath::MkPath()
+{
+ stopIt=false;
+ waitAction=false;
+ setObjectName("MkPath");
+ moveToThread(this);
+ start();
+}
+
+MkPath::~MkPath()
+{
+ stopIt=true;
+ quit();
+ wait();
+}
+
+void MkPath::addPath(const QString &path)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+path);
+ if(stopIt)
+ return;
+ emit internalStartAddPath(path);
+}
+
+void MkPath::skip()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ emit internalStartSkip();
+}
+
+void MkPath::retry()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ emit internalStartRetry();
+}
+
+void MkPath::run()
+{
+ connect(this,SIGNAL(internalStartAddPath(QString)),this,SLOT(internalAddPath(QString)),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartDoThisPath()),this,SLOT(internalDoThisPath()),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartSkip()),this,SLOT(internalSkip()),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartRetry()),this,SLOT(internalRetry()),Qt::QueuedConnection);
+ exec();
+}
+
+void MkPath::internalDoThisPath()
+{
+ if(waitAction || pathList.isEmpty())
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+pathList.first());
+ if(!dir.exists(pathList.first()))
+ if(!dir.mkpath(pathList.first()))
+ {
+ if(!dir.exists(pathList.first()))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to remove the folder: "+pathList.first());
+ emit errorOnFolder(pathList.first(),tr("Unable to create the folder"));
+ return;
+ }
+ }
+ pathList.removeFirst();
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+}
+
+void MkPath::internalAddPath(const QString &path)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+path);
+ pathList << path;
+ if(!waitAction)
+ checkIfCanDoTheNext();
+}
+
+void MkPath::checkIfCanDoTheNext()
+{
+ if(!waitAction && !stopIt && pathList.size()>0)
+ emit internalStartDoThisPath();
+}
+
+void MkPath::internalSkip()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ waitAction=false;
+ pathList.removeFirst();
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+}
+
+void MkPath::internalRetry()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ waitAction=false;
+ checkIfCanDoTheNext();
+}
+
diff --git a/plugins/CopyEngine/Ultracopier-0.3/MkPath.h b/plugins/CopyEngine/Ultracopier-0.3/MkPath.h
new file mode 100644
index 0000000..5d00d60
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/MkPath.h
@@ -0,0 +1,56 @@
+/** \file MkPath.h
+\brief Make the path given as queued mkpath
+\author alpha_one_x86
+\version 0.3
+\date 2011 */
+
+#ifndef MKPATH_H
+#define MKPATH_H
+
+#include <QThread>
+#include <QFileInfo>
+#include <QString>
+#include <QSemaphore>
+#include <QStringList>
+#include <QDir>
+
+#include "Environment.h"
+
+/// \brief Make the path given as queued mkpath
+class MkPath : public QThread
+{
+ Q_OBJECT
+public:
+ explicit MkPath();
+ ~MkPath();
+ /// \brief add path to make
+ void addPath(const QString &path);
+signals:
+ void errorOnFolder(const QFileInfo &,const QString &);
+ void firstFolderFinish();
+ void internalStartAddPath(const QString &path);
+ void internalStartDoThisPath();
+ void internalStartSkip();
+ void internalStartRetry();
+ void debugInformation(const DebugLevel &level,const QString &fonction,const QString &text,const QString &file,const int &ligne);
+public slots:
+ /// \brief skip after creation error
+ void skip();
+ /// \brief retry after creation error
+ void retry();
+private:
+ void run();
+ bool waitAction;
+ bool stopIt;
+ bool skipIt;
+ QStringList pathList;
+ void checkIfCanDoTheNext();
+ QDir dir;
+private slots:
+ void internalDoThisPath();
+ void internalAddPath(const QString &path);
+ void internalSkip();
+ void internalRetry();
+};
+
+#endif // MKPATH_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/ReadThread.cpp b/plugins/CopyEngine/Ultracopier-0.3/ReadThread.cpp
new file mode 100644
index 0000000..fb97ec5
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/ReadThread.cpp
@@ -0,0 +1,513 @@
+#include "ReadThread.h"
+
+ReadThread::ReadThread()
+{
+ start();
+ moveToThread(this);
+ stopIt=false;
+ putInPause=false;
+ blockSize=1024*1024;
+ setObjectName("read");
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ isInReadLoop=false;
+ tryStartRead=false;
+ isOpen.release();
+}
+
+ReadThread::~ReadThread()
+{
+ stopIt=true;
+ disconnect(this);
+ waitNewClockForSpeed.release();
+ isOpen.acquire();
+ exit();
+ wait();
+}
+
+void ReadThread::run()
+{
+ connect(this,SIGNAL(internalStartOpen()), this,SLOT(internalOpen()), Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartReopen()), this,SLOT(internalReopen()), Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartRead()), this,SLOT(internalRead()), Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartClose()), this,SLOT(internalClose()), Qt::QueuedConnection);
+ connect(this,SIGNAL(checkIfIsWait()), this,SLOT(isInWait()), Qt::QueuedConnection);
+ exec();
+}
+
+void ReadThread::open(const QString &name,const CopyMode &mode)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] open source: "+name);
+ if(file.isOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] previous file is already open: "+file.fileName()+", try open: "+this->name);
+ return;
+ }
+ if(isInReadLoop)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] previous file is already readding: "+file.fileName()+", try open: "+this->name);
+ return;
+ }
+ if(tryStartRead)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] previous file is already try read: "+file.fileName()+", try open: "+this->name);
+ return;
+ }
+ fakeMode=false;
+ this->name=name;
+ this->mode=mode;
+ emit internalStartOpen();
+}
+
+QString ReadThread::errorString()
+{
+ return errorString_internal;
+}
+
+void ReadThread::stop()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] stop()");
+ stopIt=true;
+ emit internalStartClose();
+}
+
+bool ReadThread::pause()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] try put read thread in pause");
+ putInPause=true;
+ stopIt=true;
+ return isInReadLoop;
+}
+
+void ReadThread::resume()
+{
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ putInPause=false;
+ stopIt=false;
+ }
+ else
+ return;
+ if(tryStartRead)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] already in try start");
+ return;
+ }
+ tryStartRead=true;
+ if(isInReadLoop)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] is in read loop");
+ return;
+ }
+ if(!file.isOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] file is not open");
+ return;
+ }
+ emit internalStartRead();
+}
+
+bool ReadThread::seek(qint64 position)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start with: "+QString::number(position));
+ if(position>file.size())
+ return false;
+ lastGoodPosition=position;
+ return file.seek(position);
+}
+
+qint64 ReadThread::size()
+{
+ return file.size();
+}
+
+void ReadThread::postOperation()
+{
+ emit internalStartClose();
+}
+
+bool ReadThread::internalOpen(bool resetLastGoodPosition)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] internalOpen source: "+name);
+ stopIt=false;
+ putInPause=false;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=InodeOperation;
+ #endif
+ if(file.isOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] already open! source: "+name);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ return false;
+ }
+ file.setFileName(name);
+ QIODevice::OpenMode openMode=QIODevice::ReadOnly;
+ if(mode==Move)
+ openMode=QIODevice::ReadWrite;
+ seekToZero=false;
+ if(file.open(openMode))
+ {
+ size_at_open=file.size();
+ mtime_at_open=QFileInfo(file).lastModified();
+ putInPause=false;
+ if(resetLastGoodPosition)
+ {
+ seek(0);
+ emit opened();
+ }
+ else if(!seek(lastGoodPosition))
+ {
+ errorString_internal=file.errorString();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("Unable to seek after open: %1, error: %2").arg(name).arg(errorString_internal));
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ return false;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ isOpen.acquire();
+ return true;
+ }
+ else
+ {
+ errorString_internal=file.errorString();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("Unable to open: %1, error: %2").arg(name).arg(errorString_internal));
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ return false;
+ }
+}
+
+void ReadThread::internalRead()
+{
+ isInReadLoop=true;
+ tryStartRead=false;
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] stopIt == true, then quit");
+ internalClose();
+ return;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=InodeOperation;
+ #endif
+ int sizeReaden=0;
+ if(!file.isOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] is not open!");
+ return;
+ }
+ QByteArray blockArray;
+ //numberOfBlockCopied = 0;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start the copy");
+ emit readIsStarted();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] stopIt == true, then quit");
+ internalClose();
+ return;
+ }
+ do
+ {
+ //read one block
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Read;
+ #endif
+ blockArray=file.read(blockSize);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+
+ if(file.error()!=QFile::NoError)
+ {
+ errorString_internal=tr("Unable to read the source file: ")+file.errorString()+" ("+QString::number(file.error())+")";
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("file.error()!=QFile::NoError: %1, error: %2").arg(QString::number(file.error())).arg(errorString_internal));
+ emit error();
+ isInReadLoop=false;
+ return;
+ }
+ sizeReaden=blockArray.size();
+ if(sizeReaden>0)
+ {
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=WaitWritePipe;
+ #endif
+ if(!writeThread->write(blockArray))
+ {
+ if(!stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] stopped because the write is stopped: "+QString::number(lastGoodPosition));
+ stopIt=true;
+ }
+ }
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+
+ if(stopIt)
+ break;
+
+ lastGoodPosition+=blockArray.size();
+
+ //wait for limitation speed if stop not query
+ if(maxSpeed>0)
+ {
+ numberOfBlockCopied++;
+ if(numberOfBlockCopied>=MultiForBigSpeed)
+ {
+ numberOfBlockCopied=0;
+ waitNewClockForSpeed.acquire();
+ if(stopIt)
+ break;
+ }
+ }
+ /*if(lastGoodPosition>size)
+ oversize=lastGoodPosition-size;*/
+ }
+ /*
+ if(lastGoodPosition>16*1024)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("Test error in reading: %1 (%2)").arg(file.errorString()).arg(file.error()));
+ errorString_internal=QString("Test error in reading: %1 (%2)").arg(file.errorString()).arg(file.error());
+ emit error();
+ isInReadLoop=false;
+ return;
+ }
+ */
+ }
+ while(sizeReaden>0 && !stopIt);
+ if(lastGoodPosition>file.size())
+ {
+ errorString_internal=tr("File truncated during the read, possible data change");
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("Source truncated during the read: %1 (%2)").arg(file.errorString()).arg(QString::number(file.error())));
+ emit error();
+ isInReadLoop=false;
+ return;
+ }
+ isInReadLoop=false;
+ if(stopIt)
+ {
+ if(putInPause)
+ emit isInPause();
+ stopIt=false;
+ return;
+ }
+ emit readIsStopped();//will product by signal connection writeThread->endIsDetected();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] stop the read");
+}
+
+void ReadThread::startRead()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ if(tryStartRead)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] already in try start");
+ return;
+ }
+ if(isInReadLoop)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] double event dropped");
+ else
+ {
+ tryStartRead=true;
+ emit internalStartRead();
+ }
+}
+
+void ReadThread::internalClose(bool callByTheDestructor)
+{
+ /// \note never send signal here, because it's called by the destructor
+ //ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ if(!fakeMode)
+ file.close();
+ if(!callByTheDestructor)
+ emit closed();
+
+ /// \note always the last of this function
+ if(!fakeMode)
+ isOpen.release();
+}
+
+/** \brief set block size
+\param block the new block size in KB
+\return Return true if succes */
+bool ReadThread::setBlockSize(const int blockSize)
+{
+ if(blockSize<1 || blockSize>16384)
+ {
+ this->blockSize=blockSize*1024;
+ //set the new max speed because the timer have changed
+ setMaxSpeed(maxSpeed);
+ return true;
+ }
+ else
+ return false;
+}
+
+/*! \brief Set the max speed
+\param tempMaxSpeed Set the max speed in KB/s, 0 for no limit */
+int ReadThread::setMaxSpeed(const int maxSpeed)
+{
+ if(this->maxSpeed==0 && maxSpeed==0 && waitNewClockForSpeed.available()>0)
+ waitNewClockForSpeed.tryAcquire(waitNewClockForSpeed.available());
+ this->maxSpeed=maxSpeed;
+ if(this->maxSpeed>0)
+ {
+ int NewInterval,newMultiForBigSpeed=0;
+ do
+ {
+ newMultiForBigSpeed++;
+ NewInterval=(blockSize*newMultiForBigSpeed)/(this->maxSpeed);
+ }
+ while (NewInterval<ULTRACOPIER_PLUGIN_MINTIMERINTERVAL);
+ if(NewInterval>ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL)
+ {
+ NewInterval=ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL;
+ newMultiForBigSpeed=1;
+ blockSize=this->maxSpeed*NewInterval;
+ }
+ MultiForBigSpeed=newMultiForBigSpeed;
+ return NewInterval;
+ }
+ else
+ {
+ waitNewClockForSpeed.release();
+ return 0;
+ }
+}
+
+/// \brief For give timer every X ms
+void ReadThread::timeOfTheBlockCopyFinished()
+{
+ if(waitNewClockForSpeed.available()<ULTRACOPIER_PLUGIN_NUMSEMSPEEDMANAGEMENT)
+ waitNewClockForSpeed.release();
+ //why not just use waitNewClockForSpeed.release() ?
+}
+
+/// \brief do the fake open
+void ReadThread::fakeOpen()
+{
+ fakeMode=true;
+ emit opened();
+}
+
+/// \brief do the fake writeIsStarted
+void ReadThread::fakeReadIsStarted()
+{
+ emit readIsStarted();
+}
+
+/// \brief do the fake writeIsStopped
+void ReadThread::fakeReadIsStopped()
+{
+ emit readIsStopped();
+}
+
+qint64 ReadThread::getLastGoodPosition()
+{
+ if(lastGoodPosition>file.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] Bug, the lastGoodPosition is greater than the file size!");
+ return file.size();
+ }
+ else
+ return lastGoodPosition;
+}
+
+//reopen after an error
+void ReadThread::reopen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ if(isInReadLoop)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] try reopen where read is not finish");
+ return;
+ }
+ stopIt=true;
+ emit internalStartReopen();
+}
+
+bool ReadThread::internalReopen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ stopIt=false;
+ file.close();
+ if(size_at_open!=file.size() && mtime_at_open!=QFileInfo(file).lastModified())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] source file have changed since the last open, restart all");
+ //fix this function like the close function
+ lastGoodPosition=0;
+ if(internalOpen(false))
+ {
+ emit resumeAfterErrorByRestartAll();
+ return true;
+ }
+ else
+ return false;
+ }
+ else
+ {
+ //fix this function like the close function
+ if(internalOpen(false))
+ {
+ emit resumeAfterErrorByRestartAtTheLastPosition();
+ return true;
+ }
+ else
+ return false;
+ }
+}
+
+//set the write thread
+void ReadThread::setWriteThread(WriteThread * writeThread)
+{
+ this->writeThread=writeThread;
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+//to set the id
+void ReadThread::setId(int id)
+{
+ this->id=id;
+}
+#endif
+
+void ReadThread::seekToZeroAndWait()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ stopIt=true;
+ seekToZero=true;
+ emit checkIfIsWait();
+}
+
+void ReadThread::isInWait()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ if(seekToZero)
+ {
+ seekToZero=false;
+ if(file.isOpen())
+ seek(0);
+ else
+ internalOpen(true);
+ emit isSeekToZeroAndWait();
+ }
+}
+
+bool ReadThread::isReading()
+{
+ return isInReadLoop;
+}
+
diff --git a/plugins/CopyEngine/Ultracopier-0.3/ReadThread.h b/plugins/CopyEngine/Ultracopier-0.3/ReadThread.h
new file mode 100644
index 0000000..537134a
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/ReadThread.h
@@ -0,0 +1,137 @@
+/** \file ReadThread.h
+\brief Thread changed to open/close and read the source file
+\author alpha_one_x86
+\version 0.3
+\date 2011 */
+
+#ifndef READTHREAD_H
+#define READTHREAD_H
+
+#include <QThread>
+#include <QByteArray>
+#include <QSemaphore>
+#include <QTimer>
+#include <QDateTime>
+#include <QFileInfo>
+
+#include "WriteThread.h"
+#include "Environment.h"
+#include "StructEnumDefinition_CopyEngine.h"
+#include "AvancedQFile.h"
+
+/// \todo do fake open/close
+
+/// \brief Thread changed to open/close and read the source file
+class ReadThread : public QThread
+{
+ Q_OBJECT
+public:
+ explicit ReadThread();
+ ~ReadThread();
+protected:
+ void run();
+public:
+ /// \brief open with the name and copy mode
+ void open(const QString &name,const CopyMode &mode);
+ /// \brief return the error string
+ QString errorString();
+ //QByteArray read(qint64 position,qint64 maxSize);
+ /// \brief stop the copy
+ void stop();
+ /// \brief put the copy in pause
+ bool pause();
+ /// \brief resume the copy
+ void resume();
+ /// \brief get the size of the source file
+ qint64 size();
+ /// \brief get the last good position
+ qint64 getLastGoodPosition();
+ /// \brief start the reading of the source file
+ void startRead();
+ /// \brief set the current max speed in KB/s
+ int setMaxSpeed(int maxSpeed);
+ /// \brief set block size in KB
+ bool setBlockSize(const int blockSize);
+ /// \brief reopen after an error
+ void reopen();
+ /// \brief set the write thread
+ void setWriteThread(WriteThread * writeThread);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief to set the id
+ void setId(int id);
+ /// \brief stat
+ enum ReadStat
+ {
+ Idle=0,
+ InodeOperation=1,
+ Read=2,
+ WaitWritePipe=3
+ };
+ ReadStat stat;
+ #endif
+ /// \brief return if it's reading
+ bool isReading();
+ /// \brief executed at regular interval to do a speed throling
+ void timeOfTheBlockCopyFinished();
+ /// \brief do the fake open
+ void fakeOpen();
+ /// \brief do the fake readIsStarted
+ void fakeReadIsStarted();
+ /// \brief do the fake readIsStopped
+ void fakeReadIsStopped();
+public slots:
+ /// \brief to reset the copy, and put at the same state when it just open
+ void seekToZeroAndWait();
+signals:
+ void error();
+ void isInPause();
+ void opened();
+ void readIsStarted();
+ void readIsStopped();
+ void closed();
+ void isSeekToZeroAndWait();
+ void checkIfIsWait();
+ void resumeAfterErrorByRestartAll();
+ void resumeAfterErrorByRestartAtTheLastPosition();
+ // internal signals
+ void internalStartOpen();
+ void internalStartReopen();
+ void internalStartRead();
+ void internalStartClose();
+ /// \brief To debug source
+ void debugInformation(DebugLevel level,QString fonction,QString text,QString file,int ligne);
+private:
+ QString name;
+ QString errorString_internal;
+ AvancedQFile file;
+ volatile bool stopIt;
+ CopyMode mode;
+ qint64 lastGoodPosition;
+ volatile int blockSize;
+ volatile int maxSpeed; ///< The max speed in KB/s, 0 for no limit
+ QSemaphore waitNewClockForSpeed;
+ volatile int numberOfBlockCopied; ///< Multiple for count the number of block copied
+ volatile int multiplicatorForBigSpeed; ///< Multiple for count the number of block needed
+ volatile int MultiForBigSpeed;
+ WriteThread* writeThread;
+ int id;
+ QSemaphore isOpen;
+ volatile bool putInPause;
+ volatile bool isInReadLoop;
+ volatile bool seekToZero;
+ volatile bool tryStartRead;
+ qint64 size_at_open;
+ QDateTime mtime_at_open;
+ bool fakeMode;
+ //internal function
+ bool seek(qint64 position);/// \todo search if is use full
+private slots:
+ bool internalOpen(bool resetLastGoodPosition=true);
+ bool internalReopen();
+ void internalRead();
+ void internalClose(bool callByTheDestructor=false);
+ void postOperation();
+ void isInWait();
+};
+
+#endif // READTHREAD_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/RmPath.cpp b/plugins/CopyEngine/Ultracopier-0.3/RmPath.cpp
new file mode 100644
index 0000000..e7617fc
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/RmPath.cpp
@@ -0,0 +1,127 @@
+#include "RmPath.h"
+
+RmPath::RmPath()
+{
+ stopIt=false;
+ waitAction=false;
+ setObjectName("RmPath");
+ moveToThread(this);
+ start();
+}
+
+RmPath::~RmPath()
+{
+ stopIt=true;
+ quit();
+ wait();
+}
+
+void RmPath::addPath(const QString &path)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+path);
+ if(stopIt)
+ return;
+ emit internalStartAddPath(path);
+}
+
+void RmPath::skip()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ emit internalStartSkip();
+}
+
+void RmPath::retry()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ emit internalStartRetry();
+}
+
+void RmPath::run()
+{
+ connect(this,SIGNAL(internalStartAddPath(QString)),this,SLOT(internalAddPath(QString)),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartDoThisPath()),this,SLOT(internalDoThisPath()),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartSkip()),this,SLOT(internalSkip()),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartRetry()),this,SLOT(internalRetry()),Qt::QueuedConnection);
+ exec();
+}
+
+void RmPath::internalDoThisPath()
+{
+ if(waitAction || pathList.isEmpty())
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+pathList.first());
+ if(!rmpath(pathList.first()))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to remove the folder: "+pathList.first());
+ emit errorOnFolder(pathList.first(),tr("Unable to remove the folder"));
+ return;
+ }
+ pathList.removeFirst();
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+}
+
+/** remplace QDir::rmpath() because it return false if the folder not exists
+ and seam bug with parent folder */
+bool RmPath::rmpath(const QDir &dir)
+{
+ if(!dir.exists())
+ return true;
+ bool allHaveWork=true;
+ QFileInfoList list = dir.entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System,QDir::DirsFirst);
+ for (int i = 0; i < list.size(); ++i)
+ {
+ QFileInfo fileInfo(list.at(i));
+ if(!fileInfo.isDir())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"found a file: "+fileInfo.fileName());
+ allHaveWork=false;
+ }
+ else
+ {
+ //return the fonction for scan the new folder
+ if(!rmpath(dir.absolutePath()+fileInfo.fileName()+'/'))
+ allHaveWork=false;
+ }
+ }
+ if(!allHaveWork)
+ return allHaveWork;
+ allHaveWork=dir.rmdir(dir.absolutePath());
+ if(!allHaveWork)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to remove the folder: "+dir.absolutePath());
+ return allHaveWork;
+}
+
+void RmPath::internalAddPath(const QString &path)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+path);
+ pathList << path;
+ if(!waitAction)
+ checkIfCanDoTheNext();
+}
+
+void RmPath::checkIfCanDoTheNext()
+{
+ if(!waitAction && !stopIt && pathList.size()>0)
+ emit internalStartDoThisPath();
+}
+
+void RmPath::internalSkip()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ waitAction=false;
+ pathList.removeFirst();
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+}
+
+void RmPath::internalRetry()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ waitAction=false;
+ checkIfCanDoTheNext();
+}
+
diff --git a/plugins/CopyEngine/Ultracopier-0.3/RmPath.h b/plugins/CopyEngine/Ultracopier-0.3/RmPath.h
new file mode 100644
index 0000000..5eca5e1
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/RmPath.h
@@ -0,0 +1,56 @@
+/** \file RmPath.h
+\brief Remove the path given as queued rmpath
+\author alpha_one_x86
+\version 0.3
+\date 2011 */
+
+#ifndef RMPATH_H
+#define RMPATH_H
+
+#include <QThread>
+#include <QFileInfo>
+#include <QString>
+#include <QSemaphore>
+#include <QStringList>
+#include <QDir>
+
+#include "Environment.h"
+
+/// \brief Remove the path given as queued rmpath
+class RmPath : public QThread
+{
+ Q_OBJECT
+public:
+ explicit RmPath();
+ ~RmPath();
+ /// \brief add new path to remove
+ void addPath(const QString &path);
+signals:
+ void errorOnFolder(const QFileInfo &,const QString &);
+ void firstFolderFinish();
+ void internalStartAddPath(const QString &path);
+ void internalStartDoThisPath();
+ void internalStartSkip();
+ void internalStartRetry();
+ void debugInformation(const DebugLevel &level,const QString &fonction,const QString &text,const QString &file,const int &ligne);
+public slots:
+ void skip();
+ void retry();
+private:
+ void run();
+ bool waitAction;
+ bool stopIt;
+ bool skipIt;
+ QStringList pathList;
+ void checkIfCanDoTheNext();
+ QDir dir;
+ bool rmpath(const QDir &dir);
+private slots:
+ void internalDoThisPath();
+ void internalAddPath(const QString &path);
+ void internalSkip();
+ void internalRetry();
+};
+
+
+#endif // RMPATH_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/StructEnumDefinition.h b/plugins/CopyEngine/Ultracopier-0.3/StructEnumDefinition.h
new file mode 100644
index 0000000..c1758f4
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/StructEnumDefinition.h
@@ -0,0 +1 @@
+#include "../../../StructEnumDefinition.h"
diff --git a/plugins/CopyEngine/Ultracopier-0.3/StructEnumDefinition_CopyEngine.h b/plugins/CopyEngine/Ultracopier-0.3/StructEnumDefinition_CopyEngine.h
new file mode 100644
index 0000000..88971aa
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/StructEnumDefinition_CopyEngine.h
@@ -0,0 +1,51 @@
+/** \file StructEnumDefinition_CopyEngine.h
+\brief Define the structure and enumeration used in the copy engine
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#ifndef STRUCTDEF_COPYENGINE_H
+#define STRUCTDEF_COPYENGINE_H
+
+/// \brief Define action if file exists
+enum FileExistsAction
+{
+ FileExists_NotSet,
+ FileExists_Cancel,
+ FileExists_Skip,
+ FileExists_Overwrite,
+ FileExists_OverwriteIfNewer,
+ FileExists_OverwriteIfNotSameModificationDate,
+ FileExists_Rename
+};
+
+/// \brief Define action if file error
+enum FileErrorAction
+{
+ FileError_NotSet,
+ FileError_Cancel,
+ FileError_Skip,
+ FileError_Retry,
+ FileError_PutToEndOfTheList
+};
+
+/// \brief Define overwrite mode
+/*enum OverwriteMode
+{
+ OverwriteMode_None,
+ OverwriteMode_Overwrite,
+ OverwriteMode_OverwriteIfNewer,
+ OverwriteMode_OverwriteIfNotSameModificationDate
+};*/
+
+/// \brief Define action if file exists
+enum FolderExistsAction
+{
+ FolderExists_NotSet,
+ FolderExists_Cancel,
+ FolderExists_Merge,
+ FolderExists_Skip,
+ FolderExists_Rename
+};
+
+#endif // STRUCTDEF_COPYENGINE_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/TransferThread.cpp b/plugins/CopyEngine/Ultracopier-0.3/TransferThread.cpp
new file mode 100644
index 0000000..359a705
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/TransferThread.cpp
@@ -0,0 +1,977 @@
+//presume bug linked as multple paralelle inode to resume after "overwrite"
+//then do overwrite node function to not re-set the file name
+
+#include "TransferThread.h"
+
+#ifdef Q_CC_GNU
+//this next header is needed to change file time/date under gcc
+#include <utime.h>
+#endif
+
+/// \todo manage case resume after error, because previously inode opt free before
+/// \todo manage error in pre and post operation
+/// \todo remove destination when canceled
+/// \todo test if source if closed by end but write error
+/// \todo pointer for readThread and writeThread to destroy the read before the write (prevent dead lock)
+
+/// \bug continue progress when write error
+
+TransferThread::TransferThread()
+{
+ start();
+ moveToThread(this);
+ needSkip = false;
+ stat = Idle;
+ stopIt = false;
+ fileExistsAction = FileExists_NotSet;
+ alwaysDoFileExistsAction= FileExists_NotSet;
+ readError = false;
+ writeError = false;
+ this->mkpathTransfer = mkpathTransfer;
+ readThread.setWriteThread(&writeThread);
+
+ connect(&clockForTheCopySpeed, SIGNAL(timeout()), this, SLOT(timeOfTheBlockCopyFinished()));
+ maxTime=QDateTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
+}
+
+TransferThread::~TransferThread()
+{
+ exit();
+ disconnect(&readThread);
+ disconnect(&writeThread);
+ disconnect(this);
+ wait();
+}
+
+void TransferThread::run()
+{
+ //ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start: "+QString::number((qint64)QThread::currentThreadId()));
+ stat = Idle;
+ stopIt = false;
+ fileExistsAction = FileExists_NotSet;
+ alwaysDoFileExistsAction= FileExists_NotSet;
+ //the error push
+ connect(&readThread,SIGNAL(error()), this, SLOT(getReadError()), Qt::QueuedConnection);
+ connect(&writeThread,SIGNAL(error()), this, SLOT(getWriteError()), Qt::QueuedConnection);
+ //the thread change operation
+ connect(this,SIGNAL(internalStartPreOperation()), this, SLOT(preOperation()), Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartPostOperation()), this, SLOT(postOperation()), Qt::QueuedConnection);
+ //the state change operation
+ connect(&readThread,SIGNAL(readIsStopped()), &readThread, SLOT(postOperation()), Qt::QueuedConnection);
+ connect(&readThread,SIGNAL(opened()), this, SLOT(readIsReady()), Qt::QueuedConnection);
+ connect(&writeThread,SIGNAL(opened()), this, SLOT(writeIsReady()), Qt::QueuedConnection);
+ connect(&readThread,SIGNAL(readIsStopped()), this, SLOT(readIsStopped()), Qt::QueuedConnection);
+ connect(&writeThread,SIGNAL(writeIsStopped()), this, SLOT(writeIsStopped()), Qt::QueuedConnection);
+ connect(&readThread,SIGNAL(readIsStopped()), &writeThread, SLOT(endIsDetected()), Qt::QueuedConnection);
+ connect(&writeThread,SIGNAL(writeIsStopped()), &writeThread, SLOT(postOperation()), Qt::QueuedConnection);
+ connect(&readThread,SIGNAL(readIsStopped()), this, SLOT(readIsFinish()), Qt::QueuedConnection);
+ connect(&readThread,SIGNAL(closed()), this, SLOT(readIsClosed()), Qt::QueuedConnection);
+ connect(&writeThread,SIGNAL(closed()), this, SLOT(writeIsClosed()), Qt::QueuedConnection);
+ connect(&writeThread,SIGNAL(reopened()), this, SLOT(writeThreadIsReopened()), Qt::QueuedConnection);
+ //error management
+ connect(&readThread,SIGNAL(isSeekToZeroAndWait()), this, SLOT(readThreadIsSeekToZeroAndWait()), Qt::QueuedConnection);
+ connect(&readThread,SIGNAL(resumeAfterErrorByRestartAtTheLastPosition()), this, SLOT(readThreadResumeAfterError()), Qt::QueuedConnection);
+ connect(&readThread,SIGNAL(resumeAfterErrorByRestartAll()), &writeThread, SLOT(flushAndSeekToZero()), Qt::QueuedConnection);
+ connect(&writeThread,SIGNAL(flushedAndSeekedToZero()), this, SLOT(readThreadResumeAfterError()), Qt::QueuedConnection);
+ connect(this,SIGNAL(internalTryStartTheTransfer()), this, SLOT(internalStartTheTransfer()), Qt::QueuedConnection);
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(&readThread,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)),this,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)),Qt::QueuedConnection);
+ connect(&writeThread,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)),this,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)),Qt::QueuedConnection);
+ #endif
+
+ /// \todo do the current post opt only after the read write opt
+ exec();
+}
+
+TransferThread::TransferStat TransferThread::getStat()
+{
+ return stat;
+}
+
+void TransferThread::startTheTransfer()
+{
+ emit internalTryStartTheTransfer();
+}
+
+void TransferThread::internalStartTheTransfer()
+{
+ if(stat==Idle)
+ {
+ if(mode!=Move)
+ {
+ /// \bug can pass here because in case of direct move on same media, it return to idle stat directly
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] can't start transfert at idle");
+ }
+ return;
+ }
+ if(stat==PostOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] can't start transfert at PostOperation");
+ return;
+ }
+ if(stat==Transfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] can't start transfert at Transfer");
+ return;
+ }
+ if(canStartTransfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] canStartTransfer is already set to true");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] check how start the transfer");
+ canStartTransfer=true;
+ if(readIsReadyVariable && writeIsReadyVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start directly the transfer");
+ ifCanStartTransfer();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start the transfer as delayed");
+}
+
+void TransferThread::setFiles(const QString &source,const qint64 &size,const QString &destination,const CopyMode &mode)
+{
+ if(stat!=Idle)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] already used, source: "+source+", destination: "+destination);
+ return;
+ }
+ //to prevent multiple file alocation into ListThread::doNewActions_inode_manipulation()
+ stat = PreOperation;
+ //emit pushStat(stat,transferId);
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start, source: "+source+", destination: "+destination);
+ this->source = source;
+ this->destination = destination;
+ this->mode = mode;
+ this->size = size;
+ fileExistsAction = FileExists_NotSet;
+ canStartTransfer = false;
+ sended_state_preOperationStopped= false;
+ canBeMovedDirectlyVariable = false;
+ resetExtraVariable();
+ emit internalStartPreOperation();
+}
+
+void TransferThread::setFileExistsAction(const FileExistsAction &action)
+{
+ if(stat!=PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] already used, source: "+source+", destination: "+destination);
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] action: "+QString::number(action));
+ if(action!=FileExists_Rename)
+ fileExistsAction = action;
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] rename at the wrong part, source: "+source+", destination: "+destination);
+ if(action==FileExists_Skip)
+ {
+ skip();
+ return;
+ }
+ resetExtraVariable();
+ emit internalStartPreOperation();
+}
+
+void TransferThread::setFileRename(const QString &nameForRename)
+{
+ if(stat!=PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] already used, source: "+source+", destination: "+destination);
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] nameForRename: "+nameForRename);
+ destinationInfo.setFile(destination);
+ destination=destinationInfo.absolutePath();
+ destination+=QDir::separator()+nameForRename;
+ destinationInfo.setFile(destination);
+ fileExistsAction = FileExists_NotSet;
+ resetExtraVariable();
+ emit internalStartPreOperation();
+}
+
+void TransferThread::setAlwaysFileExistsAction(const FileExistsAction &action)
+{
+ //ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] action to do always: "+QString::number(action));
+ alwaysDoFileExistsAction=action;
+}
+
+void TransferThread::resetExtraVariable()
+{
+ sended_state_readStopped = false;
+ sended_state_writeStopped = false;
+ writeError = false;
+ readError = false;
+ readIsReadyVariable = false;
+ writeIsReadyVariable = false;
+ readIsFinishVariable = false;
+ readIsClosedVariable = false;
+ writeIsClosedVariable = false;
+ needSkip = false;
+ retry = false;
+ readIsOpenVariable = false;
+ writeIsOpenVariable = false;
+}
+
+void TransferThread::preOperation()
+{
+ if(stat!=PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] already used, source: "+source+", destination: "+destination);
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ needRemove=false;
+ sourceInfo.setFile(source);
+ destinationInfo.setFile(destination);
+ if(isSame())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] is same"+source);
+ return;
+ }
+ if(destinationExists())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] destination exists: "+source);
+ return;
+ }
+ if(canBeMovedDirectly())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] need moved directly: "+source);
+ canBeMovedDirectlyVariable=true;
+ readThread.fakeOpen();
+ writeThread.fakeOpen();
+ return;
+ }
+ tryOpen();
+}
+
+void TransferThread::tryOpen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start source and destination: "+source+" and "+destination);
+ if(!readIsOpenVariable)
+ {
+ readError=false;
+ readThread.open(source,mode);
+ }
+ if(!writeIsOpenVariable)
+ {
+ writeError=false;
+ writeThread.open(destination,sourceInfo.size());
+ }
+}
+
+bool TransferThread::isSame()
+{
+ //check if source and destination is not the same
+ if(sourceInfo==destinationInfo)
+ {
+ emit fileAlreadyExists(sourceInfo,destinationInfo,true);
+ return true;
+ }
+ return false;
+}
+
+bool TransferThread::destinationExists()
+{
+ /// \todo do the overwrite: FileExists_OverwriteIfNotSameModificationDate
+ //check if destination exists
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] overwrite: "+QString::number(fileExistsAction)+", always action: "+QString::number(alwaysDoFileExistsAction));
+ if(alwaysDoFileExistsAction==FileExists_Overwrite || readError || writeError)
+ return false;
+ if(destinationInfo.exists())
+ {
+ if(fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_Skip)
+ {
+ stat=Idle;
+ emit postOperationStopped();
+ return true;
+ }
+ if(alwaysDoFileExistsAction==FileExists_Rename)
+ {
+ QString absolutePath=destinationInfo.absolutePath();
+ QString fileName=destinationInfo.fileName();
+ QString suffix="";
+ if(fileName.contains(QRegExp("^(.*)(\\.[a-z0-9]+)$")))
+ {
+ suffix=fileName;
+ suffix.replace(QRegExp("^(.*)(\\.[a-z0-9]+)$"),"\\2");
+ fileName.replace(QRegExp("^(.*)(\\.[a-z0-9]+)$"),"\\1");
+ }
+ do
+ {
+ if(!fileName.startsWith(tr("Copy of ")))
+ fileName=tr("Copy of ")+fileName;
+ else
+ {
+ if(fileName.contains(QRegExp("_[0-9]+$")))
+ {
+ QString number=fileName;
+ number.replace(QRegExp("^.*_([0-9]+)$"),"\\1");
+ int num=number.toInt()+1;
+ fileName.remove(QRegExp("[0-9]+$"));
+ fileName+=QString::number(num);
+ }
+ else
+ fileName+="_2";
+ }
+ destination=absolutePath+QDir::separator()+fileName+suffix;
+ destinationInfo.setFile(destination);
+ }
+ while(destinationInfo.exists());
+ return false;
+ }
+ if(fileExistsAction==FileExists_OverwriteIfNewer || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfNewer))
+ {
+ if(destinationInfo.lastModified()<sourceInfo.lastModified())
+ return false;
+ else
+ {
+ stat=Idle;
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ if(fileExistsAction==FileExists_OverwriteIfNotSameModificationDate || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfNotSameModificationDate))
+ {
+ if(destinationInfo.lastModified()!=sourceInfo.lastModified())
+ return false;
+ else
+ {
+ stat=Idle;
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ if(fileExistsAction==FileExists_NotSet)
+ {
+ emit fileAlreadyExists(sourceInfo,destinationInfo,false);
+ return true;
+ }
+ }
+ return false;
+}
+
+void TransferThread::tryMoveDirectly()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start the system move");
+
+ //move if on same mount point
+ QFile sourceFile(sourceInfo.absoluteFilePath());
+ QFile destinationFile(destinationInfo.absoluteFilePath());
+ if(destinationFile.exists() && !destinationFile.remove())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+destinationFile.fileName()+", error: "+destinationFile.errorString());
+ emit errorOnFile(destinationInfo,destinationFile.errorString());
+ return;
+ }
+ QDir dir(destinationInfo.absolutePath());
+ {
+ mkpathTransfer->acquire();
+ if(!dir.exists())
+ dir.mkpath(destinationInfo.absolutePath());
+ mkpathTransfer->release();
+ }
+ if(!sourceFile.rename(destinationFile.fileName()))
+ {
+ if(sourceFile.exists())
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("file not not exists %1: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()));
+ else if(!dir.exists())
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("destination folder not exists %1: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("unable to do real move %1: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()));
+ emit errorOnFile(sourceFile,sourceFile.errorString());
+ return;
+ }
+ readThread.fakeReadIsStarted();
+ writeThread.fakeWriteIsStarted();
+ readThread.fakeReadIsStopped();
+ writeThread.fakeWriteIsStopped();
+}
+
+bool TransferThread::canBeMovedDirectly()
+{
+ //move if on same mount point
+ #if defined (Q_OS_LINUX) || defined (Q_OS_WIN32)
+ if(mode!=Move)
+ return false;
+ if(mountSysPoint.size()==0)
+ return false;
+ if(getDrive(destinationInfo.fileName())==getDrive(sourceInfo.fileName()))
+ return true;
+ #endif
+ return false;
+}
+
+void TransferThread::readIsReady()
+{
+ if(readIsReadyVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] double event dropped");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ readIsReadyVariable=true;
+ readIsOpenVariable=true;
+ readIsClosedVariable=false;
+ ifCanStartTransfer();
+}
+
+void TransferThread::ifCanStartTransfer()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] readIsReadyVariable: "+QString::number(readIsReadyVariable)+", writeIsReadyVariable: "+QString::number(writeIsReadyVariable));
+ if(readIsReadyVariable && writeIsReadyVariable)
+ {
+ stat=WaitForTheTransfer;
+ sended_state_readStopped = false;
+ sended_state_writeStopped = false;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] stat=WaitForTheTransfer");
+ if(!sended_state_preOperationStopped)
+ {
+ sended_state_preOperationStopped=true;
+ emit preOperationStopped();
+ }
+ if(canStartTransfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] stat=Transfer");
+ stat=Transfer;
+ if(!canBeMovedDirectlyVariable)
+ {
+ needRemove=true;
+ readThread.startRead();
+ }
+ else
+ tryMoveDirectly();
+ emit pushStat(stat,transferId);
+ }
+ //else
+ //emit pushStat(stat,transferId);
+ }
+}
+
+void TransferThread::writeIsReady()
+{
+ if(writeIsReadyVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] double event dropped");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ writeIsReadyVariable=true;
+ writeIsOpenVariable=true;
+ writeIsClosedVariable=false;
+ ifCanStartTransfer();
+}
+
+
+//set the copy info and options before runing
+void TransferThread::setRightTransfer(const bool doRightTransfer)
+{
+ this->doRightTransfer=doRightTransfer;
+}
+
+//set keep date
+void TransferThread::setKeepDate(const bool keepDate)
+{
+ this->keepDate=keepDate;
+}
+
+//set the current max speed in KB/s
+void TransferThread::setMaxSpeed(int maxSpeed)
+{
+ int interval=readThread.setMaxSpeed(maxSpeed);
+ if(maxSpeed>0)
+ {
+ clockForTheCopySpeed.setInterval(interval);
+ if(!clockForTheCopySpeed.isActive())//seam useless !this->isFinished()
+ clockForTheCopySpeed.start();
+ }
+ else
+ {
+ if(clockForTheCopySpeed.isActive())
+ clockForTheCopySpeed.stop();
+ }
+}
+
+//set block size in KB
+bool TransferThread::setBlockSize(const unsigned int blockSize)
+{
+ this->blockSize=blockSize;
+ return readThread.setBlockSize(blockSize);
+}
+
+//pause the copy
+void TransferThread::pause()
+{
+ readThread.pause();
+}
+
+//resume the copy
+void TransferThread::resume()
+{
+ readThread.resume();
+}
+
+//stop the current copy
+void TransferThread::stop()
+{
+ stopIt=true;
+ readThread.stop();
+ writeThread.stop();
+}
+
+void TransferThread::readIsFinish()
+{
+ if(readIsFinishVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] double event dropped");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ readIsFinishVariable=true;
+ canStartTransfer=false;
+ stat=PostTransfer;
+ emit pushStat(stat,transferId);
+}
+
+void TransferThread::readIsClosed()
+{
+ if(readIsClosedVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] double event dropped");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ readIsClosedVariable=true;
+ checkIfAllIsClosed();
+}
+
+void TransferThread::writeIsClosed()
+{
+ if(writeIsClosedVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] double event dropped");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ writeIsClosedVariable=true;
+ checkIfAllIsClosed();
+}
+
+bool TransferThread::checkIfAllIsClosed()
+{
+ if((readError || writeError) && !needSkip)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] resolve error before progress");
+ return false;
+ }
+ if((!readIsReadyVariable || readIsClosedVariable) && (!writeIsReadyVariable || writeIsClosedVariable))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] emit internalStartPostOperation() to do the real post operation");
+ stat=PostOperation;
+ //emit pushStat(stat,transferId);
+ emit internalStartPostOperation();
+ return true;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] wait self close");
+ return false;
+ }
+}
+
+/// \todo found way to retry that's
+/// \todo the rights copy
+void TransferThread::postOperation()
+{
+ if(stat!=PostOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] need be in transfer, source: "+source+", destination: "+destination+", stat:"+QString::number(stat));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ //all except closing
+ if((readError || writeError) && !needSkip)//normally useless by checkIfAllIsFinish()
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] resume after error");
+ return;
+ }
+
+ if(!needSkip)
+ {
+ if(!doFilePostOperation())
+ return;
+
+ //remove source in moving mode
+ if(mode==Move && !canBeMovedDirectlyVariable)
+ {
+ if(QFile::exists(destination))
+ {
+ QFile sourceFile(source);
+ if(!sourceFile.remove())
+ {
+ emit errorOnFile(sourceInfo,sourceFile.errorString());
+ return;
+ }
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] try remove source but destination not exists!");
+ }
+ }
+ else//do difference skip a file and skip this error case
+ {
+ if(needRemove && QFile::exists(destination))
+ {
+ QFile destinationFile(destination);
+ if(!destinationFile.remove())
+ {
+ //emit errorOnFile(sourceInfo,destinationFile.errorString());
+ //return;
+ }
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] try remove destination but not exists!");
+ }
+ stat=Idle;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] emit postOperationStopped()");
+ emit postOperationStopped();
+}
+
+bool TransferThread::doFilePostOperation()
+{
+ //do operation needed by copy
+ if(!canBeMovedDirectlyVariable)
+ {
+ //set the time if no write thread used
+ if(keepDate)
+ changeFileDateTime(destination,source);//can't do that's after move because after move the source not exist
+ /*
+ ignore it, because need correct management, mainly with move
+ if(!)
+ {
+ emit errorOnFile(destinationInfo,tr("Unable to change the date"));//destination.errorString()
+ return false;
+ }*/
+ }
+
+ if(stopIt)
+ return false;
+
+ return true;
+}
+
+//////////////////////////////////////////////////////////////////
+/////////////////////// Error management /////////////////////////
+//////////////////////////////////////////////////////////////////
+
+void TransferThread::getWriteError()
+{
+ if(writeError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] already in write error!");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ writeError = true;
+ writeIsReadyVariable = false;
+ writeError_source_seeked = false;
+ writeError_destination_reopened = false;
+ emit errorOnFile(destinationInfo,writeThread.errorString());
+}
+
+void TransferThread::getReadError()
+{
+ if(readError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] already in read error!");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ readError = true;
+ writeIsReadyVariable = false;
+ readIsReadyVariable = false;
+ emit errorOnFile(sourceInfo,readThread.errorString());
+}
+
+//retry after error
+void TransferThread::retryAfterError()
+{
+ //opening error
+ if(stat==PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] is not idle, source: "+source+", destination: "+destination+", stat: "+QString::number(stat));
+ tryOpen();
+ return;
+ }
+ //data streaming error
+ if(stat!=PostOperation && stat!=Transfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"["+QString::number(id)+"] is not idle, source: "+source+", destination: "+destination+", stat: "+QString::number(stat));
+ return;
+ }
+ if(canBeMovedDirectlyVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] retry the system move");
+ tryMoveDirectly();
+ return;
+ }
+ if(writeError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start and resume the write error");
+ readThread.seekToZeroAndWait();
+ writeThread.reopen();
+ }
+ else if(readError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start and resume the read error");
+ readThread.reopen();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] unknow error resume");
+}
+
+void TransferThread::writeThreadIsReopened()
+{
+ if(writeError_destination_reopened)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] double event dropped");
+ return;
+ }
+ writeError_destination_reopened=true;
+ if(writeError_source_seeked && writeError_destination_reopened)
+ resumeTransferAfterWriteError();
+}
+
+void TransferThread::readThreadIsSeekToZeroAndWait()
+{
+ if(writeError_source_seeked)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] double event dropped");
+ return;
+ }
+ writeError_source_seeked=true;
+ if(writeError_source_seeked && writeError_destination_reopened)
+ resumeTransferAfterWriteError();
+}
+
+void TransferThread::resumeTransferAfterWriteError()
+{
+ writeError=false;
+/********************************
+ if(canStartTransfer)
+ readThread.startRead();
+useless, because the open destination event
+will restart the transfer as normal
+*********************************/
+/*********************************
+if(!canStartTransfer)
+ stat=WaitForTheTransfer;
+useless because already do at open event
+**********************************/
+ //if is in wait
+ if(!canStartTransfer)
+ emit checkIfItCanBeResumed();
+}
+
+void TransferThread::readThreadResumeAfterError()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ readError=false;
+ writeIsReady();
+ readIsReady();
+}
+
+//////////////////////////////////////////////////////////////////
+///////////////////////// Normal event ///////////////////////////
+//////////////////////////////////////////////////////////////////
+
+void TransferThread::readIsStopped()
+{
+ if(!sended_state_readStopped)
+ {
+ sended_state_readStopped=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] emit readIsStopped()");
+ emit readStopped();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] drop dual read stopped");
+}
+
+void TransferThread::writeIsStopped()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ if(!sended_state_writeStopped)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] emit writeStopped()");
+ sended_state_writeStopped=true;
+ emit writeStopped();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] double event dropped");
+}
+
+void TransferThread::timeOfTheBlockCopyFinished()
+{
+ readThread.timeOfTheBlockCopyFinished();
+}
+
+//get drive of an file or folder
+QString TransferThread::getDrive(QString fileOrFolder)
+{
+ for (int i = 0; i < mountSysPoint.size(); ++i) {
+ if(fileOrFolder.startsWith(mountSysPoint.at(i)))
+ return mountSysPoint.at(i);
+ }
+ //if unable to locate the right mount point
+ return "";
+}
+
+//set drive list, used in getDrive()
+void TransferThread::setDrive(QStringList drives)
+{
+ mountSysPoint=drives;
+}
+
+//fonction to edit the file date time
+bool TransferThread::changeFileDateTime(const QString &source,const QString &destination)
+{
+ /*
+ if(maxTime>=sourceInfo.lastModified())
+ return;
+ */
+ QFileInfo fileInfo(destination);
+ time_t ctime=fileInfo.created().toTime_t();
+ time_t actime=fileInfo.lastRead().toTime_t();
+ time_t modtime=fileInfo.lastModified().toTime_t();
+ #ifdef Q_CC_GNU
+ //this function avalaible on unix and mingw
+ utimbuf butime;
+ butime.actime=actime;
+ butime.modtime=modtime;
+ //creation time not exists into unix world
+ Q_UNUSED(ctime)
+ return utime(source.toLatin1().data(),&butime)==0;
+ #else
+ return false;
+ #endif
+ return true;
+}
+
+//skip the copy
+void TransferThread::skip()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start with stat: "+QString::number(stat));
+ switch(stat)
+ {
+ case PreOperation:
+ case WaitForTheTransfer:
+ needSkip=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] case WaitForTheTransfer or PreOperation, readIsReadyVariable: "+QString::number(readIsReadyVariable)+", readIsClosedVariable: "+QString::number(readIsClosedVariable)+", writeIsReadyVariable: "+QString::number(writeIsReadyVariable)+", writeIsClosedVariable: "+QString::number(writeIsClosedVariable));
+ //check if all is source and destination is closed
+ if(!checkIfAllIsClosed())
+ {
+ if(readIsReadyVariable && !readIsClosedVariable)
+ readThread.stop();
+ if(writeIsReadyVariable && !writeIsClosedVariable)
+ writeThread.stop();
+ }
+ break;
+ case Transfer:
+ needSkip=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] case Transfer, readIsReadyVariable: "+QString::number(readIsReadyVariable)+", readIsClosedVariable: "+QString::number(readIsClosedVariable)+", writeIsReadyVariable: "+QString::number(writeIsReadyVariable)+", writeIsClosedVariable: "+QString::number(writeIsClosedVariable));
+ if(!checkIfAllIsClosed())
+ {
+ if(readIsReadyVariable && !readIsClosedVariable)
+ readThread.stop();
+ if(writeIsReadyVariable && !writeIsClosedVariable)
+ writeThread.stop();
+ }
+ break;
+ case PostOperation:
+ //do nothing because here is closing...
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] is already in post op");
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] can skip in this state!");
+ return;
+ }
+}
+
+//return info about the copied size
+qint64 TransferThread::copiedSize()
+{
+ switch(stat)
+ {
+ case Transfer:
+ case PostOperation:
+ return readThread.getLastGoodPosition();
+ default:
+ return 0;
+ }
+}
+
+//retry after error
+void TransferThread::putAtBottom()
+{
+ emit tryPutAtBottom();
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+//to set the id
+void TransferThread::setId(int id)
+{
+ this->id=id;
+ readThread.setId(id);
+ writeThread.setId(id);
+}
+
+QChar TransferThread::readingLetter()
+{
+ switch(readThread.stat)
+ {
+ case ReadThread::Idle:
+ return '_';
+ break;
+ case ReadThread::InodeOperation:
+ return 'I';
+ break;
+ case ReadThread::Read:
+ return 'R';
+ break;
+ case ReadThread::WaitWritePipe:
+ return 'W';
+ break;
+ default:
+ return '?';
+ }
+}
+
+QChar TransferThread::writingLetter()
+{
+ switch(writeThread.stat)
+ {
+ case WriteThread::Idle:
+ return '_';
+ break;
+ case WriteThread::InodeOperation:
+ return 'I';
+ break;
+ case WriteThread::Write:
+ return 'W';
+ break;
+ case WriteThread::Close:
+ return 'C';
+ break;
+ default:
+ return '?';
+ }
+}
+
+#endif
+
+void TransferThread::setMkpathTransfer(QSemaphore *mkpathTransfer)
+{
+ this->mkpathTransfer=mkpathTransfer;
+ writeThread.setMkpathTransfer(mkpathTransfer);
+}
diff --git a/plugins/CopyEngine/Ultracopier-0.3/TransferThread.h b/plugins/CopyEngine/Ultracopier-0.3/TransferThread.h
new file mode 100644
index 0000000..37aa608
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/TransferThread.h
@@ -0,0 +1,202 @@
+/** \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 to have the transfer status
+ enum TransferStat
+ {
+ Idle=0,
+ PreOperation=1,
+ WaitForTheTransfer=2,
+ Transfer=3,
+ PostTransfer=4,
+ PostOperation=5
+ };
+ /// \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;
+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();
+private slots:
+ void preOperation();
+ void readIsReady();
+ void writeIsReady();
+ void readIsFinish();
+ void readIsClosed();
+ void writeIsClosed();
+ void postOperation();
+ void getWriteError();
+ void getReadError();
+ //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 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;
+ 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;
+ //error management
+ bool writeError,writeError_source_seeked,writeError_destination_reopened;
+ bool readError;
+ //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
diff --git a/plugins/CopyEngine/Ultracopier-0.3/Variable.h b/plugins/CopyEngine/Ultracopier-0.3/Variable.h
new file mode 100644
index 0000000..a04d7eb
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/Variable.h
@@ -0,0 +1,33 @@
+/** \file Variable.h
+\brief Define the environment variable
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#ifndef VARIABLE_H
+#define VARIABLE_H
+
+//Un-comment this next line to put ultracopier plugin in debug mode
+#define ULTRACOPIER_PLUGIN_DEBUG
+#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW_TIMER 150
+
+#define ULTRACOPIER_PLUGIN_MAXBUFFERBLOCK 64
+#define ULTRACOPIER_PLUGIN_MINTIMERINTERVAL 50
+#define ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL 100
+#define ULTRACOPIER_PLUGIN_NUMSEMSPEEDMANAGEMENT 2
+#define ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT 64
+#define ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER 1
+#define ULTRACOPIER_PLUGIN_MINIMALYEAR 1990
+
+//if set, check the inode type at scanFileOrFolder, deprecated into the new algorithm and not used
+#define ULTRACOPIER_PLUGIN_CHECKLISTTYPE
+
+/** \brief Need be greater than 2, but greater than 20 to be efficient */
+#define ULTRACOPIER_PLUGIN_TIME_UPDATE_TRASNFER_LIST 40
+#define ULTRACOPIER_PLUGIN_TIME_UPDATE_PROGRESSION 200
+
+#endif // VARIABLE_H
+
+
+
diff --git a/plugins/CopyEngine/Ultracopier-0.3/WriteThread.cpp b/plugins/CopyEngine/Ultracopier-0.3/WriteThread.cpp
new file mode 100644
index 0000000..fc46d1f
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/WriteThread.cpp
@@ -0,0 +1,344 @@
+#include "WriteThread.h"
+
+#include <QDir>
+
+WriteThread::WriteThread()
+{
+ stopIt=false;
+ /// \test lot of level of priority
+ isOpen.release();
+ start();
+ moveToThread(this);
+ setObjectName("write");
+ this->mkpathTransfer = mkpathTransfer;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ CurentCopiedSize=0;
+}
+
+WriteThread::~WriteThread()
+{
+ stop();
+ freeBlock.release();
+ emit internalStartClose();
+ disconnect(this);
+ isOpen.acquire();
+ quit();
+ wait();
+}
+
+void WriteThread::run()
+{
+ connect(this,SIGNAL(internalStartOpen()), this,SLOT(internalOpen()), Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartReopen()), this,SLOT(internalReopen()), Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartWrite()), this,SLOT(internalWrite()), Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartClose()), this,SLOT(internalClose()), Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartEndOfFile()), this,SLOT(internalEndOfFile()), Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartFlushAndSeekToZero()), this,SLOT(internalFlushAndSeekToZero()),Qt::QueuedConnection);
+ exec();
+}
+
+bool WriteThread::internalOpen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] internalOpen destination: "+name);
+ if(stopIt)
+ return false;
+ if(file.isOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] already open! destination: "+file.fileName());
+ return false;
+ }
+ //set to LISTBLOCKSIZE
+ while(freeBlock.available()<ULTRACOPIER_PLUGIN_MAXBUFFERBLOCK)
+ freeBlock.release();
+ if(freeBlock.available()>ULTRACOPIER_PLUGIN_MAXBUFFERBLOCK)
+ freeBlock.acquire(freeBlock.available()-ULTRACOPIER_PLUGIN_MAXBUFFERBLOCK);
+ stopIt=false;
+ CurentCopiedSize=0;
+ endDetected=false;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=InodeOperation;
+ #endif
+ file.setFileName(name);
+ //mkpath check if exists and return true if already exists
+ QFileInfo destinationInfo(file);
+ QDir destinationFolder;
+ {
+ mkpathTransfer->acquire();
+ if(!destinationFolder.exists(destinationInfo.absolutePath()))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] "+QString("Try create the path: %1")
+ .arg(destinationInfo.absolutePath()));
+ if(!destinationFolder.mkpath(destinationInfo.absolutePath()))
+ {
+ if(!destinationFolder.exists(destinationInfo.absolutePath()))
+ {
+ /// \todo do real folder error here
+ errorString_internal="mkpath error on destination";
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("Unable create the folder: %1, error: %2")
+ .arg(destinationInfo.absolutePath())
+ .arg(errorString_internal));
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ return false;
+ }
+ }
+ }
+ mkpathTransfer->release();
+ }
+ if(stopIt)
+ return false;
+ //try open it
+ if(file.open(QIODevice::ReadWrite))
+ {
+ if(stopIt)
+ return false;
+ file.seek(0);
+ if(stopIt)
+ return false;
+ file.resize(startSize);
+ if(stopIt)
+ return false;
+ emit opened();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ isOpen.acquire();
+ return true;
+ }
+ else
+ {
+ if(stopIt)
+ return false;
+ errorString_internal=file.errorString();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("Unable to open: %1, error: %2").arg(name).arg(errorString_internal));
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ return false;
+ }
+}
+
+void WriteThread::open(const QString &name,const quint64 &startSize)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] open destination: "+name);
+ if(stopIt)
+ return;
+ fakeMode=false;
+ this->name=name;
+ this->startSize=startSize;
+ endDetected=false;
+ emit internalStartOpen();
+}
+
+void WriteThread::endIsDetected()
+{
+ if(endDetected)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] double event dropped");
+ return;
+ }
+ endDetected=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ emit internalStartEndOfFile();
+}
+
+QString WriteThread::errorString()
+{
+ return errorString_internal;
+}
+
+bool WriteThread::write(const QByteArray &data)
+{
+ if(stopIt)
+ return false;
+ freeBlock.acquire();
+ if(stopIt)
+ return false;
+ {
+ QMutexLocker lock_mutex(&accessList);
+ theBlockList.append(data);
+ }
+ emit internalStartWrite();
+ return true;
+}
+
+void WriteThread::stop()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] stop()");
+ stopIt=true;
+ freeBlock.release();
+ // useless because stopIt will close all thread, but if thread not runing run it
+ endIsDetected();
+ //emit internalStartClose();
+}
+
+void WriteThread::flushBuffer()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ freeBlock.release();
+ freeBlock.acquire();
+ {
+ QMutexLocker lock_mutex(&accessList);
+ theBlockList.clear();
+ }
+}
+
+void WriteThread::internalEndOfFile()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] writeIsStopped");
+ emit writeIsStopped();
+}
+
+void WriteThread::internalWrite()
+{
+ if(stopIt)
+ return;
+ //read one block
+ if(theBlockList.size()<=0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] End detected of the file");
+ return;
+ }
+ else
+ {
+ QMutexLocker lock_mutex(&accessList);
+ blockArray=theBlockList.first();
+ theBlockList.removeFirst();
+ }
+ //write one block
+ freeBlock.release();
+
+ if(stopIt)
+ return;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Write;
+ #endif
+ bytesWriten=file.write(blockArray);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ //mutex for stream this data
+ if(CurentCopiedSize==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] emit writeIsStarted()");
+ emit writeIsStarted();
+ }
+ CurentCopiedSize+=bytesWriten;
+ if(stopIt)
+ return;
+ if(file.error()!=QFile::NoError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("Error in writing: %1 (%2)").arg(file.errorString()).arg(file.error()));
+ errorString_internal=QString("Error in writing: %1 (%2)").arg(file.errorString()).arg(file.error());
+ stopIt=true;
+ emit error();
+ return;
+ }
+ if(bytesWriten!=blockArray.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"["+QString::number(id)+"] "+QString("Error in writing, bytesWriten: %1, blockArray.size(): %2").arg(bytesWriten).arg(blockArray.size()));
+ errorString_internal=QString("Error in writing, bytesWriten: %1, blockArray.size(): %2").arg(bytesWriten).arg(blockArray.size());
+ stopIt=true;
+ emit error();
+ return;
+ }
+ lastGoodPosition+=bytesWriten;
+}
+
+void WriteThread::postOperation()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ emit internalStartClose();
+}
+
+void WriteThread::internalClose(bool emitSignal)
+{
+ /// \note never send signal here, because it's called by the destructor
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Close;
+ #endif
+ if(!fakeMode)
+ {
+ if(startSize!=CurentCopiedSize)
+ file.resize(CurentCopiedSize);
+ file.close();
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ stat=Idle;
+ #endif
+ if(emitSignal)
+ emit closed();
+
+ /// \note always the last of this function
+ if(!fakeMode)
+ isOpen.release();
+}
+
+void WriteThread::internalReopen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ internalClose(false);
+ flushBuffer();
+ stopIt=false;
+ CurentCopiedSize=0;
+ if(internalOpen())
+ emit reopened();
+}
+
+void WriteThread::reopen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] start");
+ stopIt=true;
+ emit internalStartReopen();
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+//to set the id
+void WriteThread::setId(int id)
+{
+ this->id=id;
+}
+#endif
+
+/// \brief do the fake open
+void WriteThread::fakeOpen()
+{
+ fakeMode=true;
+ emit opened();
+}
+
+/// \brief do the fake writeIsStarted
+void WriteThread::fakeWriteIsStarted()
+{
+ emit writeIsStarted();
+}
+
+/// \brief do the fake writeIsStopped
+void WriteThread::fakeWriteIsStopped()
+{
+ emit writeIsStopped();
+}
+
+void WriteThread::flushAndSeekToZero()
+{
+ stopIt=true;
+ emit internalStartFlushAndSeekToZero();
+}
+
+void WriteThread::internalFlushAndSeekToZero()
+{
+ flushBuffer();
+ file.seek(0);
+ stopIt=false;
+ emit flushedAndSeekedToZero();
+}
+
+void WriteThread::setMkpathTransfer(QSemaphore *mkpathTransfer)
+{
+ this->mkpathTransfer=mkpathTransfer;
+}
diff --git a/plugins/CopyEngine/Ultracopier-0.3/WriteThread.h b/plugins/CopyEngine/Ultracopier-0.3/WriteThread.h
new file mode 100644
index 0000000..7a9b4b7
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/WriteThread.h
@@ -0,0 +1,114 @@
+/** \file WriteThread.h
+\brief Thread changed to open/close and write the destination file
+\author alpha_one_x86
+\version 0.3
+\date 2011 */
+
+#ifndef WRITETHREAD_H
+#define WRITETHREAD_H
+
+#include <QThread>
+#include <QByteArray>
+#include <QString>
+#include <QMutex>
+#include <QSemaphore>
+
+#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 QString &name,const quint64 &startSize);
+ /// \brief to return the error string
+ QString errorString();
+ /// \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
+ };
+ WriteStat stat;
+ #endif
+ /// \brief do the fake open
+ void fakeOpen();
+ /// \brief do the fake writeIsStarted
+ void fakeWriteIsStarted();
+ /// \brief do the fake writeIsStopped
+ void fakeWriteIsStopped();
+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();
+signals:
+ void error();
+ void opened();
+ void reopened();
+ void writeIsStarted();
+ void writeIsStopped();
+ void flushedAndSeekedToZero();
+ void closed();
+ //internal signals
+ void internalStartOpen();
+ void internalStartReopen();
+ void internalStartWrite();
+ void internalStartClose();
+ void internalStartEndOfFile();
+ void internalStartFlushAndSeekToZero();
+ /// \brief To debug source
+ void debugInformation(const DebugLevel &level,const QString &fonction,const QString &text,const QString &file,const int &ligne);
+private:
+ QString name;
+ QString errorString_internal;
+ AvancedQFile file;
+ volatile bool stopIt;
+ QMutex accessList; ///< For use the list
+ QSemaphore freeBlock;
+ QSemaphore isOpen;
+ QList<QByteArray> theBlockList; ///< Store the block list
+ quint64 CurentCopiedSize;
+ QByteArray blockArray; ///< temp data for block writing, the data
+ qint64 bytesWriten; ///< temp data for block writing, the bytes writen
+ qint64 lastGoodPosition;
+ int id;
+ bool endDetected;
+ quint64 startSize;
+ QSemaphore *mkpathTransfer;
+ bool fakeMode;
+private slots:
+ bool internalOpen();
+ void internalWrite();
+ void internalClose(bool emitSignal=true);
+ void internalReopen();
+ void internalEndOfFile();
+ void internalFlushAndSeekToZero();
+};
+
+#endif // WRITETHREAD_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/copyEngine-collision-and-error.cpp b/plugins/CopyEngine/Ultracopier-0.3/copyEngine-collision-and-error.cpp
new file mode 100644
index 0000000..81a75bd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/copyEngine-collision-and-error.cpp
@@ -0,0 +1,565 @@
+/** \file copyEngine.cpp
+\brief Define the copy engine
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include <QtCore>
+#include <QFileDialog>
+#include <QMessageBox>
+
+#include "copyEngine.h"
+#include "folderExistsDialog.h"
+
+/// \note Can be call without queue because all call will be serialized
+void copyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the action
+ if(isSame)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"file is same: "+source.absoluteFilePath());
+ tempFileExistsAction=alwaysDoThisActionForFileExists;
+ if(tempFileExistsAction==FileExists_Overwrite || tempFileExistsAction==FileExists_OverwriteIfNewer || tempFileExistsAction==FileExists_OverwriteIfNotSameModificationDate)
+ tempFileExistsAction=FileExists_NotSet;
+ switch(tempFileExistsAction)
+ {
+ case FileExists_Skip:
+ case FileExists_Rename:
+ thread->setFileExistsAction(tempFileExistsAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ alreadyExistsQueueItem newItem;
+ newItem.source=source;
+ newItem.destination=destination;
+ newItem.isSame=isSame;
+ newItem.transfer=thread;
+ newItem.scan=NULL;
+ alreadyExistsQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"show dialog");
+ fileIsSameDialog dialog(interface,source);
+ emit isInPause(true);
+ dialog.exec();/// \bug crash when external close
+ FileExistsAction newAction=dialog.getAction();
+ emit isInPause(false);
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileExists_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileExists)
+ {
+ alwaysDoThisActionForFileExists=newAction;
+ listThread->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ switch(newAction)
+ {
+ default:
+ case FileExists_Skip:
+ emit newCollisionAction("skip");
+ break;
+ case FileExists_Rename:
+ emit newCollisionAction("rename");
+ break;
+ }
+ }
+ if(dialog.getAlways() || newAction!=FileExists_Rename)
+ thread->setFileExistsAction(newAction);
+ else
+ thread->setFileRename(dialog.getNewName());
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"file already exists: "+source.absoluteFilePath()+", destination: "+destination.absoluteFilePath());
+ tempFileExistsAction=alwaysDoThisActionForFileExists;
+ switch(tempFileExistsAction)
+ {
+ case FileExists_Skip:
+ case FileExists_Rename:
+ case FileExists_Overwrite:
+ case FileExists_OverwriteIfNewer:
+ case FileExists_OverwriteIfNotSameModificationDate:
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"always do this action: "+QString::number(tempFileExistsAction));
+ thread->setFileExistsAction(tempFileExistsAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("dialog open, put in queue: %1 %2")
+ .arg(source.absoluteFilePath())
+ .arg(destination.absoluteFilePath())
+ );
+ alreadyExistsQueueItem newItem;
+ newItem.source=source;
+ newItem.destination=destination;
+ newItem.isSame=isSame;
+ newItem.transfer=thread;
+ newItem.scan=NULL;
+ alreadyExistsQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"show dialog");
+ fileExistsDialog dialog(interface,source,destination);
+ emit isInPause(true);
+ dialog.exec();/// \bug crash when external close
+ FileExistsAction newAction=dialog.getAction();
+ emit isInPause(false);
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileExists_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileExists)
+ {
+ alwaysDoThisActionForFileExists=newAction;
+ listThread->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ switch(newAction)
+ {
+ default:
+ case FileExists_Skip:
+ emit newCollisionAction("skip");
+ break;
+ case FileExists_Rename:
+ emit newCollisionAction("rename");
+ break;
+ case FileExists_Overwrite:
+ emit newCollisionAction("overwrite");
+ break;
+ case FileExists_OverwriteIfNewer:
+ emit newCollisionAction("overwriteIfNewer");
+ break;
+ case FileExists_OverwriteIfNotSameModificationDate:
+ emit newCollisionAction("overwriteIfNotSameModificationDate");
+ break;
+ }
+ }
+ if(dialog.getAlways() || newAction!=FileExists_Rename)
+ thread->setFileExistsAction(newAction);
+ else
+ thread->setFileRename(dialog.getNewName());
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"emit queryOneNewDialog()");
+ emit queryOneNewDialog();
+ }
+ return;
+ break;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"stop");
+}
+
+/// \note Can be call without queue because all call will be serialized
+void copyEngine::errorOnFile(QFileInfo fileInfo,QString errorString,TransferThread * thread,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"file have error: "+fileInfo.absoluteFilePath()+", error: "+errorString);
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the action
+ tempFileErrorAction=alwaysDoThisActionForFileError;
+ switch(tempFileErrorAction)
+ {
+ case FileError_Skip:
+ thread->skip();
+ return;
+ case FileError_Retry:
+ thread->retryAfterError();
+ return;
+ case FileError_PutToEndOfTheList:
+ /// \todo do the read transfer locator and put at the end
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"todo list item not found");
+ return;
+ default:
+ if(dialogIsOpen)
+ {
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=fileInfo;
+ newItem.mkPath=false;
+ newItem.rmPath=false;
+ newItem.scan=NULL;
+ newItem.transfer=thread;
+ errorQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"show dialog");
+ emit error(fileInfo.absoluteFilePath(),fileInfo.size(),fileInfo.lastModified(),errorString);
+ fileErrorDialog dialog(interface,fileInfo,errorString);
+ emit isInPause(true);
+ dialog.exec();/// \bug crash when external close
+ FileErrorAction newAction=dialog.getAction();
+ emit isInPause(false);
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileError_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileError)
+ {
+ alwaysDoThisActionForFileError=newAction;
+ switch(newAction)
+ {
+ default:
+ case FileError_Skip:
+ emit newErrorAction("skip");
+ break;
+ case FileError_PutToEndOfTheList:
+ emit newErrorAction("putToEndOfTheList");
+ break;
+ }
+ }
+ switch(newAction)
+ {
+ case FileError_Skip:
+ thread->skip();
+ break;
+ case FileError_Retry:
+ thread->retryAfterError();
+ break;
+ case FileError_PutToEndOfTheList:
+ thread->putAtBottom();
+ /// \todo do the read transfer locator and put at the end
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"todo");
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"file error action wrong");
+ break;
+ }
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"isCalledByShowOneNewDialog==true then not show other dial");
+ return;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"stop");
+}
+
+/// \note Can be call without queue because all call will be serialized
+void copyEngine::folderAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,scanFileOrFolder * thread,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"folder already exists: "+source.absoluteFilePath()+", destination: "+destination.absoluteFilePath());
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the always action
+ tempFolderExistsAction=alwaysDoThisActionForFolderExists;
+ switch(tempFolderExistsAction)
+ {
+ case FolderExists_Skip:
+ case FolderExists_Rename:
+ case FolderExists_Merge:
+ thread->setFolderExistsAction(tempFolderExistsAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ alreadyExistsQueueItem newItem;
+ newItem.source=source;
+ newItem.destination=destination;
+ newItem.isSame=isSame;
+ newItem.transfer=NULL;
+ newItem.scan=thread;
+ alreadyExistsQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"show dialog");
+ folderExistsDialog dialog(interface,source,isSame,destination);
+ dialog.exec();/// \bug crash when external close
+ FolderExistsAction newAction=dialog.getAction();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FolderExists_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFolderExists)
+ setComboBoxFolderColision(newAction);
+ if(!dialog.getAlways() && newAction==FolderExists_Rename)
+ thread->setFolderExistsAction(newAction,dialog.getNewName());
+ else
+ thread->setFolderExistsAction(newAction);
+ dialogIsOpen=false;
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+}
+
+/// \note Can be call without queue because all call will be serialized
+/// \todo all this part
+void copyEngine::errorOnFolder(QFileInfo fileInfo,QString errorString,scanFileOrFolder * thread,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"file have error: "+fileInfo.absoluteFilePath()+", error: "+errorString);
+ if(thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"unable to locate the thread");
+ return;
+ }
+ //load the always action
+ tempFileErrorAction=alwaysDoThisActionForFolderError;
+ switch(tempFileErrorAction)
+ {
+ case FileError_Skip:
+ case FileError_Retry:
+ case FileError_PutToEndOfTheList:
+ thread->setFolderErrorAction(tempFileErrorAction);
+ break;
+ default:
+ if(dialogIsOpen)
+ {
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=fileInfo;
+ newItem.mkPath=false;
+ newItem.rmPath=false;
+ newItem.scan=thread;
+ newItem.transfer=NULL;
+ errorQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"show dialog");
+ emit error(fileInfo.absoluteFilePath(),fileInfo.size(),fileInfo.lastModified(),errorString);
+ fileErrorDialog dialog(interface,fileInfo,errorString);
+ dialog.exec();/// \bug crash when external close
+ FileErrorAction newAction=dialog.getAction();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileError_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileError)
+ setComboBoxFolderError(newAction);
+ dialogIsOpen=false;
+ thread->setFolderErrorAction(newAction);
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"stop");
+}
+
+// -----------------------------------------------------
+
+//mkpath event
+void copyEngine::mkPathErrorOnFolder(QFileInfo folder,QString errorString,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"file have error: "+folder.absoluteFilePath()+", error: "+errorString);
+ //load the always action
+ tempFileErrorAction=alwaysDoThisActionForFolderError;
+ error_index=0;
+ switch(tempFileErrorAction)
+ {
+ case FileError_Skip:
+ listThread->mkPathQueue.skip();
+ return;
+ case FileError_Retry:
+ listThread->mkPathQueue.retry();
+ return;
+ default:
+ if(dialogIsOpen)
+ {
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=folder;
+ newItem.mkPath=true;
+ newItem.rmPath=false;
+ newItem.scan=NULL;
+ newItem.transfer=NULL;
+ errorQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"show dialog");
+ emit error(folder.absoluteFilePath(),folder.size(),folder.lastModified(),errorString);
+ fileErrorDialog dialog(interface,folder,errorString,false);
+ dialog.exec();/// \bug crash when external close
+ FileErrorAction newAction=dialog.getAction();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileError_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileError)
+ {
+ setComboBoxFolderError(newAction);
+ alwaysDoThisActionForFolderError=newAction;
+ }
+ dialogIsOpen=false;
+ switch(newAction)
+ {
+ case FileError_Skip:
+ listThread->mkPathQueue.skip();
+ break;
+ case FileError_Retry:
+ listThread->mkPathQueue.retry();
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unknow switch case: "+QString::number(newAction));
+ break;
+ }
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"stop");
+}
+
+//rmpath event
+void copyEngine::rmPathErrorOnFolder(QFileInfo folder,QString errorString,bool isCalledByShowOneNewDialog)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"file have error: "+folder.absoluteFilePath()+", error: "+errorString);
+ //load the always action
+ tempFileErrorAction=alwaysDoThisActionForFolderError;
+ error_index=0;
+ switch(tempFileErrorAction)
+ {
+ case FileError_Skip:
+ listThread->rmPathQueue.skip();
+ return;
+ case FileError_Retry:
+ listThread->rmPathQueue.retry();
+ return;
+ default:
+ if(dialogIsOpen)
+ {
+ errorQueueItem newItem;
+ newItem.errorString=errorString;
+ newItem.inode=folder;
+ newItem.mkPath=false;
+ newItem.rmPath=true;
+ newItem.scan=NULL;
+ newItem.transfer=NULL;
+ errorQueue << newItem;
+ return;
+ }
+ dialogIsOpen=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"show dialog");
+ emit error(folder.absoluteFilePath(),folder.size(),folder.lastModified(),errorString);
+ fileErrorDialog dialog(interface,folder,errorString,false);
+ dialog.exec();/// \bug crash when external close
+ FileErrorAction newAction=dialog.getAction();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"close dialog: "+QString::number(newAction));
+ if(newAction==FileError_Cancel)
+ {
+ emit cancelAll();
+ return;
+ }
+ if(dialog.getAlways() && newAction!=alwaysDoThisActionForFileError)
+ {
+ setComboBoxFolderError(newAction);
+ alwaysDoThisActionForFolderError=newAction;
+ }
+ dialogIsOpen=false;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"do the action");
+ switch(newAction)
+ {
+ case FileError_Skip:
+ listThread->rmPathQueue.skip();
+ break;
+ case FileError_Retry:
+ listThread->rmPathQueue.retry();
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unknow switch case: "+QString::number(newAction));
+ break;
+ }
+ if(!isCalledByShowOneNewDialog)
+ emit queryOneNewDialog();
+ return;
+ break;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"stop");
+}
+
+//show one new dialog if needed
+void copyEngine::showOneNewDialog()
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"alreadyExistsQueue.size(): "+QString::number(alreadyExistsQueue.size()));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"errorQueue.size(): "+QString::number(errorQueue.size()));
+ loop_size=alreadyExistsQueue.size();
+ while(loop_size>0)
+ {
+ if(alreadyExistsQueue.first().transfer!=NULL)
+ {
+ fileAlreadyExists(alreadyExistsQueue.first().source,
+ alreadyExistsQueue.first().destination,
+ alreadyExistsQueue.first().isSame,
+ alreadyExistsQueue.first().transfer,
+ true);
+ }
+ else if(alreadyExistsQueue.first().scan!=NULL)
+ folderAlreadyExists(alreadyExistsQueue.first().source,
+ alreadyExistsQueue.first().destination,
+ alreadyExistsQueue.first().isSame,
+ alreadyExistsQueue.first().scan,
+ true);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"bug, no thread actived");
+ alreadyExistsQueue.removeFirst();
+ loop_size--;
+ }
+ loop_size=errorQueue.size();
+ while(errorQueue.size()>0)
+ {
+ if(errorQueue.first().transfer!=NULL)
+ errorOnFile(errorQueue.first().inode,errorQueue.first().errorString,errorQueue.first().transfer,true);
+ else if(errorQueue.first().scan!=NULL)
+ errorOnFolder(errorQueue.first().inode,errorQueue.first().errorString,errorQueue.first().scan,true);
+ else if(errorQueue.first().mkPath)
+ mkPathErrorOnFolder(errorQueue.first().inode,errorQueue.first().errorString,true);
+ else if(errorQueue.first().rmPath)
+ rmPathErrorOnFolder(errorQueue.first().inode,errorQueue.first().errorString,true);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"bug, no thread actived");
+ errorQueue.removeFirst();
+ loop_size--;
+ }
+}
diff --git a/plugins/CopyEngine/Ultracopier-0.3/copyEngine.cpp b/plugins/CopyEngine/Ultracopier-0.3/copyEngine.cpp
new file mode 100644
index 0000000..362d332
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/copyEngine.cpp
@@ -0,0 +1,492 @@
+/** \file copyEngine.cpp
+\brief Define the copy engine
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include <QtCore>
+#include <QFileDialog>
+#include <QMessageBox>
+
+#include "copyEngine.h"
+#include "folderExistsDialog.h"
+#include "../../../interface/PluginInterface_CopyEngine.h"
+
+/// \todo do pushed or instant mount point (setDrive, ...)
+/// \todo semaphore to prevent dual mkpath
+/// \todo repair the mkpath, to use mkpath class before file transfer to have the folder
+/** \todo when overwrite with large inode operation, it not start specificly the first in the list
+ When that's is finish, send start file at real transfer start, not inode operation start **/
+
+namespace Ui {
+ class options;
+}
+
+copyEngine::copyEngine(FacilityInterface * facilityInterface) :
+ ui(new Ui::options())
+{
+ listThread=new ListThread(facilityInterface);
+ qRegisterMetaType<TransferThread *>("TransferThread *");
+ qRegisterMetaType<scanFileOrFolder *>("scanFileOrFolder *");
+ qRegisterMetaType<EngineActionInProgress>("EngineActionInProgress");
+ qRegisterMetaType<DebugLevel>("DebugLevel");
+ qRegisterMetaType<FileExistsAction>("FileExistsAction");
+ qRegisterMetaType<FolderExistsAction>("FolderExistsAction");
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ debugDialogWindow.show();
+ #endif
+ connect(listThread,SIGNAL(actionInProgess(EngineActionInProgress)), this,SIGNAL(actionInProgess(EngineActionInProgress)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(newFolderListing(QString)), this,SIGNAL(newFolderListing(QString)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(newCollisionAction(QString)), this,SIGNAL(newCollisionAction(QString)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(newErrorAction(QString)), this,SIGNAL(newErrorAction(QString)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(isInPause(bool)), this,SIGNAL(isInPause(bool)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(cancelAll()), this,SIGNAL(cancelAll()), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(error(QString,quint64,QDateTime,QString)), this,SIGNAL(error(QString,quint64,QDateTime,QString)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(rmPath(QString)), this,SIGNAL(rmPath(QString)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(mkPath(QString)), this,SIGNAL(mkPath(QString)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(newActionOnList(QList<returnActionOnCopyList>)), this,SIGNAL(newActionOnList(QList<returnActionOnCopyList>)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(pushFileProgression(QList<ProgressionItem>)), this,SIGNAL(pushFileProgression(QList<ProgressionItem>)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(pushGeneralProgression(quint64,quint64)), this,SIGNAL(pushGeneralProgression(quint64,quint64)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(syncReady()), this,SIGNAL(syncReady()), Qt::QueuedConnection);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ connect(listThread,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)), this,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)), Qt::QueuedConnection);
+ #endif
+
+ connect(listThread,SIGNAL(send_fileAlreadyExists(QFileInfo,QFileInfo,bool,TransferThread *)), this,SLOT(fileAlreadyExists(QFileInfo,QFileInfo,bool,TransferThread *)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(send_errorOnFile(QFileInfo,QString,TransferThread *)), this,SLOT(errorOnFile(QFileInfo,QString,TransferThread *)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(send_folderAlreadyExists(QFileInfo,QFileInfo,bool,scanFileOrFolder *)), this,SLOT(folderAlreadyExists(QFileInfo,QFileInfo,bool,scanFileOrFolder *)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(send_errorOnFolder(QFileInfo,QString,scanFileOrFolder *)), this,SLOT(errorOnFolder(QFileInfo,QString,scanFileOrFolder *)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(updateTheDebugInfo(QStringList,QStringList,int)), this,SLOT(updateTheDebugInfo(QStringList,QStringList,int)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(errorTransferList(QString)), this,SLOT(errorTransferList(QString)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(warningTransferList(QString)), this,SLOT(warningTransferList(QString)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(mkPathErrorOnFolder(QFileInfo,QString)), this,SLOT(mkPathErrorOnFolder(QFileInfo,QString)), Qt::QueuedConnection);
+ connect(listThread,SIGNAL(rmPathErrorOnFolder(QFileInfo,QString)), this,SLOT(rmPathErrorOnFolder(QFileInfo,QString)), Qt::QueuedConnection);
+
+ connect(this,SIGNAL(signal_pause()), listThread,SLOT(pause()), Qt::QueuedConnection);
+ connect(this,SIGNAL(signal_resume()), listThread,SLOT(resume()), Qt::QueuedConnection);
+ connect(this,SIGNAL(signal_skip(quint64)), listThread,SLOT(skip(quint64)), Qt::QueuedConnection);
+ connect(this,SIGNAL(signal_setCollisionAction(FileExistsAction)), listThread,SLOT(setAlwaysFileExistsAction(FileExistsAction)), Qt::QueuedConnection);
+ connect(this,SIGNAL(signal_setFolderColision(FolderExistsAction)), listThread,SLOT(setFolderColision(FolderExistsAction)), Qt::QueuedConnection);
+ connect(this,SIGNAL(signal_removeItems(QList<int>)), listThread,SLOT(removeItems(QList<int>)), Qt::QueuedConnection);
+ connect(this,SIGNAL(signal_moveItemsOnTop(QList<int>)), listThread,SLOT(moveItemsOnTop(QList<int>)), Qt::QueuedConnection);
+ connect(this,SIGNAL(signal_moveItemsUp(QList<int>)), listThread,SLOT(moveItemsUp(QList<int>)), Qt::QueuedConnection);
+ connect(this,SIGNAL(signal_moveItemsDown(QList<int>)), listThread,SLOT(moveItemsDown(QList<int>)), Qt::QueuedConnection);
+ connect(this,SIGNAL(signal_moveItemsOnBottom(QList<int>)), listThread,SLOT(moveItemsOnBottom(QList<int>)), Qt::QueuedConnection);
+ connect(this,SIGNAL(signal_exportTransferList(QString)), listThread,SLOT(exportTransferList(QString)), Qt::QueuedConnection);
+ connect(this,SIGNAL(signal_importTransferList(QString)), listThread,SLOT(importTransferList(QString)), Qt::QueuedConnection);
+
+ connect(this,SIGNAL(queryOneNewDialog()),SLOT(showOneNewDialog()),Qt::QueuedConnection);
+ interface = NULL;
+ tempWidget = NULL;
+ uiIsInstalled = false;
+ dialogIsOpen = false;
+ maxSpeed = 0;
+ alwaysDoThisActionForFileExists = FileExists_NotSet;
+ alwaysDoThisActionForFileError = FileError_NotSet;
+ checkDestinationFolderExists = false;
+ stopIt = false;
+ size_for_speed = 0;
+}
+
+copyEngine::~copyEngine()
+{
+ stopIt=true;
+ delete listThread;
+ delete ui;
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+void copyEngine::updateTheDebugInfo(QStringList newList,QStringList newList2,int numberOfInodeOperation)
+{
+ debugDialogWindow.setTransferThreadList(newList);
+ debugDialogWindow.setTransferList(newList2);
+ debugDialogWindow.setInodeUsage(numberOfInodeOperation);
+}
+#endif
+
+//to send the options panel
+bool copyEngine::getOptionsEngine(QWidget * tempWidget)
+{
+ this->tempWidget=tempWidget;
+ connect(tempWidget, SIGNAL(destroyed()), this, SLOT(resetTempWidget()));
+ ui->setupUi(tempWidget);
+ //conect the ui widget
+/* connect(ui->doRightTransfer, SIGNAL(toggled(bool)), &threadOfTheTransfer, SLOT(setRightTransfer(bool)));
+ connect(ui->keepDate, SIGNAL(toggled(bool)), &threadOfTheTransfer, SLOT(setKeepDate(bool)));
+ connect(ui->blockSize, SIGNAL(valueChanged(int)), &threadOfTheTransfer, SLOT(setBlockSize(int)));*/
+ connect(ui->autoStart, SIGNAL(toggled(bool)), this, SLOT(setAutoStart(bool)));
+ connect(ui->checkBoxDestinationFolderExists, SIGNAL(toggled(bool)), this, SLOT(setCheckDestinationFolderExists(bool)));
+ uiIsInstalled=true;
+ setRightTransfer(doRightTransfer);
+ setKeepDate(keepDate);
+ setSpeedLimitation(maxSpeed);
+ setBlockSize(blockSize);
+ setAutoStart(autoStart);
+ setCheckDestinationFolderExists(checkDestinationFolderExists);
+ return true;
+}
+
+//to have interface widget to do modal dialog
+void copyEngine::setInterfacePointer(QWidget * interface)
+{
+ this->interface=interface;
+}
+
+bool copyEngine::haveSameSource(const QStringList &sources)
+{
+ return listThread->haveSameSource(sources);
+}
+
+bool copyEngine::haveSameDestination(const QString &destination)
+{
+ return listThread->haveSameDestination(destination);
+}
+
+bool copyEngine::newCopy(const QStringList &sources)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ QString destination = QFileDialog::getExistingDirectory(interface,tr("Select destination directory"),"",QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ if(destination.isEmpty() || destination.isNull() || destination=="")
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"Canceled by the user");
+ return false;
+ }
+ return listThread->newCopy(sources,destination);
+}
+
+bool copyEngine::newCopy(const QStringList &sources,const QString &destination)
+{
+ return listThread->newCopy(sources,destination);
+}
+
+bool copyEngine::newMove(const QStringList &sources)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ QString destination = QFileDialog::getExistingDirectory(interface,tr("Select destination directory"),"",QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ if(destination.isEmpty() || destination.isNull() || destination=="")
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"Canceled by the user");
+ return false;
+ }
+ return listThread->newMove(sources,destination);
+}
+
+bool copyEngine::newMove(const QStringList &sources,const QString &destination)
+{
+ return listThread->newMove(sources,destination);
+}
+
+quint64 copyEngine::realByteTransfered()
+{
+ return size_for_speed;
+}
+
+//speed limitation
+qint64 copyEngine::getSpeedLimitation()
+{
+ return listThread->getSpeedLimitation();
+}
+
+//get collision action
+QList<QPair<QString,QString> > copyEngine::getCollisionAction()
+{
+ QPair<QString,QString> tempItem;
+ QList<QPair<QString,QString> > list;
+ tempItem.first=tr("Ask");tempItem.second="ask";list << tempItem;
+ tempItem.first=tr("Skip");tempItem.second="skip";list << tempItem;
+ tempItem.first=tr("Overwrite");tempItem.second="overwrite";list << tempItem;
+ tempItem.first=tr("Overwrite if newer");tempItem.second="overwriteIfNewer";list << tempItem;
+ tempItem.first=tr("Overwrite if the last modification dates are different");tempItem.second="overwriteIfNotSameModificationDate";list << tempItem;
+ tempItem.first=tr("Rename");tempItem.second="rename";list << tempItem;
+ return list;
+}
+
+QList<QPair<QString,QString> > copyEngine::getErrorAction()
+{
+ QPair<QString,QString> tempItem;
+ QList<QPair<QString,QString> > list;
+ tempItem.first=tr("Ask");tempItem.second="ask";list << tempItem;
+ tempItem.first=tr("Skip");tempItem.second="skip";list << tempItem;
+ tempItem.first=tr("Put to end of the list");tempItem.second="putToEndOfTheList";list << tempItem;
+ return list;
+}
+
+void copyEngine::setDrive(const QStringList &drives)
+{
+ listThread->setDrive(drives);
+}
+
+/** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+void copyEngine::syncTransferList()
+{
+ listThread->syncTransferList();
+}
+
+bool copyEngine::userAddFolder(const CopyMode &mode)
+{
+ QString source = QFileDialog::getExistingDirectory(interface,tr("Select source directory"),"",QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks);
+ if(source.isEmpty() || source.isNull() || source=="")
+ return false;
+ if(mode==Copy)
+ return newCopy(QStringList() << source);
+ else
+ return newMove(QStringList() << source);
+}
+
+bool copyEngine::userAddFile(const CopyMode &mode)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ QStringList sources = QFileDialog::getOpenFileNames(
+ interface,
+ tr("Select one or more files to open"),
+ "",
+ tr("All files")+" (*)");
+ if(sources.isEmpty())
+ return false;
+ if(mode==Copy)
+ return newCopy(sources);
+ else
+ return newMove(sources);
+}
+
+void copyEngine::pause()
+{
+ emit signal_pause();
+}
+
+void copyEngine::resume()
+{
+ emit signal_resume();
+}
+
+void copyEngine::skip(const quint64 &id)
+{
+ emit signal_skip(id);
+}
+
+void copyEngine::cancel()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ stopIt=true;
+ listThread->cancel();
+}
+
+void copyEngine::removeItems(const QList<int> &ids)
+{
+ emit signal_removeItems(ids);
+}
+
+void copyEngine::moveItemsOnTop(const QList<int> &ids)
+{
+ emit signal_moveItemsOnTop(ids);
+}
+
+void copyEngine::moveItemsUp(const QList<int> &ids)
+{
+ emit signal_moveItemsUp(ids);
+}
+
+void copyEngine::moveItemsDown(const QList<int> &ids)
+{
+ emit signal_moveItemsDown(ids);
+}
+
+void copyEngine::moveItemsOnBottom(const QList<int> &ids)
+{
+ emit signal_moveItemsOnBottom(ids);
+}
+
+void copyEngine::exportTransferList()
+{
+ QString fileName = QFileDialog::getSaveFileName(NULL,tr("Save transfer list"),"transfer-list.lst",tr("Transfer list")+" (*.lst)");
+ if(fileName.isEmpty())
+ return;
+ emit signal_exportTransferList(fileName);
+}
+
+void copyEngine::importTransferList()
+{
+ QString fileName = QFileDialog::getOpenFileName(NULL,tr("Open transfer list"),"transfer-list.lst",tr("Transfer list")+" (*.lst)");
+ if(fileName.isEmpty())
+ return;
+ emit signal_importTransferList(fileName);
+}
+
+void copyEngine::warningTransferList(const QString &warning)
+{
+ QMessageBox::warning(interface,tr("Error"),warning);
+}
+
+void copyEngine::errorTransferList(const QString &error)
+{
+ QMessageBox::critical(interface,tr("Error"),error);
+}
+
+bool copyEngine::setSpeedLimitation(const qint64 &speedLimitation)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"maxSpeed: "+QString::number(speedLimitation));
+ maxSpeed=speedLimitation;
+ return listThread->setSpeedLimitation(speedLimitation);
+}
+
+void copyEngine::setCollisionAction(const QString &action)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"action: "+action);
+ if(action=="skip")
+ alwaysDoThisActionForFileExists=FileExists_Skip;
+ else if(action=="overwrite")
+ alwaysDoThisActionForFileExists=FileExists_Overwrite;
+ else if(action=="overwriteIfNewer")
+ alwaysDoThisActionForFileExists=FileExists_OverwriteIfNewer;
+ else if(action=="overwriteIfNotSameModificationDate")
+ alwaysDoThisActionForFileExists=FileExists_OverwriteIfNotSameModificationDate;
+ else if(action=="rename")
+ alwaysDoThisActionForFileExists=FileExists_Rename;
+ else
+ alwaysDoThisActionForFileExists=FileExists_NotSet;
+ emit signal_setCollisionAction(alwaysDoThisActionForFileExists);
+}
+
+void copyEngine::setErrorAction(const QString &action)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"action: "+action);
+ if(action=="skip")
+ alwaysDoThisActionForFileError=FileError_Skip;
+ else if(action=="putToEndOfTheList")
+ alwaysDoThisActionForFileError=FileError_PutToEndOfTheList;
+ else
+ alwaysDoThisActionForFileError=FileError_NotSet;
+}
+
+void copyEngine::setRightTransfer(const bool doRightTransfer)
+{
+ this->doRightTransfer=doRightTransfer;
+ if(uiIsInstalled)
+ ui->doRightTransfer->setChecked(doRightTransfer);
+ listThread->setRightTransfer(doRightTransfer);
+}
+
+//set keep date
+void copyEngine::setKeepDate(const bool keepDate)
+{
+ this->keepDate=keepDate;
+ if(uiIsInstalled)
+ ui->keepDate->setChecked(keepDate);
+ listThread->setKeepDate(keepDate);
+}
+
+//set block size in KB
+void copyEngine::setBlockSize(const int blockSize)
+{
+ this->blockSize=blockSize;
+ if(uiIsInstalled)
+ ui->blockSize->setValue(blockSize);
+ listThread->setBlockSize(blockSize);
+}
+
+//set auto start
+void copyEngine::setAutoStart(const bool autoStart)
+{
+ this->autoStart=autoStart;
+ if(uiIsInstalled)
+ ui->autoStart->setChecked(autoStart);
+ listThread->setAutoStart(autoStart);
+}
+
+//set check destination folder
+void copyEngine::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+{
+ this->checkDestinationFolderExists=checkDestinationFolderExists;
+ if(uiIsInstalled)
+ ui->checkBoxDestinationFolderExists->setChecked(checkDestinationFolderExists);
+ listThread->setCheckDestinationFolderExists(checkDestinationFolderExists);
+}
+
+//reset widget
+void copyEngine::resetTempWidget()
+{
+ tempWidget=NULL;
+}
+
+void copyEngine::on_comboBoxFolderColision_currentIndexChanged(int index)
+{
+ switch(index)
+ {
+ case 0:
+ setComboBoxFolderColision(FolderExists_NotSet,false);
+ break;
+ case 1:
+ setComboBoxFolderColision(FolderExists_Merge,false);
+ break;
+ case 2:
+ setComboBoxFolderColision(FolderExists_Skip,false);
+ break;
+ case 3:
+ setComboBoxFolderColision(FolderExists_Rename,false);
+ break;
+ }
+}
+
+void copyEngine::on_comboBoxFolderError_currentIndexChanged(int index)
+{
+ switch(index)
+ {
+ case 0:
+ setComboBoxFolderError(FileError_NotSet,false);
+ break;
+ case 1:
+ setComboBoxFolderError(FileError_Skip,false);
+ break;
+ }
+}
+
+//set the translate
+void copyEngine::newLanguageLoaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start, retranslate the widget options");
+ if(tempWidget!=NULL)
+ ui->retranslateUi(tempWidget);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"ui not loaded!");
+}
+
+void copyEngine::setComboBoxFolderColision(FolderExistsAction action,bool changeComboBox)
+{
+ alwaysDoThisActionForFolderExists=action;
+ emit signal_setFolderColision(alwaysDoThisActionForFolderExists);
+ if(!changeComboBox || !uiIsInstalled)
+ return;
+ switch(action)
+ {
+ case FolderExists_Merge:
+ ui->comboBoxFolderColision->setCurrentIndex(1);
+ break;
+ case FolderExists_Skip:
+ ui->comboBoxFolderColision->setCurrentIndex(2);
+ break;
+ case FolderExists_Rename:
+ ui->comboBoxFolderColision->setCurrentIndex(3);
+ break;
+ default:
+ ui->comboBoxFolderColision->setCurrentIndex(0);
+ break;
+ }
+}
+
+void copyEngine::setComboBoxFolderError(FileErrorAction action,bool changeComboBox)
+{
+ alwaysDoThisActionForFileError=action;
+ if(!changeComboBox || !uiIsInstalled)
+ return;
+ switch(action)
+ {
+ case FileError_Skip:
+ ui->comboBoxFolderError->setCurrentIndex(1);
+ break;
+ default:
+ ui->comboBoxFolderError->setCurrentIndex(0);
+ break;
+ }
+}
diff --git a/plugins/CopyEngine/Ultracopier-0.3/copyEngine.h b/plugins/CopyEngine/Ultracopier-0.3/copyEngine.h
new file mode 100644
index 0000000..c903b12
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/copyEngine.h
@@ -0,0 +1,293 @@
+/** \file copyEngine.h
+\brief Define the copy engine
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include <QObject>
+#include <QList>
+#include <QStringList>
+#include <QFileInfo>
+#include <QFile>
+#include <QFileDialog>
+#include <QMessageBox>
+
+#include "../../../interface/PluginInterface_CopyEngine.h"
+#include "fileErrorDialog.h"
+#include "fileExistsDialog.h"
+#include "folderExistsDialog.h"
+#include "fileIsSameDialog.h"
+#include "ui_options.h"
+#include "Environment.h"
+#include "ListThread.h"
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+#include "debugDialog.h"
+#include <QTimer>
+#endif
+
+#ifndef COPY_ENGINE_H
+#define COPY_ENGINE_H
+
+namespace Ui {
+ class options;
+}
+
+/// \brief the implementation of copy engine plugin, manage directly few stuff, else pass to ListThread class.
+class copyEngine : public PluginInterface_CopyEngine
+{
+ Q_OBJECT
+public:
+ copyEngine(FacilityInterface * facilityInterface);
+ ~copyEngine();
+private:
+ ListThread *listThread;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ debugDialog debugDialogWindow;
+ #endif
+ QWidget * tempWidget;
+ Ui::options * ui;
+ bool uiIsInstalled;
+ QWidget * interface;
+ int maxSpeed;
+ bool doRightTransfer;
+ bool keepDate;
+ int blockSize;
+ bool autoStart;
+ bool checkDestinationFolderExists;
+ FileExistsAction alwaysDoThisActionForFileExists;
+ FileErrorAction alwaysDoThisActionForFileError;
+ FileErrorAction alwaysDoThisActionForFolderError;
+ FolderExistsAction alwaysDoThisActionForFolderExists;
+ bool dialogIsOpen;
+ volatile bool stopIt;
+ /// \brief error queue
+ struct errorQueueItem
+ {
+ TransferThread * transfer; ///< NULL if send by scan thread
+ scanFileOrFolder * scan; ///< NULL if send by transfer thread
+ bool mkPath;
+ bool rmPath;
+ QFileInfo inode;
+ QString errorString;
+ };
+ QList<errorQueueItem> errorQueue;
+ /// \brief already exists queue
+ struct alreadyExistsQueueItem
+ {
+ TransferThread * transfer; ///< NULL if send by scan thread
+ scanFileOrFolder * scan; ///< NULL if send by transfer thread
+ QFileInfo source;
+ QFileInfo destination;
+ bool isSame;
+ };
+ QList<alreadyExistsQueueItem> alreadyExistsQueue;
+ //temp variable
+ int error_index,loop_size;
+ FileErrorAction tempFileErrorAction;
+ FolderExistsAction tempFolderExistsAction;
+ FileExistsAction tempFileExistsAction;
+ quint64 size_for_speed;
+private slots:
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ void updateTheDebugInfo(QStringList,QStringList,int);
+ #endif
+ //dialog message
+ /// \note Can be call without queue because all call will be serialized
+ void fileAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread,bool isCalledByShowOneNewDialog=false);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFile(QFileInfo fileInfo,QString errorString,TransferThread * thread,bool isCalledByShowOneNewDialog=false);
+ /// \note Can be call without queue because all call will be serialized
+ void folderAlreadyExists(QFileInfo source,QFileInfo destination,bool isSame,scanFileOrFolder * thread,bool isCalledByShowOneNewDialog=false);
+ /// \note Can be call without queue because all call will be serialized
+ void errorOnFolder(QFileInfo fileInfo,QString errorString,scanFileOrFolder * thread,bool isCalledByShowOneNewDialog=false);
+ //mkpath event
+ void mkPathErrorOnFolder(QFileInfo,QString,bool isCalledByShowOneNewDialog=false);
+ //rmpath event
+ void rmPathErrorOnFolder(QFileInfo,QString,bool isCalledByShowOneNewDialog=false);
+ //show one new dialog if needed
+ void showOneNewDialog();
+public:
+ /** \brief to send the options panel
+ * \return return false if have not the options
+ * \param tempWidget the widget to generate on it the options */
+ bool getOptionsEngine(QWidget * tempWidget);
+ /** \brief to have interface widget to do modal dialog
+ * \param interface to have the widget of the interface, useful for modal dialog */
+ void setInterfacePointer(QWidget * interface);
+ //return empty if multiple
+ /** \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(const 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(const QString &destination);
+ //external soft like file browser have send copy/move list to do
+ /** \brief send copy without destination, ask the destination
+ * \param sources the sources list to copy
+ * \return true if the copy have been accepted */
+ bool newCopy(const QStringList &sources);
+ /** \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(const QStringList &sources,const QString &destination);
+ /** \brief send move without destination, ask the destination
+ * \param sources the sources list to move
+ * \return true if the move have been accepted */
+ bool newMove(const QStringList &sources);
+ /** \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(const QStringList &sources,const QString &destination);
+ /** \brief to get byte read, use by Ultracopier for the speed calculation
+ * real size transfered to right speed calculation */
+ quint64 realByteTransfered();
+ //speed limitation
+ /** \brief get the speed limitation
+ * < -1 if not able, 0 if disabled */
+ qint64 getSpeedLimitation();
+ //get collision action
+ /** \brief get the collision action list */
+ QList<QPair<QString,QString> > getCollisionAction();
+ /** \brief get the collision error list */
+ QList<QPair<QString,QString> > getErrorAction();
+
+ /** \brief to set drives detected
+ * specific to this copy engine */
+ void setDrive(const QStringList &drives);
+
+ /** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+ void syncTransferList();
+public slots:
+ //user ask ask to add folder (add it with interface ask source/destination)
+ /** \brief add folder called on the interface
+ * Used by manual adding */
+ bool userAddFolder(const CopyMode &mode);
+ /** \brief add file called on the interface
+ * Used by manual adding */
+ bool userAddFile(const CopyMode &mode);
+ //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 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(const QList<int> &ids);
+ /** \brief move up the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsUp(const QList<int> &ids);
+ /** \brief move down the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsDown(const 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(const QList<int> &ids);
+ /// \brief export the transfer list into a file
+ void exportTransferList();
+ /// \brief import the transfer list into a file
+ void importTransferList();
+ /** \brief to set the speed limitation
+ * -1 if not able, 0 if disabled */
+ bool setSpeedLimitation(const qint64 &speedLimitation);
+ //action
+ /// \brief to set the collision action
+ void setCollisionAction(const QString &action);
+ /// \brief to set the error action
+ void setErrorAction(const QString &action);
+
+ // specific to this copy engine
+
+ /// \brief set if the rights shoul be keep
+ 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 if need check if the destination folder exists
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ /// \brief reset widget
+ void resetTempWidget();
+ //autoconnect
+ void on_comboBoxFolderColision_currentIndexChanged(int index);
+ void on_comboBoxFolderError_currentIndexChanged(int index);
+ /// \brief need retranslate the insterface
+ void newLanguageLoaded();
+private slots:
+ void setComboBoxFolderColision(FolderExistsAction action,bool changeComboBox=true);
+ void setComboBoxFolderError(FileErrorAction action,bool changeComboBox=true);
+ void warningTransferList(const QString &warning);
+ void errorTransferList(const QString &error);
+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(QString path);
+ void newCollisionAction(QString action);
+ void newErrorAction(QString action);
+ void isInPause(bool);
+
+ //action on the copy
+ void signal_pause();
+ void signal_resume();
+ void signal_skip(quint64 id);
+
+ //edit the transfer list
+ void signal_removeItems(QList<int> ids);
+ void signal_moveItemsOnTop(QList<int> ids);
+ void signal_moveItemsUp(QList<int> ids);
+ void signal_moveItemsDown(QList<int> ids);
+ void signal_moveItemsOnBottom(QList<int> ids);
+ void signal_exportTransferList(QString fileName);
+ void signal_importTransferList(QString fileName);
+
+ //action
+ void signal_setCollisionAction(FileExistsAction alwaysDoThisActionForFileExists);
+ void signal_setComboBoxFolderColision(FolderExistsAction action);
+ void signal_setFolderColision(FolderExistsAction action);
+
+ 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);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief To debug source
+ void debugInformation(DebugLevel level,QString fonction,QString text,QString file,int ligne);
+ #endif
+
+ //other signals
+ void queryOneNewDialog();
+};
+
+#endif // COPY_ENGINE_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/copyEngine.pro b/plugins/CopyEngine/Ultracopier-0.3/copyEngine.pro
new file mode 100644
index 0000000..0f1cb68
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/copyEngine.pro
@@ -0,0 +1,68 @@
+TEMPLATE = lib
+CONFIG += plugin
+HEADERS = copyEngine.h \
+ StructEnumDefinition.h \
+ scanFileOrFolder.h \
+ fileErrorDialog.h \
+ fileExistsDialog.h \
+ fileIsSameDialog.h \
+ factory.h \
+ StructEnumDefinition_CopyEngine.h \
+ DebugEngineMacro.h \
+ Variable.h \
+ debugDialog.h \
+ TransferThread.h \
+ ReadThread.h \
+ WriteThread.h \
+ RmPath.h \
+ MkPath.h \
+ folderExistsDialog.h \
+ AvancedQFile.h \
+ ListThread.h \
+ ../../../interface/PluginInterface_CopyEngine.h \
+ ../../../interface/OptionInterface.h \
+ ../../../interface/FacilityInterface.h
+SOURCES = copyEngine.cpp \
+ scanFileOrFolder.cpp \
+ fileErrorDialog.cpp \
+ fileExistsDialog.cpp \
+ fileIsSameDialog.cpp \
+ factory.cpp \
+ debugDialog.cpp \
+ TransferThread.cpp \
+ ReadThread.cpp \
+ WriteThread.cpp \
+ RmPath.cpp \
+ MkPath.cpp \
+ folderExistsDialog.cpp \
+ AvancedQFile.cpp \
+ copyEngine-collision-and-error.cpp \
+ ListThread.cpp
+TARGET = $$qtLibraryTarget(copyEngine)
+TRANSLATIONS += Languages/fr/translation.ts \
+ Languages/ar/translation.ts \
+ Languages/ch/translation.ts \
+ Languages/es/translation.ts \
+ Languages/de/translation.ts \
+ Languages/el/translation.ts \
+ Languages/it/translation.ts \
+ Languages/jp/translation.ts \
+ Languages/id/translation.ts \
+ Languages/pl/translation.ts \
+ Languages/ru/translation.ts \
+ Languages/tr/translation.ts \
+ Languages/th/translation.ts \
+ Languages/hi/translation.ts \
+ Languages/nl/translation.ts \
+ Languages/no/translation.ts \
+ Languages/pt/translation.ts
+
+FORMS += \
+ options.ui \
+ fileErrorDialog.ui \
+ fileExistsDialog.ui \
+ fileIsSameDialog.ui \
+ debugDialog.ui \
+ folderExistsDialog.ui
+
+OTHER_FILES += informations.xml
diff --git a/plugins/CopyEngine/Ultracopier-0.3/debugDialog.cpp b/plugins/CopyEngine/Ultracopier-0.3/debugDialog.cpp
new file mode 100644
index 0000000..a03aec0
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/debugDialog.cpp
@@ -0,0 +1,70 @@
+/** \file debugDialog.cpp
+\brief Define the dialog to have debug information
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include "debugDialog.h"
+#include "ui_debugDialog.h"
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+
+debugDialog::debugDialog(QWidget *parent) :
+ QWidget(parent),
+ ui(new Ui::debugDialog)
+{
+ ui->setupUi(this);
+}
+
+debugDialog::~debugDialog()
+{
+ delete ui;
+}
+
+void debugDialog::setTransferList(const QStringList &list)
+{
+ if(list.size()==ui->tranferList->count())
+ {
+ int index=0;
+ while(index<list.size())
+ {
+ ui->tranferList->item(index)->setText(list.at(index));
+ index++;
+ }
+ }
+ else
+ {
+ ui->tranferList->clear();
+ ui->tranferList->addItems(list);
+ }
+}
+
+void debugDialog::setActiveTransfer(int activeTransfer)
+{
+ ui->spinBoxActiveTransfer->setValue(activeTransfer);
+}
+
+void debugDialog::setInodeUsage(int inodeUsage)
+{
+ ui->spinBoxNumberOfInode->setValue(inodeUsage);
+}
+
+void debugDialog::setTransferThreadList(const QStringList &list)
+{
+ if(list.size()==ui->transferThreadList->count())
+ {
+ int index=0;
+ while(index<list.size())
+ {
+ ui->transferThreadList->item(index)->setText(list.at(index));
+ index++;
+ }
+ }
+ else
+ {
+ ui->transferThreadList->clear();
+ ui->transferThreadList->addItems(list);
+ }
+}
+
+#endif
diff --git a/plugins/CopyEngine/Ultracopier-0.3/debugDialog.h b/plugins/CopyEngine/Ultracopier-0.3/debugDialog.h
new file mode 100644
index 0000000..3d48857
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/debugDialog.h
@@ -0,0 +1,40 @@
+/** \file debugDialog.h
+\brief Define the dialog to have debug information
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#ifndef DEBUGDAILOG_H
+#define DEBUGDAILOG_H
+
+#include "Environment.h"
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+#include <QWidget>
+
+namespace Ui {
+ class debugDialog;
+}
+
+/// \brief class to the dialog to have debug information
+class debugDialog : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit debugDialog(QWidget *parent = 0);
+ ~debugDialog();
+ /// \brief to set the transfer list, limited in result to not slow down the application
+ void setTransferList(const QStringList &list);
+ /// \brief show the transfer thread, it show be a thread pool in normal time
+ void setTransferThreadList(const QStringList &list);
+ /// \brief show how many transfer is active
+ void setActiveTransfer(int activeTransfer);
+ /// \brief show many many inode is manipulated
+ void setInodeUsage(int inodeUsage);
+private:
+ Ui::debugDialog *ui;
+};
+
+#endif // ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+
+#endif // DEBUGDAILOG_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/debugDialog.ui b/plugins/CopyEngine/Ultracopier-0.3/debugDialog.ui
new file mode 100644
index 0000000..0df03be
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/debugDialog.ui
@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>debugDialog</class>
+ <widget class="QWidget" name="debugDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>665</width>
+ <height>392</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Monitor</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string notr="true">Transfer thread</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QListWidget" name="transferThreadList">
+ <property name="uniformItemSizes">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string notr="true">Transfer list</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QListWidget" name="tranferList">
+ <property name="uniformItemSizes">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_3">
+ <property name="title">
+ <string notr="true">Variables</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string notr="true">Active transfer:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="spinBoxActiveTransfer">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="maximum">
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string notr="true">Number of inode manipuled:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="spinBoxNumberOfInode">
+ <property name="readOnly">
+ <bool>true</bool>
+ </property>
+ <property name="maximum">
+ <number>9999</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/documentation.dox b/plugins/CopyEngine/Ultracopier-0.3/documentation.dox
new file mode 100755
index 0000000..c91674b
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/documentation.dox
@@ -0,0 +1,41 @@
+/* -*- mode: C++ ; c-file-style: "stroustrup" -*- **/
+
+/*
+ This file contains NO source code, just some documentation for doxygen to
+ parse.
+*/
+
+/*!
+ \mainpage Copy engine 0.3
+
+ \section mainpage_overview Overview
+
+ The default copy engine for Ultracopier 0.3. Support file/folder, copy/move, ...\n
+ More informations on <a href="http://ultracopier-wiki.first-world.info/">the wiki of ultracopier</a>. Is part of Ultracopier 0.3 project.
+
+ \section mainpage_platforms Platforms
+
+ This plugin might be usable in all environments where you find Qt 4, but Gcc is requiered for some part.\n
+ This plugin requires Qt 4.5.x or newer. Tested on Qt 4.7. Due to optimization Qt 4.8 usage will be better.\n
+ To be compatible with the official Ultracopier plugins, you need compil it with Gcc, Qt4.8, and same env as Ultracopier have been compiled, see the documentation.
+
+ \section mainpage_downloads Downloads
+
+ You can found link on <a href="http://ultracopier.first-world.info/">Ultracopier (Supercopier/Teracopy)</a> project page, via git, snapshot sources, ...
+
+ \section mainpage_algorithm Algorithm
+
+ Like say previously you will have more informations on the wiki.\n
+ Then file transfer is done via pipe mecamism system:\n
+ <ul>
+ <li>push at no blocking into table up to the table is full, after is blocked up to one entry is free</li>
+ <li>Other thread read the table up to have no more data, then is blocked</li>
+ </ul>
+ The transfer thread do listing of the folder, removing folder, make folder is one thread for each.\n
+ The transfer list, have thread pool to do the inode operation (open, close, set date, ...). Do all inode operation in parallele, but transfer the data as sequential.
+
+ \section license GPL Version 3
+ The code source is under GPL3. The image is extacted from Oxygen icon pack of KDE4.
+
+*/
+
diff --git a/plugins/CopyEngine/Ultracopier-0.3/factory.cpp b/plugins/CopyEngine/Ultracopier-0.3/factory.cpp
new file mode 100644
index 0000000..be53272
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/factory.cpp
@@ -0,0 +1,239 @@
+/** \file factory.cpp
+\brief Define the factory to create new instance
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include <QtCore>
+#include <QFileDialog>
+
+#include "factory.h"
+
+/// \todo connect in global options the change
+
+Factory::Factory() :
+ ui(new Ui::options())
+{
+ tempWidget=new QWidget();
+ ui->setupUi(tempWidget);
+ errorFound=false;
+ optionsEngine=NULL;
+ #if defined (Q_OS_WIN32)
+ QFileInfoList temp=QDir::drives();
+ for (int i = 0; i < temp.size(); ++i) {
+ mountSysPoint<<temp.at(i).filePath();
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"mountSysPoint: "+mountSysPoint.join(";"));
+ #elif defined (Q_OS_LINUX)
+ connect(&mount,SIGNAL(error(QProcess::ProcessError)), this,SLOT(error(QProcess::ProcessError)));
+ connect(&mount,SIGNAL(finished(int,QProcess::ExitStatus)), this,SLOT(finished(int,QProcess::ExitStatus)));
+ connect(&mount,SIGNAL(readyReadStandardOutput()), this,SLOT(readyReadStandardOutput()));
+ connect(&mount,SIGNAL(readyReadStandardError()), this,SLOT(readyReadStandardError()));
+ mount.start("mount");
+ #endif
+ connect(ui->doRightTransfer, SIGNAL(toggled(bool)), this,SLOT(setDoRightTransfer(bool)));
+ connect(ui->keepDate, SIGNAL(toggled(bool)), this,SLOT(setKeepDate(bool)));
+ connect(ui->blockSize, SIGNAL(valueChanged(int)), this,SLOT(setBlockSize(int)));
+ connect(ui->autoStart, SIGNAL(toggled(bool)), this,SLOT(setAutoStart(bool)));
+}
+
+Factory::~Factory()
+{
+ delete ui;
+}
+
+PluginInterface_CopyEngine * Factory::getInstance()
+{
+ copyEngine *realObject=new copyEngine(facilityEngine);
+ realObject->setDrive(mountSysPoint);
+ PluginInterface_CopyEngine * newTransferEngine=realObject;
+ connect(newTransferEngine,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)),this,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)));
+ connect(this,SIGNAL(reloadLanguage()),newTransferEngine,SLOT(newLanguageLoaded()));
+ realObject->setRightTransfer( optionsEngine->getOptionValue("doRightTransfer").toBool());
+ realObject->setKeepDate( optionsEngine->getOptionValue("keepDate").toBool());
+ realObject->setBlockSize( optionsEngine->getOptionValue("blockSize").toInt());
+ realObject->setAutoStart( optionsEngine->getOptionValue("autoStart").toBool());
+ realObject->on_comboBoxFolderColision_currentIndexChanged(ui->comboBoxFolderColision->currentIndex());
+ realObject->on_comboBoxFolderError_currentIndexChanged(ui->comboBoxFolderError->currentIndex());
+ realObject->setCheckDestinationFolderExists( optionsEngine->getOptionValue("checkDestinationFolder").toBool());
+ return newTransferEngine;
+}
+
+void Factory::setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,FacilityInterface * facilityInterface,const bool &portableVersion)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start, writePath: "+writePath+", pluginPath:"+pluginPath);
+ this->facilityEngine=facilityInterface;
+ Q_UNUSED(portableVersion);
+ #ifndef ULTRACOPIER_PLUGIN_DEBUG
+ Q_UNUSED(writePath);
+ Q_UNUSED(pluginPath);
+ #endif
+ #if ! defined (Q_CC_GNU)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"Unable to change date time of files, only gcc is supported");
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,COMPILERINFO);
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"MAX BUFFER BLOCK: "+QString::number(ULTRACOPIER_PLUGIN_MAXBUFFERBLOCK));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"MIN TIMER INTERVAL: "+QString::number(ULTRACOPIER_PLUGIN_MINTIMERINTERVAL));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"MAX TIMER INTERVAL: "+QString::number(ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"NUM SEM SPEED MANAGEMENT: "+QString::number(ULTRACOPIER_PLUGIN_NUMSEMSPEEDMANAGEMENT));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"MAX PARALLEL INODE OPT: "+QString::number(ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"MAX PARALLEL TRANFER: "+QString::number(ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER));
+ #if defined (ULTRACOPIER_PLUGIN_CHECKLISTTYPE)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"CHECK LIST TYPE set");
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"CHECK LIST TYPE not set");
+ #endif
+ if(options!=NULL)
+ {
+ optionsEngine=options;
+ //load the options
+ QList<QPair<QString, QVariant> > KeysList;
+ KeysList.append(qMakePair(QString("doRightTransfer"),QVariant(true)));
+ KeysList.append(qMakePair(QString("keepDate"),QVariant(true)));
+ KeysList.append(qMakePair(QString("blockSize"),QVariant(1024)));//1024KB as default
+ KeysList.append(qMakePair(QString("autoStart"),QVariant(true)));
+ KeysList.append(qMakePair(QString("folderError"),QVariant(0)));
+ KeysList.append(qMakePair(QString("folderColision"),QVariant(0)));
+ KeysList.append(qMakePair(QString("checkDestinationFolder"),QVariant(true)));
+ optionsEngine->addOptionGroup(KeysList);
+ #if ! defined (Q_CC_GNU)
+ ui->keepDate->setEnabled(false);
+ ui->keepDate->setToolTip("Not supported with this compiler");
+ #endif
+ ui->doRightTransfer->setChecked(optionsEngine->getOptionValue("doRightTransfer").toBool());
+ ui->keepDate->setChecked(optionsEngine->getOptionValue("keepDate").toBool());
+ ui->blockSize->setValue(optionsEngine->getOptionValue("blockSize").toInt());
+ ui->autoStart->setChecked(optionsEngine->getOptionValue("autoStart").toBool());
+ ui->comboBoxFolderError->setCurrentIndex(optionsEngine->getOptionValue("folderError").toInt());
+ ui->comboBoxFolderColision->setCurrentIndex(optionsEngine->getOptionValue("folderColision").toInt());
+ ui->checkBoxDestinationFolderExists->setChecked(optionsEngine->getOptionValue("checkDestinationFolder").toBool());
+ }
+}
+
+QStringList Factory::supportedProtocolsForTheSource()
+{
+ return QStringList() << "file";
+}
+
+QStringList Factory::supportedProtocolsForTheDestination()
+{
+ return QStringList() << "file";
+}
+
+CopyType Factory::getCopyType()
+{
+ return FileAndFolder;
+}
+
+TransferListOperation Factory::getTransferListOperation()
+{
+ return TransferListOperation_ImportExport;
+}
+
+bool Factory::canDoOnlyCopy()
+{
+ return false;
+}
+
+void Factory::error(QProcess::ProcessError error)
+{
+ #ifndef ULTRACOPIER_PLUGIN_DEBUG
+ Q_UNUSED(error)
+ #endif
+ errorFound=true;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"have detected error: "+QString::number(error));
+}
+
+void Factory::finished(int exitCode, QProcess::ExitStatus exitStatus)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"exitCode: "+QString::number(exitCode)+", exitStatus: "+QString::number(exitStatus));
+ #ifndef ULTRACOPIER_PLUGIN_DEBUG
+ Q_UNUSED(exitCode)
+ Q_UNUSED(exitStatus)
+ #endif
+ if(!StandardError.isEmpty())
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"have finished with text on error output: "+StandardError);
+ else if(errorFound)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"have finished with error and no text");
+ {
+ QStringList tempList=StandardOutput.split(QRegExp("[\n\r]+"));
+ int index=0;
+ while(index<tempList.size())
+ {
+ QString newString=tempList.at(index);
+ newString=newString.remove(QRegExp("^.* on "));
+ newString=newString.remove(QRegExp(" type .*$"));
+ if(!newString.endsWith(QDir::separator()))
+ newString+=QDir::separator();
+ mountSysPoint<<newString;
+ index++;
+ }
+ mountSysPoint.removeDuplicates();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"mountSysPoint: "+mountSysPoint.join(";"));
+ }
+}
+
+void Factory::readyReadStandardError()
+{
+ StandardError+=mount.readAllStandardError();
+}
+
+void Factory::readyReadStandardOutput()
+{
+ StandardOutput+=mount.readAllStandardOutput();
+}
+
+void Factory::resetOptions()
+{
+}
+
+QWidget * Factory::options()
+{
+ ui->autoStart->setChecked(optionsEngine->getOptionValue("autoStart").toBool());
+ return tempWidget;
+}
+
+void Factory::setDoRightTransfer(bool doRightTransfer)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("doRightTransfer",doRightTransfer);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void Factory::setKeepDate(bool keepDate)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("keepDate",keepDate);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void Factory::setBlockSize(int blockSize)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("blockSize",blockSize);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void Factory::setAutoStart(bool autoStart)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"the checkbox have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("autoStart",autoStart);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"internal error, crash prevented");
+}
+
+void Factory::newLanguageLoaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start, retranslate the widget options");
+ ui->retranslateUi(tempWidget);
+ emit reloadLanguage();
+}
+
+Q_EXPORT_PLUGIN2(copyEngine, Factory);
diff --git a/plugins/CopyEngine/Ultracopier-0.3/factory.h b/plugins/CopyEngine/Ultracopier-0.3/factory.h
new file mode 100644
index 0000000..bf41a27
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/factory.h
@@ -0,0 +1,81 @@
+/** \file factory.h
+\brief Define the factory to create new instance
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include <QObject>
+#include <QList>
+#include <QStringList>
+#include <QFileInfo>
+#include <QProcess>
+
+#include "../../../interface/PluginInterface_CopyEngine.h"
+#include "StructEnumDefinition.h"
+#include "ui_options.h"
+#include "copyEngine.h"
+#include "Environment.h"
+
+#ifndef FACTORY_H
+#define FACTORY_H
+
+namespace Ui {
+ class options;
+}
+
+/** \brief to generate copy engine instance */
+class Factory : public PluginInterface_CopyEngineFactory
+{
+ Q_OBJECT
+ Q_INTERFACES(PluginInterface_CopyEngineFactory)
+public:
+ Factory();
+ ~Factory();
+ /// \brief to return the instance of the copy engine
+ PluginInterface_CopyEngine * getInstance();
+ /// \brief set the resources, to store options, to have facilityInterface
+ void setResources(OptionInterface * options,const QString &writePath,const QString &pluginPath,FacilityInterface * facilityInterface,const bool &portableVersion);
+ //get mode allowed
+ /// \brief define if can copy file, folder or both
+ CopyType getCopyType();
+ /// \brief to return which kind of transfer list operation is supported
+ TransferListOperation getTransferListOperation();
+ /// \brief define if can only copy, or copy and move
+ bool canDoOnlyCopy();
+ /// \brief to get the supported protocols for the source
+ QStringList supportedProtocolsForTheSource();
+ /// \brief to get the supported protocols for the destination
+ QStringList supportedProtocolsForTheDestination();
+ /// \brief to get the options of the copy engine
+ QWidget * options();
+private:
+ Ui::options *ui;
+ QWidget* tempWidget;
+ OptionInterface * optionsEngine;
+ QStringList mountSysPoint;
+ QProcess mount;
+ QString StandardError;
+ QString StandardOutput;
+ bool errorFound;
+ FacilityInterface * facilityEngine;
+private slots:
+ void error(QProcess::ProcessError error);
+ void finished(int exitCode, QProcess::ExitStatus exitStatus);
+ void readyReadStandardError();
+ void readyReadStandardOutput();
+ void setDoRightTransfer(bool doRightTransfer);
+ void setKeepDate(bool keepDate);
+ void setBlockSize(int blockSize);
+ void setAutoStart(bool autoStart);
+public slots:
+ void resetOptions();
+ void newLanguageLoaded();
+signals:
+ void reloadLanguage();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief To debug source
+ void debugInformation(DebugLevel level,QString fonction,QString text,QString file,int ligne);
+ #endif
+};
+
+#endif // FACTORY_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.cpp b/plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.cpp
new file mode 100644
index 0000000..8f8b9a5
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.cpp
@@ -0,0 +1,78 @@
+#include "fileErrorDialog.h"
+#include "ui_fileErrorDialog.h"
+
+fileErrorDialog::fileErrorDialog(QWidget *parent,QFileInfo fileInfo,QString errorString,bool havePutAtTheEndButton) :
+ QDialog(parent),
+ ui(new Ui::fileErrorDialog)
+{
+ ui->setupUi(this);
+ action=FileError_Cancel;
+ ui->label_error->setText(errorString);
+ ui->label_content_file_name->setText(fileInfo.fileName());
+ ui->label_content_size->setText(QString::number(fileInfo.size()));
+ QDateTime maxTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
+ if(maxTime<fileInfo.lastModified())
+ {
+ ui->label_modified->setVisible(true);
+ ui->label_content_modified->setVisible(true);
+ ui->label_content_modified->setText(fileInfo.lastModified().toString());
+ }
+ else
+ {
+ ui->label_modified->setVisible(false);
+ ui->label_content_modified->setVisible(false);
+ }
+ if(!havePutAtTheEndButton)
+ ui->PutToBottom->hide();
+}
+
+fileErrorDialog::~fileErrorDialog()
+{
+ delete ui;
+}
+
+void fileErrorDialog::changeEvent(QEvent *e)
+{
+ QWidget::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+void fileErrorDialog::on_PutToBottom_clicked()
+{
+ action=FileError_PutToEndOfTheList;
+ this->close();
+}
+
+void fileErrorDialog::on_Retry_clicked()
+{
+ action=FileError_Retry;
+ this->close();
+}
+
+void fileErrorDialog::on_Skip_clicked()
+{
+ action=FileError_Skip;
+ this->close();
+}
+
+void fileErrorDialog::on_Cancel_clicked()
+{
+ action=FileError_Cancel;
+ this->close();
+}
+
+bool fileErrorDialog::getAlways()
+{
+ return ui->checkBoxAlways->isChecked();
+}
+
+FileErrorAction fileErrorDialog::getAction()
+{
+ return action;
+}
diff --git a/plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.h b/plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.h
new file mode 100644
index 0000000..b14fe87
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.h
@@ -0,0 +1,45 @@
+/** \file fileErrorDialog.h
+\brief Define the dialog error on the file
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include <QDialog>
+#include <QWidget>
+#include <QString>
+#include <QDateTime>
+#include <QFileInfo>
+#include "Environment.h"
+
+#ifndef FILEERRORDIALOG_H
+#define FILEERRORDIALOG_H
+
+namespace Ui {
+ class fileErrorDialog;
+}
+
+/// \brief to show error dialog, and ask what do
+class fileErrorDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ /// \brief create the object and pass all the informations to it
+ explicit fileErrorDialog(QWidget *parent,QFileInfo fileInfo,QString errorString,bool havePutAtTheEndButton=true);
+ ~fileErrorDialog();
+ /// \brief return the the always checkbox is checked
+ bool getAlways();
+ /// \brief return the action clicked
+ FileErrorAction getAction();
+protected:
+ void changeEvent(QEvent *e);
+private slots:
+ void on_PutToBottom_clicked();
+ void on_Retry_clicked();
+ void on_Skip_clicked();
+ void on_Cancel_clicked();
+private:
+ Ui::fileErrorDialog *ui;
+ FileErrorAction action;
+};
+
+#endif // FILEERRORDIALOG_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.ui b/plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.ui
new file mode 100644
index 0000000..c5027e7
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.ui
@@ -0,0 +1,220 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>fileErrorDialog</class>
+ <widget class="QWidget" name="fileErrorDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>478</width>
+ <height>154</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Error on file</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Error</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label_error">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_size">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_size">
+ <property name="text">
+ <string notr="true">0 KiB</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_file_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>File name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_content_file_name">
+ <property name="text">
+ <string notr="true">source.txt</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QCheckBox" name="checkBoxAlways">
+ <property name="text">
+ <string>&amp;Always do this action</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="PutToBottom">
+ <property name="text">
+ <string>Put to bottom</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Retry">
+ <property name="text">
+ <string>Retry</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Skip">
+ <property name="text">
+ <string>&amp;Skip</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Cancel">
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Cancel</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>112</x>
+ <y>131</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>438</x>
+ <y>142</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Retry</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>155</x>
+ <y>131</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>309</x>
+ <y>134</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.cpp b/plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.cpp
new file mode 100644
index 0000000..78c3bd0
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.cpp
@@ -0,0 +1,176 @@
+#include "fileExistsDialog.h"
+#include "ui_fileExistsDialog.h"
+
+#include <QDebug>
+
+fileExistsDialog::fileExistsDialog(QWidget *parent,QFileInfo source,QFileInfo destination) :
+ QDialog(parent),
+ ui(new Ui::fileExistsDialog)
+{
+ ui->setupUi(this);
+ action=FileExists_Cancel;
+ destinationInfo=destination;
+ oldName=destination.fileName();
+ ui->lineEditNewName->setText(oldName);
+ ui->lineEditNewName->setPlaceholderText(oldName);
+ ui->Overwrite->addAction(ui->actionOverwrite_if_newer);
+ ui->Overwrite->addAction(ui->actionOverwrite_if_not_same_modification_date);
+ ui->label_content_source_size->setText(QString::number(source.size()));
+ ui->label_content_source_modified->setText(source.lastModified().toString());
+ ui->label_content_source_file_name->setText(source.fileName());
+ ui->label_content_destination_size->setText(QString::number(destination.size()));
+ ui->label_content_destination_modified->setText(destination.lastModified().toString());
+ ui->label_content_destination_file_name->setText(destination.fileName());
+ QDateTime maxTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
+ if(maxTime<source.lastModified())
+ {
+ ui->label_source_modified->setVisible(true);
+ ui->label_content_source_modified->setVisible(true);
+ ui->label_content_source_modified->setText(source.lastModified().toString());
+ }
+ else
+ {
+ ui->label_source_modified->setVisible(false);
+ ui->label_content_source_modified->setVisible(false);
+ }
+ if(maxTime<destination.lastModified())
+ {
+ ui->label_destination_modified->setVisible(true);
+ ui->label_content_destination_modified->setVisible(true);
+ ui->label_content_destination_modified->setText(destination.lastModified().toString());
+ }
+ else
+ {
+ ui->label_destination_modified->setVisible(false);
+ ui->label_content_destination_modified->setVisible(false);
+ }
+}
+
+fileExistsDialog::~fileExistsDialog()
+{
+ delete ui;
+}
+
+void fileExistsDialog::changeEvent(QEvent *e)
+{
+ QWidget::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+QString fileExistsDialog::getNewName()
+{
+ if(oldName==ui->lineEditNewName->text() || ui->checkBoxAlways->isChecked())
+ qDebug() << "return the old name: "+oldName;
+ else
+ qDebug() << "return the new name: "+ui->lineEditNewName->text();
+ if(oldName==ui->lineEditNewName->text() || ui->checkBoxAlways->isChecked())
+ return oldName;
+ else
+ return ui->lineEditNewName->text();
+}
+
+void fileExistsDialog::on_SuggestNewName_clicked()
+{
+ QFileInfo destinationInfo=this->destinationInfo;
+ QString absolutePath=destinationInfo.absolutePath();
+ QString fileName=destinationInfo.fileName();
+ QString suffix="";
+ QString destination;
+ if(fileName.contains(QRegExp("^(.*)(\\.[a-z0-9]+)$")))
+ {
+ suffix=fileName;
+ suffix.replace(QRegExp("^(.*)(\\.[a-z0-9]+)$"),"\\2");
+ fileName.replace(QRegExp("^(.*)(\\.[a-z0-9]+)$"),"\\1");
+ }
+ do
+ {
+ if(!fileName.startsWith(tr("Copy of ")))
+ fileName=tr("Copy of ")+fileName;
+ else
+ {
+ if(fileName.contains(QRegExp("_[0-9]+$")))
+ {
+ QString number=fileName;
+ number.replace(QRegExp("^.*_([0-9]+)$"),"\\1");
+ int num=number.toInt()+1;
+ fileName.remove(QRegExp("[0-9]+$"));
+ fileName+=QString::number(num);
+ }
+ else
+ fileName+="_2";
+ }
+ destination=absolutePath+QDir::separator()+fileName+suffix;
+ destinationInfo.setFile(destination);
+ }
+ while(destinationInfo.exists());
+ ui->lineEditNewName->setText(fileName+suffix);
+}
+
+void fileExistsDialog::on_Rename_clicked()
+{
+ action=FileExists_Rename;
+ this->close();
+}
+
+void fileExistsDialog::on_Overwrite_clicked()
+{
+ action=FileExists_Overwrite;
+ this->close();
+}
+
+void fileExistsDialog::on_Skip_clicked()
+{
+ action=FileExists_Skip;
+ this->close();
+}
+
+void fileExistsDialog::on_Cancel_clicked()
+{
+ action=FileExists_Cancel;
+ this->close();
+}
+
+void fileExistsDialog::on_actionOverwrite_if_newer_triggered()
+{
+ action=FileExists_OverwriteIfNewer;
+ this->close();
+}
+
+void fileExistsDialog::on_actionOverwrite_if_not_same_modification_date_triggered()
+{
+ action=FileExists_OverwriteIfNotSameModificationDate;
+ this->close();
+}
+
+FileExistsAction fileExistsDialog::getAction()
+{
+ return action;
+}
+
+bool fileExistsDialog::getAlways()
+{
+ return ui->checkBoxAlways->isChecked();
+}
+
+void fileExistsDialog::updateRenameButton()
+{
+ ui->Rename->setEnabled(ui->checkBoxAlways->isChecked() || (oldName!=ui->lineEditNewName->text() && !ui->lineEditNewName->text().isEmpty()));
+}
+
+void fileExistsDialog::on_checkBoxAlways_toggled(bool checked)
+{
+ Q_UNUSED(checked);
+ updateRenameButton();
+}
+
+void fileExistsDialog::on_lineEditNewName_textChanged(const QString &arg1)
+{
+ Q_UNUSED(arg1);
+ updateRenameButton();
+}
diff --git a/plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.h b/plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.h
new file mode 100644
index 0000000..1a5817d
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.h
@@ -0,0 +1,56 @@
+/** \file fileExistsDialog.h
+\brief Define the dialog when file already exists
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include <QDialog>
+#include <QWidget>
+#include <QString>
+#include <QDateTime>
+#include <QFileInfo>
+#include <QDir>
+#include "Environment.h"
+
+#ifndef FILEEXISTSDIALOG_H
+#define FILEEXISTSDIALOG_H
+
+namespace Ui {
+ class fileExistsDialog;
+}
+
+/// \brief to show file exists dialog, and ask what do
+class fileExistsDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ /// \brief create the object and pass all the informations to it
+ explicit fileExistsDialog(QWidget *parent,QFileInfo source,QFileInfo destination);
+ ~fileExistsDialog();
+ /// \brief return the the always checkbox is checked
+ bool getAlways();
+ /// \brief return the action clicked
+ FileExistsAction getAction();
+ /// \brief return the new rename is case in manual renaming
+ QString getNewName();
+protected:
+ void changeEvent(QEvent *e);
+private slots:
+ void on_SuggestNewName_clicked();
+ void on_Rename_clicked();
+ void on_Overwrite_clicked();
+ void on_Skip_clicked();
+ void on_Cancel_clicked();
+ void on_actionOverwrite_if_newer_triggered();
+ void on_actionOverwrite_if_not_same_modification_date_triggered();
+ void updateRenameButton();
+ void on_checkBoxAlways_toggled(bool checked);
+ void on_lineEditNewName_textChanged(const QString &arg1);
+private:
+ Ui::fileExistsDialog *ui;
+ FileExistsAction action;
+ QString oldName;
+ QFileInfo destinationInfo;
+};
+
+#endif // FILEEXISTSDIALOG_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.ui b/plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.ui
new file mode 100644
index 0000000..a37945a
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.ui
@@ -0,0 +1,367 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>fileExistsDialog</class>
+ <widget class="QWidget" name="fileExistsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>469</width>
+ <height>150</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>The file exists</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Source</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_2">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Destination</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_source_size">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_source_size">
+ <property name="text">
+ <string notr="true">0 KiB</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_source_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_source_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_source_file_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>File name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_content_source_file_name">
+ <property name="text">
+ <string notr="true">source.txt</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <property name="fieldGrowthPolicy">
+ <enum>QFormLayout::ExpandingFieldsGrow</enum>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_destination_size">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_destination_size">
+ <property name="text">
+ <string notr="true">0 KiB</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_destination_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_destination_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_destination_file_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>File name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_content_destination_file_name">
+ <property name="text">
+ <string notr="true">destination.txt</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLineEdit" name="lineEditNewName">
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="placeholderText">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="SuggestNewName">
+ <property name="text">
+ <string>Suggest new &amp;name</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QCheckBox" name="checkBoxAlways">
+ <property name="text">
+ <string>&amp;Always do this action</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Rename">
+ <property name="text">
+ <string>&amp;Rename</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="Overwrite">
+ <property name="text">
+ <string>&amp;Overwrite</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::MenuButtonPopup</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Skip">
+ <property name="text">
+ <string>&amp;Skip</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Cancel">
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ <action name="actionOverwrite_if_newer">
+ <property name="text">
+ <string>Overwrite if newer</string>
+ </property>
+ </action>
+ <action name="actionOverwrite_if_not_same_modification_date">
+ <property name="text">
+ <string>Overwrite if not same modification date</string>
+ </property>
+ </action>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>Cancel</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>115</x>
+ <y>130</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>440</x>
+ <y>129</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>lineEditNewName</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>62</x>
+ <y>129</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>108</x>
+ <y>93</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>SuggestNewName</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>144</x>
+ <y>138</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>326</x>
+ <y>98</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.cpp b/plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.cpp
new file mode 100644
index 0000000..a618f4c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.cpp
@@ -0,0 +1,143 @@
+#include "fileIsSameDialog.h"
+#include "ui_fileIsSameDialog.h"
+
+#include <QDebug>
+
+fileIsSameDialog::fileIsSameDialog(QWidget *parent,QFileInfo fileInfo) :
+ QDialog(parent),
+ ui(new Ui::fileIsSameDialog)
+{
+ ui->setupUi(this);
+ action=FileExists_Cancel;
+ oldName=fileInfo.fileName();
+ destinationInfo=fileInfo;
+ ui->lineEditNewName->setText(oldName);
+ ui->lineEditNewName->setPlaceholderText(oldName);
+ ui->label_content_size->setText(QString::number(fileInfo.size()));
+ ui->label_content_modified->setText(fileInfo.lastModified().toString());
+ ui->label_content_file_name->setText(fileInfo.fileName());
+ updateRenameButton();
+ QDateTime maxTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
+ if(maxTime<fileInfo.lastModified())
+ {
+ ui->label_modified->setVisible(true);
+ ui->label_content_modified->setVisible(true);
+ ui->label_content_modified->setText(fileInfo.lastModified().toString());
+ }
+ else
+ {
+ ui->label_modified->setVisible(false);
+ ui->label_content_modified->setVisible(false);
+ }
+}
+
+fileIsSameDialog::~fileIsSameDialog()
+{
+ delete ui;
+}
+
+void fileIsSameDialog::changeEvent(QEvent *e)
+{
+ QWidget::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+QString fileIsSameDialog::getNewName()
+{
+ if(oldName==ui->lineEditNewName->text() || ui->checkBoxAlways->isChecked())
+ qDebug() << "fileIsSameDialog, return the old name: "+oldName;
+ else
+ qDebug() << "fileIsSameDialog, return the new name: "+ui->lineEditNewName->text();
+ if(oldName==ui->lineEditNewName->text() || ui->checkBoxAlways->isChecked())
+ return oldName;
+ else
+ return ui->lineEditNewName->text();
+}
+
+void fileIsSameDialog::on_SuggestNewName_clicked()
+{
+ QFileInfo destinationInfo=this->destinationInfo;
+ QString absolutePath=destinationInfo.absolutePath();
+ QString fileName=destinationInfo.fileName();
+ QString suffix="";
+ QString destination;
+ if(fileName.contains(QRegExp("^(.*)(\\.[a-z0-9]+)$")))
+ {
+ suffix=fileName;
+ suffix.replace(QRegExp("^(.*)(\\.[a-z0-9]+)$"),"\\2");
+ fileName.replace(QRegExp("^(.*)(\\.[a-z0-9]+)$"),"\\1");
+ }
+ do
+ {
+ if(!fileName.startsWith(tr("Copy of ")))
+ fileName=tr("Copy of ")+fileName;
+ else
+ {
+ if(fileName.contains(QRegExp("_[0-9]+$")))
+ {
+ QString number=fileName;
+ number.replace(QRegExp("^.*_([0-9]+)$"),"\\1");
+ int num=number.toInt()+1;
+ fileName.remove(QRegExp("[0-9]+$"));
+ fileName+=QString::number(num);
+ }
+ else
+ fileName+="_2";
+ }
+ destination=absolutePath+QDir::separator()+fileName+suffix;
+ destinationInfo.setFile(destination);
+ }
+ while(destinationInfo.exists());
+ ui->lineEditNewName->setText(fileName+suffix);
+}
+
+void fileIsSameDialog::on_Rename_clicked()
+{
+ action=FileExists_Rename;
+ this->close();
+}
+
+void fileIsSameDialog::on_Skip_clicked()
+{
+ action=FileExists_Skip;
+ this->close();
+}
+
+void fileIsSameDialog::on_Cancel_clicked()
+{
+ action=FileExists_Cancel;
+ this->close();
+}
+
+FileExistsAction fileIsSameDialog::getAction()
+{
+ return action;
+}
+
+bool fileIsSameDialog::getAlways()
+{
+ return ui->checkBoxAlways->isChecked();
+}
+
+void fileIsSameDialog::updateRenameButton()
+{
+ ui->Rename->setEnabled(ui->checkBoxAlways->isChecked() || (oldName!=ui->lineEditNewName->text() && !ui->lineEditNewName->text().isEmpty()));
+}
+
+void fileIsSameDialog::on_lineEditNewName_textChanged(const QString &arg1)
+{
+ Q_UNUSED(arg1);
+ updateRenameButton();
+}
+
+void fileIsSameDialog::on_checkBoxAlways_toggled(bool checked)
+{
+ Q_UNUSED(checked);
+ updateRenameButton();
+}
diff --git a/plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.h b/plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.h
new file mode 100644
index 0000000..afd0e04
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.h
@@ -0,0 +1,53 @@
+/** \file fileIsSameDialog.h
+\brief Define the dialog when file is same
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include <QDialog>
+#include <QWidget>
+#include <QString>
+#include <QDateTime>
+#include <QFileInfo>
+#include <QDir>
+#include "Environment.h"
+
+#ifndef FILEISSAMEDIALOG_H
+#define FILEISSAMEDIALOG_H
+
+namespace Ui {
+ class fileIsSameDialog;
+}
+
+/// \brief to show file is same dialog, and ask what do
+class fileIsSameDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ /// \brief create the object and pass all the informations to it
+ explicit fileIsSameDialog(QWidget *parent,QFileInfo fileInfo);
+ ~fileIsSameDialog();
+ /// \brief return the the always checkbox is checked
+ bool getAlways();
+ /// \brief return the action clicked
+ FileExistsAction getAction();
+ /// \brief return the new rename is case in manual renaming
+ QString getNewName();
+protected:
+ void changeEvent(QEvent *e);
+private slots:
+ void on_SuggestNewName_clicked();
+ void on_Rename_clicked();
+ void on_Skip_clicked();
+ void on_Cancel_clicked();
+ void updateRenameButton();
+ void on_lineEditNewName_textChanged(const QString &arg1);
+ void on_checkBoxAlways_toggled(bool checked);
+private:
+ Ui::fileIsSameDialog *ui;
+ FileExistsAction action;
+ QString oldName;
+ QFileInfo destinationInfo;
+};
+
+#endif // FILEISSAMEDIALOG_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.ui b/plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.ui
new file mode 100644
index 0000000..673ba26
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.ui
@@ -0,0 +1,192 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>fileIsSameDialog</class>
+ <widget class="QWidget" name="fileIsSameDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>378</width>
+ <height>148</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>This files are the same file</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>The source and destination is same</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_size">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Size</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_size">
+ <property name="text">
+ <string notr="true">0 KiB</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_file_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>File name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QLabel" name="label_content_file_name">
+ <property name="text">
+ <string notr="true">source.txt</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QLineEdit" name="lineEditNewName">
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="placeholderText">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="SuggestNewName">
+ <property name="text">
+ <string>Suggest new &amp;name</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <widget class="QCheckBox" name="checkBoxAlways">
+ <property name="text">
+ <string>&amp;Always do this action</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Rename">
+ <property name="text">
+ <string>&amp;Rename</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Skip">
+ <property name="text">
+ <string>&amp;Skip</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Cancel">
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.cpp b/plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.cpp
new file mode 100644
index 0000000..054c293
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.cpp
@@ -0,0 +1,96 @@
+#include "folderExistsDialog.h"
+#include "ui_folderExistsDialog.h"
+
+#include <QMessageBox>
+
+folderExistsDialog::folderExistsDialog(QWidget *parent,QFileInfo source,bool isSame,QFileInfo destination) :
+ QDialog(parent),
+ ui(new Ui::folderExistsDialog)
+{
+ ui->setupUi(this);
+ action=FolderExists_Cancel;
+ oldName=source.fileName();
+ ui->lineEditNewName->setText(oldName);
+ ui->lineEditNewName->setPlaceholderText(oldName);
+ ui->label_content_source_modified->setText(source.lastModified().toString());
+ ui->label_content_source_folder_name->setText(source.fileName());
+ if(isSame)
+ {
+ ui->label_source->hide();
+ ui->label_destination->hide();
+ ui->label_destination_modified->hide();
+ ui->label_destination_folder_name->hide();
+ ui->label_content_destination_modified->hide();
+ ui->label_content_destination_folder_name->hide();
+ }
+ else
+ {
+ ui->label_message->hide();
+ ui->label_content_destination_modified->setText(destination.lastModified().toString());
+ ui->label_content_destination_folder_name->setText(destination.fileName());
+ }
+}
+
+folderExistsDialog::~folderExistsDialog()
+{
+ delete ui;
+}
+
+void folderExistsDialog::changeEvent(QEvent *e)
+{
+ QDialog::changeEvent(e);
+ switch (e->type()) {
+ case QEvent::LanguageChange:
+ ui->retranslateUi(this);
+ break;
+ default:
+ break;
+ }
+}
+
+QString folderExistsDialog::getNewName()
+{
+ if(oldName==ui->lineEditNewName->text() || ui->checkBoxAlways->isChecked())
+ return "";
+ else
+ return ui->lineEditNewName->text();
+}
+
+void folderExistsDialog::on_SuggestNewName_clicked()
+{
+ ui->lineEditNewName->setText(tr("Copy of ")+oldName);
+}
+
+void folderExistsDialog::on_Rename_clicked()
+{
+ action=FolderExists_Rename;
+ this->close();
+}
+
+void folderExistsDialog::on_Skip_clicked()
+{
+ action=FolderExists_Skip;
+ this->close();
+}
+
+void folderExistsDialog::on_Cancel_clicked()
+{
+ action=FolderExists_Cancel;
+ this->close();
+}
+
+FolderExistsAction folderExistsDialog::getAction()
+{
+ return action;
+}
+
+bool folderExistsDialog::getAlways()
+{
+ return ui->checkBoxAlways->isChecked();
+}
+
+void folderExistsDialog::on_Merge_clicked()
+{
+ action=FolderExists_Merge;
+ this->close();
+}
diff --git a/plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.h b/plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.h
new file mode 100644
index 0000000..8d1bdfd
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.h
@@ -0,0 +1,50 @@
+/** \file folderExistsDialog.h
+\brief Define the dialog when file exists
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#ifndef FOLDERISSAMEDIALOG_H
+#define FOLDERISSAMEDIALOG_H
+
+#include <QDialog>
+#include <QFileInfo>
+#include <QString>
+#include <QDateTime>
+
+#include "Environment.h"
+
+namespace Ui {
+ class folderExistsDialog;
+}
+
+/// \brief to show file exists dialog, and ask what do
+class folderExistsDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ /// \brief create the object and pass all the informations to it
+ explicit folderExistsDialog(QWidget *parent,QFileInfo source,bool isSame,QFileInfo destination);
+ ~folderExistsDialog();
+ /// \brief return the the always checkbox is checked
+ bool getAlways();
+ /// \brief return the action clicked
+ FolderExistsAction getAction();
+ /// \brief return the new rename is case in manual renaming
+ QString getNewName();
+protected:
+ void changeEvent(QEvent *e);
+private slots:
+ void on_SuggestNewName_clicked();
+ void on_Rename_clicked();
+ void on_Skip_clicked();
+ void on_Cancel_clicked();
+ void on_Merge_clicked();
+private:
+ Ui::folderExistsDialog *ui;
+ FolderExistsAction action;
+ QString oldName;
+};
+
+#endif // FOLDERISSAMEDIALOG_H
diff --git a/plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.ui b/plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.ui
new file mode 100644
index 0000000..c4c4d5e
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.ui
@@ -0,0 +1,282 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>folderExistsDialog</class>
+ <widget class="QDialog" name="folderExistsDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>443</width>
+ <height>146</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>This folders are the same folder</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QLabel" name="label_source">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Minimum" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Source</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_destination">
+ <property name="font">
+ <font>
+ <weight>75</weight>
+ <bold>true</bold>
+ </font>
+ </property>
+ <property name="text">
+ <string>Destination</string>
+ </property>
+ <property name="alignment">
+ <set>Qt::AlignCenter</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_message">
+ <property name="text">
+ <string>The source and destination is same</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_4">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_source_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_source_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_source_folder_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Folder name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_source_folder_name">
+ <property name="text">
+ <string notr="true">folder</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_destination_modified">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Modified</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_destination_folder_name">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Folder name</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLabel" name="label_content_destination_modified">
+ <property name="text">
+ <string notr="true">Today</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="label_content_destination_folder_name">
+ <property name="text">
+ <string notr="true">folder</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLineEdit" name="lineEditNewName">
+ <property name="text">
+ <string notr="true"/>
+ </property>
+ <property name="placeholderText">
+ <string notr="true"/>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="SuggestNewName">
+ <property name="text">
+ <string>Suggest new &amp;name</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <widget class="QCheckBox" name="checkBoxAlways">
+ <property name="text">
+ <string>&amp;Always do this action</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Rename">
+ <property name="text">
+ <string>&amp;Rename</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Merge">
+ <property name="text">
+ <string>Merge</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Skip">
+ <property name="text">
+ <string>Skip</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QPushButton" name="Cancel">
+ <property name="text">
+ <string>&amp;Cancel</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>checkBoxAlways</sender>
+ <signal>clicked(bool)</signal>
+ <receiver>lineEditNewName</receiver>
+ <slot>setDisabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>132</x>
+ <y>126</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>135</x>
+ <y>101</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+