summaryrefslogtreecommitdiff
path: root/plugins/CopyEngine
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/CopyEngine')
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/README.md0
-rwxr-xr-xplugins/CopyEngine/Random/CopyEngine.cpp253
-rwxr-xr-xplugins/CopyEngine/Random/CopyEngine.h128
-rwxr-xr-xplugins/CopyEngine/Random/CopyEngine.pro26
-rwxr-xr-xplugins/CopyEngine/Random/CopyEngineFactory.cpp78
-rwxr-xr-xplugins/CopyEngine/Random/CopyEngineFactory.h58
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Random/README.md (renamed from plugins/CopyEngine/Ultracopier/README.md)0
-rwxr-xr-xplugins/CopyEngine/Random/informations.xml24
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Random/plugin.json (renamed from plugins/CopyEngine/Ultracopier/plugin.json)0
-rwxr-xr-xplugins/CopyEngine/Rsync/CopyEngine.pro2
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Rsync/README.md0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Rsync/Rsync.pro0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Rsync/informations.xml2
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/CallBackEventLoop.h15
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/CompilerInfo.h (renamed from plugins/CopyEngine/Ultracopier/CompilerInfo.h)0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/CopyEngine-collision-and-error.cpp (renamed from plugins/CopyEngine/Ultracopier/CopyEngine-collision-and-error.cpp)219
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/CopyEngine.cpp (renamed from plugins/CopyEngine/Ultracopier/CopyEngine.cpp)452
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/CopyEngine.h (renamed from plugins/CopyEngine/Ultracopier/CopyEngine.h)148
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/CopyEngine.pro (renamed from plugins/CopyEngine/Ultracopier/CopyEngine.pro)39
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/CopyEngineFactory.cpp (renamed from plugins/CopyEngine/Ultracopier/CopyEngineFactory.cpp)319
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/CopyEngineFactory.h (renamed from plugins/CopyEngine/Ultracopier/CopyEngineFactory.h)44
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/CopyEngineUltracopier-SpecVariable.h (renamed from plugins/CopyEngine/Ultracopier/Variable.h)12
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/DebugDialog.cpp (renamed from plugins/CopyEngine/Ultracopier/DebugDialog.cpp)9
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/DebugDialog.h (renamed from plugins/CopyEngine/Ultracopier/DebugDialog.h)9
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/DebugEngineMacro.h (renamed from plugins/CopyEngine/Ultracopier/DebugEngineMacro.h)0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/DiskSpace.cpp (renamed from plugins/CopyEngine/Ultracopier/DiskSpace.cpp)0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/DiskSpace.h (renamed from plugins/CopyEngine/Ultracopier/DiskSpace.h)0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/DiskSpace.ui (renamed from plugins/CopyEngine/Ultracopier/DiskSpace.ui)2
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/DriveManagement.cpp180
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/DriveManagement.h (renamed from plugins/CopyEngine/Ultracopier/DriveManagement.h)8
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Environment.h (renamed from plugins/CopyEngine/Ultracopier/Environment.h)2
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/EventLoop.cpp71
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/EventLoop.h30
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/FileErrorDialog.cpp (renamed from plugins/CopyEngine/Ultracopier/FileErrorDialog.cpp)84
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/FileErrorDialog.h (renamed from plugins/CopyEngine/Ultracopier/FileErrorDialog.h)11
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/FileExistsDialog.cpp (renamed from plugins/CopyEngine/Ultracopier/FileExistsDialog.cpp)149
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/FileExistsDialog.h (renamed from plugins/CopyEngine/Ultracopier/FileExistsDialog.h)16
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/FileIsSameDialog.cpp (renamed from plugins/CopyEngine/Ultracopier/FileIsSameDialog.cpp)92
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/FileIsSameDialog.h (renamed from plugins/CopyEngine/Ultracopier/FileIsSameDialog.h)14
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/FilterRules.cpp (renamed from plugins/CopyEngine/Ultracopier/FilterRules.cpp)16
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/FilterRules.h (renamed from plugins/CopyEngine/Ultracopier/FilterRules.h)1
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/FilterRules.ui (renamed from plugins/CopyEngine/Ultracopier/FilterRules.ui)0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Filters.cpp (renamed from plugins/CopyEngine/Ultracopier/Filters.cpp)12
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Filters.h (renamed from plugins/CopyEngine/Ultracopier/Filters.h)2
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Filters.ui (renamed from plugins/CopyEngine/Ultracopier/Filters.ui)63
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/FolderExistsDialog.cpp (renamed from plugins/CopyEngine/Ultracopier/FolderExistsDialog.cpp)98
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/FolderExistsDialog.h (renamed from plugins/CopyEngine/Ultracopier/FolderExistsDialog.h)17
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/ar/translation.qmbin0 -> 20287 bytes
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/ar/translation.ts1147
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/de/translation.qmbin0 -> 19546 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Languages/de/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/de/translation.ts)685
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/el/translation.qmbin0 -> 327 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Languages/el/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/id/translation.ts)598
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/en/translation.qmbin0 -> 334 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Languages/en/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/en/translation.ts)594
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/es/translation.qmbin0 -> 23560 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Languages/es/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/es/translation.ts)674
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/fr/translation.qmbin0 -> 23074 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Languages/fr/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/fr/translation.ts)679
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/hi/translation.qmbin0 -> 327 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Languages/hi/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/el/translation.ts)598
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/hu/translation.qmbin0 -> 15971 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Languages/hu/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/hu/translation.ts)648
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/id/translation.qmbin0 -> 327 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Languages/id/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/ar/translation.ts)598
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/it/translation.qmbin0 -> 23932 bytes
-rw-r--r--plugins/CopyEngine/Ultracopier-Spec/Languages/it/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/it/translation.ts)871
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/ja/translation.qmbin0 -> 327 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Languages/ja/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/hi/translation.ts)632
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/ko/translation.qmbin0 -> 2785 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Languages/ko/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/ko/translation.ts)600
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/nl/translation.qmbin0 -> 327 bytes
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/nl/translation.ts1147
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/no/translation.qmbin0 -> 327 bytes
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/no/translation.ts1147
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/pl/translation.qmbin0 -> 327 bytes
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/pl/translation.ts1147
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/pt/translation.qmbin0 -> 327 bytes
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/pt/translation.ts1147
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/ru/translation.qmbin0 -> 6529 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/Languages/ru/translation.ts (renamed from plugins/CopyEngine/Ultracopier/Languages/ru/translation.ts)622
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/th/translation.qmbin0 -> 327 bytes
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/th/translation.ts1147
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/tr/translation.qmbin0 -> 327 bytes
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/tr/translation.ts1147
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/zh/translation.qmbin0 -> 327 bytes
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/Languages/zh/translation.ts1147
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ListThread.cpp1235
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/ListThread.h (renamed from plugins/CopyEngine/Ultracopier/ListThread.h)153
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ListThreadActions.cpp129
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ListThreadListChange.cpp423
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ListThreadMedia.cpp169
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ListThreadNew.cpp104
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ListThreadOptions.cpp296
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ListThreadScan.cpp97
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ListThreadStat.cpp184
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ListThread_InodeAction.cpp91
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/MkPath.cpp676
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/MkPath.h (renamed from plugins/CopyEngine/Ultracopier/MkPath.h)48
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/README.md3
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/RenamingRules.cpp (renamed from plugins/CopyEngine/Ultracopier/RenamingRules.cpp)19
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/RenamingRules.h (renamed from plugins/CopyEngine/Ultracopier/RenamingRules.h)0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/RenamingRules.ui (renamed from plugins/CopyEngine/Ultracopier/RenamingRules.ui)0
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp953
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.h (renamed from plugins/CopyEngine/Ultracopier/ScanFileOrFolder.h)52
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/StructEnumDefinition.h (renamed from plugins/CopyEngine/Ultracopier/StructEnumDefinition.h)0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/StructEnumDefinition_CopyEngine.h (renamed from plugins/CopyEngine/Ultracopier/StructEnumDefinition_CopyEngine.h)20
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp1547
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/TransferThread.h265
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/async/ReadThread.cpp (renamed from plugins/CopyEngine/Ultracopier/ReadThread.cpp)536
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/async/ReadThread.h (renamed from plugins/CopyEngine/Ultracopier/ReadThread.h)50
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp1442
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.h153
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/async/WriteThread.cpp1164
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/async/WriteThread.h (renamed from plugins/CopyEngine/Ultracopier/WriteThread.h)77
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/copyEngineOptions.ui (renamed from plugins/CopyEngine/Ultracopier/copyEngineOptions.ui)437
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/copyEngineResources.qrc (renamed from plugins/CopyEngine/Ultracopier/copyEngineResources.qrc)2
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/debugDialog.ui (renamed from plugins/CopyEngine/Ultracopier/debugDialog.ui)34
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/documentation.dox (renamed from plugins/CopyEngine/Ultracopier/documentation.dox)0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/fileErrorDialog.ui (renamed from plugins/CopyEngine/Ultracopier/fileErrorDialog.ui)0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/fileExistsDialog.ui (renamed from plugins/CopyEngine/Ultracopier/fileExistsDialog.ui)20
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/fileIsSameDialog.ui (renamed from plugins/CopyEngine/Ultracopier/fileIsSameDialog.ui)0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/folderExistsDialog.ui (renamed from plugins/CopyEngine/Ultracopier/folderExistsDialog.ui)0
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/informations.xml (renamed from plugins/CopyEngine/Ultracopier/informations.xml)14
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/plugin.json1
-rwxr-xr-xplugins/CopyEngine/Ultracopier-Spec/ports.h6
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/resources/add.png (renamed from plugins/CopyEngine/Ultracopier/resources/add.png)bin552 -> 552 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/resources/edit.png (renamed from plugins/CopyEngine/Ultracopier/resources/edit.png)bin623 -> 623 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/resources/filter.png (renamed from plugins/CopyEngine/Ultracopier/resources/filter.png)bin685 -> 685 bytes
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-Spec/resources/remove.png (renamed from plugins/CopyEngine/Ultracopier/resources/remove.png)bin683 -> 683 bytes
-rw-r--r--plugins/CopyEngine/Ultracopier/AvancedQFile.cpp208
-rw-r--r--plugins/CopyEngine/Ultracopier/AvancedQFile.h45
-rw-r--r--plugins/CopyEngine/Ultracopier/DriveManagement.cpp105
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/ja/translation.ts1291
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/nl/translation.ts1291
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/no/translation.ts1291
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/pl/translation.ts1291
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/pt/translation.ts1291
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/th/translation.ts1291
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/tr/translation.ts1291
-rw-r--r--plugins/CopyEngine/Ultracopier/Languages/zh/translation.ts1291
-rw-r--r--plugins/CopyEngine/Ultracopier/ListThread.cpp2429
-rw-r--r--plugins/CopyEngine/Ultracopier/ListThread_InodeAction.cpp64
-rw-r--r--plugins/CopyEngine/Ultracopier/MkPath.cpp517
-rw-r--r--plugins/CopyEngine/Ultracopier/ScanFileOrFolder.cpp680
-rw-r--r--plugins/CopyEngine/Ultracopier/TransferThread.cpp2101
-rw-r--r--plugins/CopyEngine/Ultracopier/TransferThread.h292
-rw-r--r--plugins/CopyEngine/Ultracopier/WriteThread.cpp976
148 files changed, 23830 insertions, 23995 deletions
diff --git a/plugins/CopyEngine/README.md b/plugins/CopyEngine/README.md
index 317a7e4..317a7e4 100644..100755
--- a/plugins/CopyEngine/README.md
+++ b/plugins/CopyEngine/README.md
diff --git a/plugins/CopyEngine/Random/CopyEngine.cpp b/plugins/CopyEngine/Random/CopyEngine.cpp
new file mode 100755
index 0000000..662fb5b
--- /dev/null
+++ b/plugins/CopyEngine/Random/CopyEngine.cpp
@@ -0,0 +1,253 @@
+/** \file copyEngine.cpp
+\brief Define the copy engine
+\author alpha_one_x86 */
+
+#include "CopyEngine.h"
+#include "../../../interface/PluginInterface_CopyEngine.h"
+#include <QCoreApplication>
+
+CopyEngine::CopyEngine()
+{
+ timer=new QTimer();
+ connect(timer,&QTimer::timeout,this,&CopyEngine::timerSlot);
+ timer->start(1000);
+ send=false;
+}
+
+CopyEngine::~CopyEngine()
+{
+}
+
+//to send the options panel
+bool CopyEngine::getOptionsEngine(QWidget * tempWidget)
+{
+ (void)tempWidget;
+ return true;
+}
+
+//to have interface widget to do modal dialog
+void CopyEngine::setInterfacePointer(QWidget * uiinterface)
+{
+ (void)uiinterface;
+ syncTransferList();
+}
+
+bool CopyEngine::haveSameSource(const std::vector<std::string> &)
+{
+ return false;
+}
+
+bool CopyEngine::haveSameDestination(const std::string &)
+{
+ return false;
+}
+
+bool CopyEngine::newCopy(const std::vector<std::string> &sources)
+{
+ (void)sources;
+ return true;
+}
+
+bool CopyEngine::newCopy(const std::vector<std::string> &sources,const std::string &destination)
+{
+ (void)sources;
+ (void)destination;
+ return true;
+}
+
+bool CopyEngine::newMove(const std::vector<std::string> &sources)
+{
+ (void)sources;
+ return true;
+}
+
+bool CopyEngine::newMove(const std::vector<std::string> &sources,const std::string &destination)
+{
+ (void)sources;
+ (void)destination;
+ return true;
+}
+
+void CopyEngine::newTransferList(const std::string &file)
+{
+ (void)file;
+}
+
+//because direct access to list thread into the main thread can't be do
+uint64_t CopyEngine::realByteTransfered()
+{
+ return rand()%200000000;
+}
+
+void CopyEngine::timerSlot()
+{
+ emit pushGeneralProgression(rand()%200000000,200000000);
+
+ {
+ std::vector<std::pair<uint64_t,uint32_t> > progressionList;
+ progressionList.push_back(std::pair<uint64_t,uint32_t>(100, 2));
+ progressionList.push_back(std::pair<uint64_t,uint32_t>(1000, 2));
+ progressionList.push_back(std::pair<uint64_t,uint32_t>(10000, 2+ rand()%2));
+ progressionList.push_back(std::pair<uint64_t,uint32_t>(100000, 5+ rand()%3));
+ progressionList.push_back(std::pair<uint64_t,uint32_t>(1000000, 15+ rand()%3));
+ progressionList.push_back(std::pair<uint64_t,uint32_t>(10000000, 50+ rand()%10));
+ progressionList.push_back(std::pair<uint64_t,uint32_t>(100000000, 800+ rand()%100));
+ progressionList.push_back(std::pair<uint64_t,uint32_t>(1000000000, 6000+ rand()%500));
+ progressionList.push_back(std::pair<uint64_t,uint32_t>(10000000000, 50000+ rand()%1000));
+ emit doneTime(progressionList);
+ }
+
+ {
+ std::vector<Ultracopier::ProgressionItem> progressionList;
+ Ultracopier::ProgressionItem entry;
+ entry.currentRead=60*1024*1024+rand()%20*1024*1024;
+ entry.currentWrite=40*1024*1024+rand()%20*1024*1024;
+ entry.id=1;
+ entry.total=100*1024*1024;
+ progressionList.push_back(entry);
+ emit pushFileProgression(progressionList);
+ }
+}
+
+//speed limitation
+bool CopyEngine::supportSpeedLimitation() const
+{
+ return false;
+}
+
+/** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+void CopyEngine::syncTransferList()
+{
+ emit syncReady();
+ if(send)
+ return;
+ send=true;
+
+ emit actionInProgess(Ultracopier::Copying);
+
+ std::vector<Ultracopier::ReturnActionOnCopyList> actionsList;
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type = Ultracopier::AddingItem;
+
+ newAction.addAction.id = 1;
+ newAction.addAction.sourceFullPath = "/folder1/file.iso";
+ newAction.addAction.sourceFileName = "file.iso";
+ newAction.addAction.destinationFullPath = "/dest/folder1/file.iso";
+ newAction.addAction.destinationFileName = "file.iso";
+ newAction.addAction.size = 100*1024*1024;
+ newAction.addAction.mode = Ultracopier::CopyMode::Copy;
+ actionsList.push_back(newAction);
+
+ newAction.addAction.id = 2;
+ newAction.addAction.sourceFullPath = "/file.mp3";
+ newAction.addAction.sourceFileName = "file.mp3";
+ newAction.addAction.destinationFullPath = "/dest/file.mp3";
+ newAction.addAction.destinationFileName = "file.mp3";
+ newAction.addAction.size = 10*1024*1024;
+ newAction.addAction.mode = Ultracopier::CopyMode::Copy;
+ actionsList.push_back(newAction);
+
+ newAction.addAction.id = 3;
+ newAction.addAction.sourceFullPath = "/file.mp4";
+ newAction.addAction.sourceFileName = "file.mp4";
+ newAction.addAction.destinationFullPath = "/dest/file.mp4";
+ newAction.addAction.destinationFileName = "file.mp4";
+ newAction.addAction.size = 50*1024*1024;
+ newAction.addAction.mode = Ultracopier::CopyMode::Copy;
+ actionsList.push_back(newAction);
+
+ newAction.addAction.id = 1;
+ newAction.addAction.sourceFullPath = "/folder1/file.iso";
+ newAction.addAction.sourceFileName = "file.iso";
+ newAction.addAction.destinationFullPath = "/dest/folder1/file.iso";
+ newAction.addAction.destinationFileName = "file.iso";
+ newAction.addAction.size = 100*1024*1024;
+ newAction.addAction.mode = Ultracopier::CopyMode::Copy;
+ newAction.type = Ultracopier::PreOperation;
+ actionsList.push_back(newAction);
+ newAction.type = Ultracopier::Transfer;
+ actionsList.push_back(newAction);
+
+ emit newActionOnList(actionsList);
+}
+
+bool CopyEngine::userAddFolder(const Ultracopier::CopyMode &mode)
+{
+ (void)mode;
+ return true;
+}
+
+bool CopyEngine::userAddFile(const Ultracopier::CopyMode &mode)
+{
+ (void)mode;
+ return true;
+}
+
+void CopyEngine::pause()
+{
+}
+
+void CopyEngine::resume()
+{
+}
+
+void CopyEngine::skip(const uint64_t &id)
+{
+ (void)id;
+}
+
+void CopyEngine::cancel()
+{
+ emit canBeDeleted();
+}
+
+void CopyEngine::removeItems(const std::vector<uint64_t> &ids)
+{
+ (void)ids;
+}
+
+void CopyEngine::moveItemsOnTop(const std::vector<uint64_t> &ids)
+{
+ (void)ids;
+}
+
+void CopyEngine::moveItemsUp(const std::vector<uint64_t> &ids)
+{
+ (void)ids;
+}
+
+void CopyEngine::moveItemsDown(const std::vector<uint64_t> &ids)
+{
+ (void)ids;
+}
+
+void CopyEngine::moveItemsOnBottom(const std::vector<uint64_t> &ids)
+{
+ (void)ids;
+}
+
+/** \brief give the forced mode, to export/import transfer list */
+void CopyEngine::forceMode(const Ultracopier::CopyMode &mode)
+{
+ (void)mode;
+}
+
+void CopyEngine::exportTransferList()
+{
+}
+
+void CopyEngine::importTransferList()
+{
+}
+
+bool CopyEngine::setSpeedLimitation(const int64_t &speedLimitation)
+{
+ (void)speedLimitation;
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"maxSpeed: "+std::to_string(speedLimitation));
+ return false;
+}
+
+void CopyEngine::exportErrorIntoTransferList()
+{
+}
diff --git a/plugins/CopyEngine/Random/CopyEngine.h b/plugins/CopyEngine/Random/CopyEngine.h
new file mode 100755
index 0000000..2da5da5
--- /dev/null
+++ b/plugins/CopyEngine/Random/CopyEngine.h
@@ -0,0 +1,128 @@
+/** \file copyEngine.h
+\brief Define the copy engine
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include "../../../interface/PluginInterface_CopyEngine.h"
+
+#ifndef COPY_ENGINE_H
+#define COPY_ENGINE_H
+
+#include <QTimer>
+
+namespace Ui {
+ class copyEngineOptions;
+}
+
+/// \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();
+ ~CopyEngine();
+ void exportErrorIntoTransferList() override;
+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) override;
+ /** \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 * uiinterface) override;
+ //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 std::vector<std::string> &sources) override;
+ /** \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 std::string &destination) override;
+ //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 std::vector<std::string> &sources) override;
+ /** \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 std::vector<std::string> &sources,const std::string &destination) override;
+ /** \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 std::vector<std::string> &sources) override;
+ /** \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 std::vector<std::string> &sources,const std::string &destination) override;
+ /** \brief send the new transfer list
+ * \param file the transfer list */
+ void newTransferList(const std::string &file) override;
+
+ /** \brief to get byte read, use by Ultracopier for the speed calculation
+ * real size transfered to right speed calculation */
+ uint64_t realByteTransfered() override;
+ /** \brief support speed limitation */
+ bool supportSpeedLimitation() const override;
+
+ /** \brief to set drives detected
+ * specific to this copy engine */
+
+ /** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+ void syncTransferList() override;
+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 Ultracopier::CopyMode &mode) override;
+ /** \brief add file called on the interface
+ * Used by manual adding */
+ bool userAddFile(const Ultracopier::CopyMode &mode) override;
+ //action on the copy
+ /// \brief put the transfer in pause
+ void pause() override;
+ /// \brief resume the transfer
+ void resume() override;
+ /** \brief skip one transfer entry
+ * \param id id of the file to remove */
+ void skip(const uint64_t &id) override;
+ /// \brief cancel all the transfer
+ void cancel() override;
+ //edit the transfer list
+ /** \brief remove the selected item
+ * \param ids ids is the id list of the selected items */
+ void removeItems(const std::vector<uint64_t> &ids) override;
+ /** \brief move on top of the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsOnTop(const std::vector<uint64_t> &ids) override;
+ /** \brief move up the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsUp(const std::vector<uint64_t> &ids) override;
+ /** \brief move down the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsDown(const std::vector<uint64_t> &ids) override;
+ /** \brief move on bottom of the list the selected item
+ * \param ids ids is the id list of the selected items */
+ void moveItemsOnBottom(const std::vector<uint64_t> &ids) override;
+
+ /** \brief give the forced mode, to export/import transfer list */
+ void forceMode(const Ultracopier::CopyMode &mode) override;
+ /// \brief export the transfer list into a file
+ void exportTransferList() override;
+ /// \brief import the transfer list into a file
+ void importTransferList() override;
+
+ /** \brief to set the speed limitation
+ * -1 if not able, 0 if disabled */
+ bool setSpeedLimitation(const int64_t &speedLimitation) override;
+private:
+ bool send;
+ QTimer *timer;
+ void timerSlot();
+};
+
+#endif // COPY_ENGINE_H
diff --git a/plugins/CopyEngine/Random/CopyEngine.pro b/plugins/CopyEngine/Random/CopyEngine.pro
new file mode 100755
index 0000000..f65ce88
--- /dev/null
+++ b/plugins/CopyEngine/Random/CopyEngine.pro
@@ -0,0 +1,26 @@
+CONFIG += c++11
+QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
+mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
+
+QT += widgets xml
+DEFINES += UNICODE _UNICODE
+TEMPLATE = lib
+CONFIG += plugin
+
+HEADERS += \
+ $$PWD/../../../interface/PluginInterface_CopyEngine.h \
+ $$PWD/../../../interface/OptionInterface.h \
+ $$PWD/../../../interface/FacilityInterface.h \
+ $$PWD/../../../cpp11addition.h \
+ $$PWD/CopyEngine.h \
+ $$PWD/CopyEngineFactory.h
+SOURCES += \
+ $$PWD/../../../cpp11addition.cpp \
+ $$PWD/../../../cpp11additionstringtointcpp.cpp \
+ $$PWD/CopyEngine.cpp \
+ $$PWD/CopyEngineFactory.cpp
+TARGET = $$qtLibraryTarget(copyEngine)
+
+win32 {
+ LIBS += -ladvapi32
+}
diff --git a/plugins/CopyEngine/Random/CopyEngineFactory.cpp b/plugins/CopyEngine/Random/CopyEngineFactory.cpp
new file mode 100755
index 0000000..8fe5ad6
--- /dev/null
+++ b/plugins/CopyEngine/Random/CopyEngineFactory.cpp
@@ -0,0 +1,78 @@
+/** \file factory.cpp
+\brief Define the factory to create new instance
+\author alpha_one_x86 */
+
+#include "../../../cpp11addition.h"
+#include "CopyEngineFactory.h"
+
+CopyEngineFactory::CopyEngineFactory()
+{
+}
+
+CopyEngineFactory::~CopyEngineFactory()
+{
+}
+
+PluginInterface_CopyEngine * CopyEngineFactory::getInstance()
+{
+ CopyEngine *realObject=new CopyEngine();
+ return realObject;
+}
+
+void CopyEngineFactory::setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,
+ FacilityInterface * facilityInterface,const bool &portableVersion)
+{
+ (void)options;
+ (void)writePath;
+ (void)pluginPath;
+ (void)facilityInterface;
+ (void)portableVersion;
+}
+
+std::vector<std::string> CopyEngineFactory::supportedProtocolsForTheSource() const
+{
+ std::vector<std::string> l;
+ l.push_back("file");
+ return l;
+}
+
+std::vector<std::string> CopyEngineFactory::supportedProtocolsForTheDestination() const
+{
+ std::vector<std::string> l;
+ l.push_back("file");
+ return l;
+}
+
+Ultracopier::CopyType CopyEngineFactory::getCopyType()
+{
+ return Ultracopier::FileAndFolder;
+}
+
+Ultracopier::TransferListOperation CopyEngineFactory::getTransferListOperation()
+{
+ return Ultracopier::TransferListOperation_ImportExport;
+}
+
+bool CopyEngineFactory::canDoOnlyCopy() const
+{
+ return false;
+}
+
+void CopyEngineFactory::resetOptions()
+{
+}
+
+QWidget * CopyEngineFactory::options()
+{
+ return nullptr;
+}
+
+/// \brief to get if have pause
+bool CopyEngineFactory::havePause()
+{
+ return false;
+}
+
+void CopyEngineFactory::newLanguageLoaded()
+{
+}
diff --git a/plugins/CopyEngine/Random/CopyEngineFactory.h b/plugins/CopyEngine/Random/CopyEngineFactory.h
new file mode 100755
index 0000000..b1bad6a
--- /dev/null
+++ b/plugins/CopyEngine/Random/CopyEngineFactory.h
@@ -0,0 +1,58 @@
+/** \file factory.h
+\brief Define the factory to create new instance
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QObject>
+#include <QList>
+#include <QStringList>
+#include <QFileInfo>
+#include <QProcess>
+#include <QTimer>
+
+#include "../../../interface/PluginInterface_CopyEngine.h"
+#include "CopyEngine.h"
+
+#ifndef FACTORY_H
+#define FACTORY_H
+
+namespace Ui {
+ class copyEngineOptions;
+}
+
+/** \brief to generate copy engine instance */
+class CopyEngineFactory : public PluginInterface_CopyEngineFactory
+{
+ Q_OBJECT
+ #ifndef ULTRACOPIER_PLUGIN_ALL_IN_ONE_DIRECT
+ Q_PLUGIN_METADATA(IID "first-world.info.ultracopier.PluginInterface.CopyEngineFactory/2.0.0.0" FILE "plugin.json")
+ Q_INTERFACES(PluginInterface_CopyEngineFactory)
+ #endif
+public:
+ CopyEngineFactory();
+ ~CopyEngineFactory();
+ /// \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 std::string &writePath,const std::string &pluginPath,FacilityInterface * facilityInterface,const bool &portableVersion) override;
+ //get mode allowed
+ /// \brief define if can copy file, folder or both
+ Ultracopier::CopyType getCopyType() override;
+ /// \brief to return which kind of transfer list operation is supported
+ Ultracopier::TransferListOperation getTransferListOperation() override;
+ /// \brief define if can only copy, or copy and move
+ bool canDoOnlyCopy() const override;
+ /// \brief to get the supported protocols for the source
+ std::vector<std::string> supportedProtocolsForTheSource() const override;
+ /// \brief to get the supported protocols for the destination
+ std::vector<std::string> supportedProtocolsForTheDestination() const override;
+ /// \brief to get the options of the copy engine
+ QWidget * options() override;
+ /// \brief to get if have pause
+ bool havePause() override;
+public slots:
+ void resetOptions() override;
+ void newLanguageLoaded() override;
+};
+
+#endif // FACTORY_H
diff --git a/plugins/CopyEngine/Ultracopier/README.md b/plugins/CopyEngine/Random/README.md
index a15b943..a15b943 100644..100755
--- a/plugins/CopyEngine/Ultracopier/README.md
+++ b/plugins/CopyEngine/Random/README.md
diff --git a/plugins/CopyEngine/Random/informations.xml b/plugins/CopyEngine/Random/informations.xml
new file mode 100755
index 0000000..490980f
--- /dev/null
+++ b/plugins/CopyEngine/Random/informations.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package>
+ <title xml:lang="en"><![CDATA[Random copy engine]]></title><!-- english is required -->
+ <!-- What kind of plugin this is -->
+ <category>CopyEngine</category>
+ <!-- Who wrote this plugin -->
+ <author><![CDATA[BRULE Herman, alpha_one_x86 (alpha_one_x86@first-world.info)]]></author>
+ <!-- URL of page or site for this plugin (may provide additional information, bug reports, feature requests). -->
+ <website xml:lang="en"><![CDATA[http://ultracopier.first-world.info/]]></website><!-- not required -->
+ <website xml:lang="fr"><![CDATA[http://ultracopier-fr.first-world.info/]]></website><!-- not required -->
+ <!-- the date-time format should be in timestamps format -->
+ <pubDate>1287496800</pubDate>
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>windows-x86</architecture>
+ <!-- Detailed description -->
+ <description xml:lang="en"><![CDATA[TODO]]></description>
+ <!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
+ <version>2.2.4.4</version>
+ <!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
+ <name>Random</name>
+ <!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
+ <dependencies><![CDATA[
+ ]]></dependencies>
+</package>
diff --git a/plugins/CopyEngine/Ultracopier/plugin.json b/plugins/CopyEngine/Random/plugin.json
index 9e26dfe..9e26dfe 100644..100755
--- a/plugins/CopyEngine/Ultracopier/plugin.json
+++ b/plugins/CopyEngine/Random/plugin.json
diff --git a/plugins/CopyEngine/Rsync/CopyEngine.pro b/plugins/CopyEngine/Rsync/CopyEngine.pro
new file mode 100755
index 0000000..9728dc0
--- /dev/null
+++ b/plugins/CopyEngine/Rsync/CopyEngine.pro
@@ -0,0 +1,2 @@
+include($$PWD/../Ultracopier/Ultracopier.pro)
+DEFINES += ULTRACOPIER_PLUGIN_RSYNC
diff --git a/plugins/CopyEngine/Rsync/README.md b/plugins/CopyEngine/Rsync/README.md
index 94452a4..94452a4 100644..100755
--- a/plugins/CopyEngine/Rsync/README.md
+++ b/plugins/CopyEngine/Rsync/README.md
diff --git a/plugins/CopyEngine/Rsync/Rsync.pro b/plugins/CopyEngine/Rsync/Rsync.pro
index e525f27..e525f27 100644..100755
--- a/plugins/CopyEngine/Rsync/Rsync.pro
+++ b/plugins/CopyEngine/Rsync/Rsync.pro
diff --git a/plugins/CopyEngine/Rsync/informations.xml b/plugins/CopyEngine/Rsync/informations.xml
index 990809e..5ded350 100644..100755
--- a/plugins/CopyEngine/Rsync/informations.xml
+++ b/plugins/CopyEngine/Rsync/informations.xml
@@ -17,7 +17,7 @@
<description xml:lang="en"><![CDATA[Rsync copy engine, variant of the official copy engine to provide simple way to do backups]]></description>
<description xml:lang="fr"><![CDATA[Moteur de copie rsync, variante du moteur de copie officiel pour fournir une maniére simple de faire des backups]]></description>
<!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
- <version>1.6.1.3</version>
+ <version>2.2.4.4</version>
<!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
<name>Rsync</name>
<!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
diff --git a/plugins/CopyEngine/Ultracopier-Spec/CallBackEventLoop.h b/plugins/CopyEngine/Ultracopier-Spec/CallBackEventLoop.h
new file mode 100755
index 0000000..811bf86
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/CallBackEventLoop.h
@@ -0,0 +1,15 @@
+#ifndef CALLBACKEVENTLOOP_H
+#define CALLBACKEVENTLOOP_H
+
+#include <QObject>
+#include "Variable.h"
+
+#ifdef POSIXFILEMANIP
+class CallBackEventLoop
+{
+public:
+ virtual void callBack() = 0;
+};
+#endif
+
+#endif // CALLBACKEVENTLOOP_H
diff --git a/plugins/CopyEngine/Ultracopier/CompilerInfo.h b/plugins/CopyEngine/Ultracopier-Spec/CompilerInfo.h
index 84625b9..84625b9 100644..100755
--- a/plugins/CopyEngine/Ultracopier/CompilerInfo.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/CompilerInfo.h
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngine-collision-and-error.cpp b/plugins/CopyEngine/Ultracopier-Spec/CopyEngine-collision-and-error.cpp
index 16c36ae..fcf43ff 100644..100755
--- a/plugins/CopyEngine/Ultracopier/CopyEngine-collision-and-error.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/CopyEngine-collision-and-error.cpp
@@ -8,37 +8,37 @@
//dialog message
/// \note Can be call without queue because all call will be serialized
-void CopyEngine::fileAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread)
+void CopyEngine::fileAlreadyExistsSlot(INTERNALTYPEPATH source,INTERNALTYPEPATH destination,bool isSame,TransferThreadAsync * thread)
{
fileAlreadyExists(source,destination,isSame,thread);
}
/// \note Can be call without queue because all call will be serialized
-void CopyEngine::errorOnFileSlot(QFileInfo fileInfo,std::string errorString,TransferThread * thread,const ErrorType &errorType)
+void CopyEngine::errorOnFileSlot(INTERNALTYPEPATH fileInfo,std::string errorString,TransferThreadAsync * thread,const ErrorType &errorType)
{
errorOnFile(fileInfo,errorString,thread,errorType);
}
/// \note Can be call without queue because all call will be serialized
-void CopyEngine::folderAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,ScanFileOrFolder * thread)
+void CopyEngine::folderAlreadyExistsSlot(INTERNALTYPEPATH source,INTERNALTYPEPATH destination,bool isSame,ScanFileOrFolder * thread)
{
folderAlreadyExists(source,destination,isSame,thread);
}
/// \note Can be call without queue because all call will be serialized
-void CopyEngine::errorOnFolderSlot(QFileInfo fileInfo,std::string errorString,ScanFileOrFolder * thread,ErrorType errorType)
+void CopyEngine::errorOnFolderSlot(INTERNALTYPEPATH fileInfo,std::string errorString,ScanFileOrFolder * thread,ErrorType errorType)
{
errorOnFolder(fileInfo,errorString,thread,errorType);
}
//mkpath event
-void CopyEngine::mkPathErrorOnFolderSlot(QFileInfo folder,std::string error,ErrorType errorType)
+void CopyEngine::mkPathErrorOnFolderSlot(INTERNALTYPEPATH folder,std::string error,ErrorType errorType)
{
mkPathErrorOnFolder(folder,error,errorType);
}
/// \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)
+void CopyEngine::fileAlreadyExists(INTERNALTYPEPATH source,INTERNALTYPEPATH destination,bool isSame,TransferThreadAsync * thread,bool isCalledByShowOneNewDialog)
{
if(stopIt)
return;
@@ -50,9 +50,9 @@ void CopyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool i
//load the action
if(isSame)
{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file is same: "+source.absoluteFilePath().toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file is same: "+TransferThread::internalStringTostring(source));
FileExistsAction tempFileExistsAction=alwaysDoThisActionForFileExists;
- if(tempFileExistsAction==FileExists_Overwrite || tempFileExistsAction==FileExists_OverwriteIfNewer || tempFileExistsAction==FileExists_OverwriteIfNotSame || tempFileExistsAction==FileExists_OverwriteIfOlder)
+ if(tempFileExistsAction==FileExists_Overwrite || tempFileExistsAction==FileExists_OverwriteIfNewer || tempFileExistsAction==FileExists_OverwriteIfNotSameMdate || tempFileExistsAction==FileExists_OverwriteIfOlder)
tempFileExistsAction=FileExists_NotSet;
switch(tempFileExistsAction)
{
@@ -74,7 +74,7 @@ void CopyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool i
}
dialogIsOpen=true;
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
- FileIsSameDialog dialog(interface,source,firstRenamingRule,otherRenamingRule);
+ FileIsSameDialog dialog(uiinterface,source,firstRenamingRule,otherRenamingRule,facilityEngine);
emit isInPause(true);
dialog.exec();/// \bug crash when external close
FileExistsAction newAction=dialog.getAction();
@@ -107,14 +107,20 @@ void CopyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool i
thread->setFileRename(dialog.getNewName());
dialogIsOpen=false;
if(!isCalledByShowOneNewDialog)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit queryOneNewDialog()");
emit queryOneNewDialog();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"NOT emit queryOneNewDialog(), !isCalledByShowOneNewDialog");
return;
break;
}
}
else
{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file already exists: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file already exists: "+TransferThread::internalStringTostring(source)+
+ ", destination: "+TransferThread::internalStringTostring(destination));
FileExistsAction tempFileExistsAction=alwaysDoThisActionForFileExists;
switch(tempFileExistsAction)
{
@@ -123,17 +129,18 @@ void CopyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool i
case FileExists_Overwrite:
case FileExists_OverwriteIfNewer:
case FileExists_OverwriteIfOlder:
- case FileExists_OverwriteIfNotSame:
+ case FileExists_OverwriteIfNotSameMdate:
+ case FileExists_OverwriteIfNotSameSize:
+ case FileExists_OverwriteIfNotSameSizeAndDate:
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"always do this action: "+std::to_string(tempFileExistsAction));
thread->setFileExistsAction(tempFileExistsAction);
break;
default:
if(dialogIsOpen)
{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("dialog open, put in queue: %1 %2")
- .arg(source.absoluteFilePath())
- .arg(destination.absoluteFilePath())
- .toStdString()
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"dialog open, put in queue: "+
+ TransferThread::internalStringTostring(source)+" "+
+ TransferThread::internalStringTostring(destination)
);
alreadyExistsQueueItem newItem;
newItem.source=source;
@@ -146,7 +153,7 @@ void CopyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool i
}
dialogIsOpen=true;
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
- FileExistsDialog dialog(interface,source,destination,firstRenamingRule,otherRenamingRule);
+ FileExistsDialog dialog(uiinterface,source,destination,firstRenamingRule,otherRenamingRule,facilityEngine);
emit isInPause(true);
dialog.exec();/// \bug crash when external close
FileExistsAction newAction=dialog.getAction();
@@ -174,7 +181,7 @@ void CopyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool i
case FileExists_Overwrite:
ui->comboBoxFileCollision->setCurrentIndex(2);
break;
- case FileExists_OverwriteIfNotSame:
+ case FileExists_OverwriteIfNotSameMdate:
ui->comboBoxFileCollision->setCurrentIndex(3);
break;
case FileExists_OverwriteIfNewer:
@@ -183,6 +190,12 @@ void CopyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool i
case FileExists_OverwriteIfOlder:
ui->comboBoxFileCollision->setCurrentIndex(5);
break;
+ case FileExists_OverwriteIfNotSameSize:
+ ui->comboBoxFileCollision->setCurrentIndex(7);
+ break;
+ case FileExists_OverwriteIfNotSameSizeAndDate:
+ ui->comboBoxFileCollision->setCurrentIndex(8);
+ break;
}
}
if(dialog.getAlways() || newAction!=FileExists_Rename)
@@ -195,6 +208,8 @@ void CopyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool i
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit queryOneNewDialog()");
emit queryOneNewDialog();
}
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"NOT emit queryOneNewDialog(), !isCalledByShowOneNewDialog");
return;
break;
}
@@ -202,7 +217,7 @@ void CopyEngine::fileAlreadyExists(QFileInfo source,QFileInfo destination,bool i
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
}
-void CopyEngine::haveNeedPutAtBottom(bool needPutAtBottom, const QFileInfo &fileInfo, const std::string &errorString,TransferThread *thread,const ErrorType &errorType)
+void CopyEngine::haveNeedPutAtBottom(bool needPutAtBottom, const INTERNALTYPEPATH &fileInfo, const std::string &errorString,TransferThreadAsync *thread,const ErrorType &errorType)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
if(!needPutAtBottom)
@@ -226,7 +241,7 @@ void CopyEngine::haveNeedPutAtBottom(bool needPutAtBottom, const QFileInfo &file
void CopyEngine::missingDiskSpace(std::vector<Diskspace> list)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
- DiskSpace dialog(facilityEngine,list,interface);
+ DiskSpace dialog(facilityEngine,list,uiinterface);
emit isInPause(true);
dialog.exec();/// \bug crash when external close
bool ok=dialog.getAction();
@@ -239,11 +254,12 @@ void CopyEngine::missingDiskSpace(std::vector<Diskspace> list)
}
/// \note Can be call without queue because all call will be serialized
-void CopyEngine::errorOnFile(QFileInfo fileInfo,std::string errorString,TransferThread * thread,const ErrorType &errorType,bool isCalledByShowOneNewDialog)
+void CopyEngine::errorOnFile(INTERNALTYPEPATH fileInfo,std::string errorString,TransferThreadAsync * thread,const ErrorType &errorType,bool isCalledByShowOneNewDialog)
{
if(stopIt)
return;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+fileInfo.absoluteFilePath().toStdString()+", error: "+errorString);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+TransferThread::internalStringTostring(fileInfo)+
+ ", error: "+errorString);
if(thread==NULL)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to locate the thread");
@@ -260,7 +276,13 @@ void CopyEngine::errorOnFile(QFileInfo fileInfo,std::string errorString,Transfer
thread->retryAfterError();
return;
case FileError_PutToEndOfTheList:
+ errorPutAtEnd++;
emit getNeedPutAtBottom(fileInfo,errorString,thread,errorType);
+ if(errorPutAtEnd>listThread->actionToDoListInode.size() || listThread->actionToDoListInode.size()==0)
+ {
+ alwaysDoThisActionForFileError=FileError_NotSet;
+ errorPutAtEnd=0;
+ }
return;
case FileError_Cancel:
return;
@@ -280,8 +302,43 @@ void CopyEngine::errorOnFile(QFileInfo fileInfo,std::string errorString,Transfer
}
dialogIsOpen=true;
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
- emit error(fileInfo.absoluteFilePath().toStdString(),fileInfo.size(),fileInfo.lastModified().toMSecsSinceEpoch()/1000,errorString);
- FileErrorDialog dialog(interface,fileInfo,errorString,errorType);
+
+ uint64_t size=0;
+ uint64_t mdate=0;
+ #ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA sourceW;
+ if(GetFileAttributesExW(fileInfo.c_str(),GetFileExInfoStandard,&sourceW))
+ {
+ mdate=sourceW.ftLastWriteTime.dwHighDateTime;
+ mdate<<=32;
+ mdate|=sourceW.ftLastWriteTime.dwLowDateTime;
+ size=sourceW.nFileSizeHigh;
+ size<<=32;
+ size|=sourceW.nFileSizeLow;
+ }
+ #else
+ struct stat source_statbuf;
+ #ifdef Q_OS_UNIX
+ if(lstat(TransferThread::internalStringTostring(fileInfo).c_str(), &source_statbuf)==0)
+ #else
+ if(stat(TransferThread::internalStringTostring(fileInfo).c_str(), &source_statbuf)==0)
+ #endif
+ {
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_MAC
+ mdate=source_statbuf.st_mtimespec.tv_sec;
+ #else
+ mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtim);
+ #endif
+ #else
+ mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtime);
+ #endif
+ size=source_statbuf.st_size;
+ }
+ #endif
+
+ emit error(TransferThread::internalStringTostring(fileInfo),size,mdate,errorString);
+ FileErrorDialog dialog(uiinterface,fileInfo,errorString,errorType,facilityEngine);
emit isInPause(true);
dialog.exec();/// \bug crash when external close
FileErrorAction newAction=dialog.getAction();
@@ -316,6 +373,7 @@ void CopyEngine::errorOnFile(QFileInfo fileInfo,std::string errorString,Transfer
thread->retryAfterError();
break;
case FileError_PutToEndOfTheList:
+ errorPutAtEnd++;
thread->putAtBottom();
break;
default:
@@ -324,7 +382,10 @@ void CopyEngine::errorOnFile(QFileInfo fileInfo,std::string errorString,Transfer
}
dialogIsOpen=false;
if(!isCalledByShowOneNewDialog)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit queryOneNewDialog()");
emit queryOneNewDialog();
+ }
else
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"isCalledByShowOneNewDialog==true then not show other dial");
return;
@@ -334,11 +395,12 @@ void CopyEngine::errorOnFile(QFileInfo fileInfo,std::string errorString,Transfer
}
/// \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)
+void CopyEngine::folderAlreadyExists(INTERNALTYPEPATH source,INTERNALTYPEPATH destination,bool isSame,ScanFileOrFolder * thread,bool isCalledByShowOneNewDialog)
{
if(stopIt)
return;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"folder already exists: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"folder already exists: "+TransferThread::internalStringTostring(source)+
+ ", destination: "+TransferThread::internalStringTostring(destination));
if(thread==NULL)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to locate the thread");
@@ -367,7 +429,7 @@ void CopyEngine::folderAlreadyExists(QFileInfo source,QFileInfo destination,bool
}
dialogIsOpen=true;
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
- FolderExistsDialog dialog(interface,source,isSame,destination,firstRenamingRule,otherRenamingRule);
+ FolderExistsDialog dialog(uiinterface,source,isSame,destination,firstRenamingRule,otherRenamingRule);
dialog.exec();/// \bug crash when external close
FolderExistsAction newAction=dialog.getAction();
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+std::to_string(newAction));
@@ -384,7 +446,12 @@ void CopyEngine::folderAlreadyExists(QFileInfo source,QFileInfo destination,bool
thread->setFolderExistsAction(newAction);
dialogIsOpen=false;
if(!isCalledByShowOneNewDialog)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit queryOneNewDialog()");
emit queryOneNewDialog();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"NOT emit queryOneNewDialog(), !isCalledByShowOneNewDialog");
return;
break;
}
@@ -392,11 +459,11 @@ void CopyEngine::folderAlreadyExists(QFileInfo source,QFileInfo destination,bool
/// \note Can be call without queue because all call will be serialized
/// \todo all this part
-void CopyEngine::errorOnFolder(QFileInfo fileInfo, std::string errorString, ScanFileOrFolder * thread, ErrorType errorType, bool isCalledByShowOneNewDialog)
+void CopyEngine::errorOnFolder(INTERNALTYPEPATH fileInfo, std::string errorString, ScanFileOrFolder * thread, ErrorType errorType, bool isCalledByShowOneNewDialog)
{
if(stopIt)
return;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+fileInfo.absoluteFilePath().toStdString()+", error: "+errorString);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+TransferThread::internalStringTostring(fileInfo)+", error: "+errorString);
if(thread==NULL)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to locate the thread");
@@ -426,9 +493,44 @@ void CopyEngine::errorOnFolder(QFileInfo fileInfo, std::string errorString, Scan
return;
}
dialogIsOpen=true;
+
+ uint64_t size=0;
+ uint64_t mdate=0;
+ #ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA sourceW;
+ if(GetFileAttributesExW(fileInfo.c_str(),GetFileExInfoStandard,&sourceW))
+ {
+ mdate=sourceW.ftLastWriteTime.dwHighDateTime;
+ mdate<<=32;
+ mdate|=sourceW.ftLastWriteTime.dwLowDateTime;
+ size=sourceW.nFileSizeHigh;
+ size<<=32;
+ size|=sourceW.nFileSizeLow;
+ }
+ #else
+ struct stat source_statbuf;
+ #ifdef Q_OS_UNIX
+ if(lstat(TransferThread::internalStringTostring(fileInfo).c_str(), &source_statbuf)==0)
+ #else
+ if(stat(TransferThread::internalStringTostring(fileInfo).c_str(), &source_statbuf)==0)
+ #endif
+ {
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_MAC
+ mdate=source_statbuf.st_mtimespec.tv_sec;
+ #else
+ mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtim);
+ #endif
+ #else
+ mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtime);
+ #endif
+ size=source_statbuf.st_size;
+ }
+ #endif
+
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
- emit error(fileInfo.absoluteFilePath().toStdString(),fileInfo.size(),fileInfo.lastModified().toMSecsSinceEpoch()/1000,errorString);
- FileErrorDialog dialog(interface,fileInfo,errorString,errorType);
+ emit error(TransferThread::internalStringTostring(fileInfo),size,mdate,errorString);
+ FileErrorDialog dialog(uiinterface,fileInfo,errorString,errorType,facilityEngine);
dialog.exec();/// \bug crash when external close
FileErrorAction newAction=dialog.getAction();
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+std::to_string(newAction));
@@ -445,7 +547,12 @@ void CopyEngine::errorOnFolder(QFileInfo fileInfo, std::string errorString, Scan
dialogIsOpen=false;
thread->setFolderErrorAction(newAction);
if(!isCalledByShowOneNewDialog)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit queryOneNewDialog()");
emit queryOneNewDialog();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"NOT emit queryOneNewDialog(), !isCalledByShowOneNewDialog");
return;
break;
}
@@ -455,11 +562,11 @@ void CopyEngine::errorOnFolder(QFileInfo fileInfo, std::string errorString, Scan
// -----------------------------------------------------
//mkpath event
-void CopyEngine::mkPathErrorOnFolder(QFileInfo folder,std::string errorString,const ErrorType &errorType,bool isCalledByShowOneNewDialog)
+void CopyEngine::mkPathErrorOnFolder(INTERNALTYPEPATH folder, std::string errorString, const ErrorType &errorType, bool isCalledByShowOneNewDialog)
{
if(stopIt)
return;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+folder.absoluteFilePath().toStdString()+", error: "+errorString);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"file have error: "+TransferThread::internalStringTostring(folder)+", error: "+errorString);
//load the always action
FileErrorAction tempFileErrorAction=alwaysDoThisActionForFolderError;
switch(tempFileErrorAction)
@@ -486,8 +593,43 @@ void CopyEngine::mkPathErrorOnFolder(QFileInfo folder,std::string errorString,co
}
dialogIsOpen=true;
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"show dialog");
- emit error(folder.absoluteFilePath().toStdString(),folder.size(),folder.lastModified().toMSecsSinceEpoch()/1000,errorString);
- FileErrorDialog dialog(interface,folder,errorString,errorType);
+
+ uint64_t size=0;
+ uint64_t mdate=0;
+ #ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA sourceW;
+ if(GetFileAttributesExW(folder.c_str(),GetFileExInfoStandard,&sourceW))
+ {
+ mdate=sourceW.ftLastWriteTime.dwHighDateTime;
+ mdate<<=32;
+ mdate|=sourceW.ftLastWriteTime.dwLowDateTime;
+ size=sourceW.nFileSizeHigh;
+ size<<=32;
+ size|=sourceW.nFileSizeLow;
+ }
+ #else
+ struct stat source_statbuf;
+ #ifdef Q_OS_UNIX
+ if(lstat(TransferThread::internalStringTostring(folder).c_str(), &source_statbuf)==0)
+ #else
+ if(stat(TransferThread::internalStringTostring(folder).c_str(), &source_statbuf)==0)
+ #endif
+ {
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_MAC
+ mdate=source_statbuf.st_mtimespec.tv_sec;
+ #else
+ mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtim);
+ #endif
+ #else
+ mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtime);
+ #endif
+ size=source_statbuf.st_size;
+ }
+ #endif
+
+ emit error(TransferThread::internalStringTostring(folder),size,mdate,errorString);
+ FileErrorDialog dialog(uiinterface,folder,errorString,errorType,facilityEngine);
dialog.exec();/// \bug crash when external close
FileErrorAction newAction=dialog.getAction();
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"close dialog: "+std::to_string(newAction));
@@ -515,7 +657,12 @@ void CopyEngine::mkPathErrorOnFolder(QFileInfo folder,std::string errorString,co
break;
}
if(!isCalledByShowOneNewDialog)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit queryOneNewDialog()");
emit queryOneNewDialog();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"NOT emit queryOneNewDialog(), !isCalledByShowOneNewDialog");
return;
break;
}
@@ -529,6 +676,8 @@ void CopyEngine::showOneNewDialog()
return;
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"alreadyExistsQueue.size(): "+std::to_string(alreadyExistsQueue.size()));
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"errorQueue.size(): "+std::to_string(errorQueue.size()));
+ //reset to always show the dialog
+ dialogIsOpen=false;
int loop_size=alreadyExistsQueue.size();
while(loop_size>0)
{
@@ -565,4 +714,6 @@ void CopyEngine::showOneNewDialog()
errorQueue.erase(errorQueue.cbegin());
loop_size--;
}
+ //no more to show then reset
+ dialogIsOpen=false;
}
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngine.cpp b/plugins/CopyEngine/Ultracopier-Spec/CopyEngine.cpp
index f3d6e04..8ec21e1 100644..100755
--- a/plugins/CopyEngine/Ultracopier/CopyEngine.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/CopyEngine.cpp
@@ -18,22 +18,51 @@ inline double round(double d) {
#endif
CopyEngine::CopyEngine(FacilityInterface * facilityEngine) :
- ui(new Ui::copyEngineOptions())
+ listThread(NULL),
+ tempWidget(NULL),
+ ui(new Ui::copyEngineOptions()),
+ uiIsInstalled(false),
+ uiinterface(NULL),
+ filters(NULL),
+ renamingRules(NULL),
+ facilityEngine(NULL),
+ doRightTransfer(false),
+ keepDate(false),
+ followTheStrictOrder(false),
+ deletePartiallyTransferredFiles(false),
+ inodeThreads(0),
+ renameTheOriginalDestination(false),
+ moveTheWholeFolder(false),
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ rsync(false),
+ #endif
+ checkDestinationFolderExists(false),
+ mkFullPath(false),
+ checksum(false),
+ alwaysDoThisActionForFileExists(FileExistsAction::FileExists_NotSet),
+ alwaysDoThisActionForFileError(FileErrorAction::FileError_NotSet),
+ alwaysDoThisActionForFolderError(FileErrorAction::FileError_NotSet),
+ alwaysDoThisActionForFolderExists(FolderExistsAction::FolderExists_NotSet),
+ dialogIsOpen(false),
+ stopIt(false),
+ size_for_speed(0),
+ mode(Ultracopier::CopyMode::Copy),
+ forcedMode(false),
+ checkDiskSpace(false),
+ osBufferLimit(0),
+ errorPutAtEnd(0),
+ putAtBottom(0)
{
listThread=new ListThread(facilityEngine);
this->facilityEngine = facilityEngine;
filters = NULL;
renamingRules = NULL;
- blockSize = ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE;
- sequentialBuffer = ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*ULTRACOPIER_PLUGIN_DEFAULT_SEQUENTIAL_NUMBER_OF_BLOCK;
- parallelBuffer = ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
- interface = NULL;
+ uiinterface = NULL;
tempWidget = NULL;
uiIsInstalled = false;
dialogIsOpen = false;
renameTheOriginalDestination = false;
- maxSpeed = 0;
alwaysDoThisActionForFileExists = FileExists_NotSet;
alwaysDoThisActionForFileError = FileError_NotSet;
checkDestinationFolderExists = false;
@@ -72,15 +101,16 @@ void CopyEngine::connectTheSignalsSlots()
{
#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
debugDialogWindow.show();
+ debugDialogWindow.copyEngine=this;
#endif
+ if(!connect(listThread,&ListThread::isInPause, this,&CopyEngine::isInPause, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect isInPause()");
if(!connect(listThread,&ListThread::actionInProgess, this,&CopyEngine::actionInProgess, Qt::QueuedConnection))
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect actionInProgess()");
if(!connect(listThread,&ListThread::actionInProgess, this,&CopyEngine::newActionInProgess, Qt::QueuedConnection))
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect actionInProgess() to slot");
if(!connect(listThread,&ListThread::newFolderListing, this,&CopyEngine::newFolderListing, Qt::QueuedConnection))
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect newFolderListing()");
- if(!connect(listThread,&ListThread::isInPause, this,&CopyEngine::isInPause, Qt::QueuedConnection))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect isInPause()");
if(!connect(listThread,&ListThread::error, this,&CopyEngine::error, Qt::QueuedConnection))
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect error()");
if(!connect(listThread,&ListThread::rmPath, this,&CopyEngine::rmPath, Qt::QueuedConnection))
@@ -135,6 +165,8 @@ void CopyEngine::connectTheSignalsSlots()
if(!connect(this,&CopyEngine::signal_pause, listThread,&ListThread::pause, Qt::QueuedConnection))
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_pause()");
+ if(!connect(this,&CopyEngine::signal_setSpeedLimitation, listThread,&ListThread::setSpeedLimitation, Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect setSpeedLimitation()");
if(!connect(this,&CopyEngine::signal_exportErrorIntoTransferList,listThread,&ListThread::exportErrorIntoTransferList, Qt::QueuedConnection))
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_exportErrorIntoTransferList()");
if(!connect(this,&CopyEngine::signal_resume, listThread,&ListThread::resume, Qt::QueuedConnection))
@@ -143,8 +175,6 @@ void CopyEngine::connectTheSignalsSlots()
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_skip()");
if(!connect(this,&CopyEngine::signal_setCollisionAction, listThread,&ListThread::setAlwaysFileExistsAction, Qt::QueuedConnection))
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_setCollisionAction()");
- if(!connect(this,&CopyEngine::signal_setTransferAlgorithm, listThread,&ListThread::setTransferAlgorithm, Qt::QueuedConnection))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_setCollisionAction()");
if(!connect(this,&CopyEngine::signal_setFolderCollision, listThread,&ListThread::setFolderCollision, Qt::QueuedConnection))
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_setFolderCollision()");
if(!connect(this,&CopyEngine::signal_removeItems, listThread,&ListThread::removeItems, Qt::QueuedConnection))
@@ -163,20 +193,6 @@ void CopyEngine::connectTheSignalsSlots()
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_importTransferList()");
if(!connect(this,&CopyEngine::signal_forceMode, listThread,&ListThread::forceMode, Qt::QueuedConnection))
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect signal_forceMode()");
- if(!connect(this,&CopyEngine::send_osBufferLimit, listThread,&ListThread::set_osBufferLimit, Qt::QueuedConnection))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_osBufferLimit()");
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- if(!connect(this,&CopyEngine::send_speedLimitation, listThread,&ListThread::setSpeedLimitation, Qt::QueuedConnection))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_speedLimitation()");
- #endif
- if(!connect(this,&CopyEngine::send_blockSize, listThread,&ListThread::setBlockSize, Qt::QueuedConnection))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect send_blockSize()");
- if(!connect(this,&CopyEngine::send_parallelBuffer, listThread,&ListThread::setParallelBuffer, Qt::QueuedConnection))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect setParallelBuffer()");
- if(!connect(this,&CopyEngine::send_sequentialBuffer, listThread,&ListThread::setSequentialBuffer, Qt::QueuedConnection))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect setSequentialBuffer()");
- if(!connect(this,&CopyEngine::send_parallelizeIfSmallerThan, listThread,&ListThread::setParallelizeIfSmallerThan, Qt::QueuedConnection))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect setParallelizeIfSmallerThan()");
if(!connect(this,&CopyEngine::send_moveTheWholeFolder, listThread,&ListThread::setMoveTheWholeFolder, Qt::QueuedConnection))
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect moveTheWholeFolder()");
if(!connect(this,&CopyEngine::send_deletePartiallyTransferredFiles, listThread,&ListThread::setDeletePartiallyTransferredFiles, Qt::QueuedConnection))
@@ -222,37 +238,25 @@ bool CopyEngine::getOptionsEngine(QWidget * tempWidget)
this->tempWidget=tempWidget;
ui->setupUi(tempWidget);
ui->toolBox->setCurrentIndex(0);
- ui->blockSize->setMaximum(ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE);
connect(tempWidget, &QWidget::destroyed, this, &CopyEngine::resetTempWidget);
- //conect the ui widget
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- if(!setSpeedLimitation(maxSpeed))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the speed limitation");
- #endif
//here else, the default settings can't be loaded
uiIsInstalled=true;
- setBlockSize(blockSize);
- setSequentialBuffer(sequentialBuffer);
- setParallelBuffer(parallelBuffer);
- setAutoStart(autoStart);
#ifdef ULTRACOPIER_PLUGIN_RSYNC
setRsync(rsync);
#else
ui->label_rsync->setVisible(false);
ui->rsync->setVisible(false);
#endif
+ setAutoStart(autoStart);
setCheckDestinationFolderExists(checkDestinationFolderExists);
- set_doChecksum(doChecksum);
- set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
- set_checksumOnlyOnError(checksumOnlyOnError);
- set_osBuffer(osBuffer);
- set_osBufferLimited(osBufferLimited);
- set_osBufferLimit(osBufferLimit);
+ setMkFullPath(mkFullPath);
+ setChecksum(checksum);
setRightTransfer(doRightTransfer);
setKeepDate(keepDate);
- setParallelizeIfSmallerThan(parallelizeIfSmallerThan);
+ setOsSpecFlags(os_spec_flags);
+ setNativeCopy(native_copy);
setFollowTheStrictOrder(followTheStrictOrder);
setDeletePartiallyTransferredFiles(deletePartiallyTransferredFiles);
setInodeThreads(inodeThreads);
@@ -272,7 +276,7 @@ bool CopyEngine::getOptionsEngine(QWidget * tempWidget)
case FileExists_Overwrite:
ui->comboBoxFileCollision->setCurrentIndex(2);
break;
- case FileExists_OverwriteIfNotSame:
+ case FileExists_OverwriteIfNotSameMdate:
ui->comboBoxFileCollision->setCurrentIndex(3);
break;
case FileExists_OverwriteIfNewer:
@@ -284,6 +288,12 @@ bool CopyEngine::getOptionsEngine(QWidget * tempWidget)
case FileExists_Rename:
ui->comboBoxFileCollision->setCurrentIndex(6);
break;
+ case FileExists_OverwriteIfNotSameSize:
+ ui->comboBoxFileCollision->setCurrentIndex(6);
+ break;
+ case FileExists_OverwriteIfNotSameSizeAndDate:
+ ui->comboBoxFileCollision->setCurrentIndex(6);
+ break;
default:
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
ui->comboBoxFileCollision->setCurrentIndex(0);
@@ -337,48 +347,31 @@ bool CopyEngine::getOptionsEngine(QWidget * tempWidget)
ui->comboBoxFolderError->setCurrentIndex(0);
break;
}
- switch(transferAlgorithm)
- {
- case TransferAlgorithm_Automatic:
- ui->transferAlgorithm->setCurrentIndex(0);
- break;
- case TransferAlgorithm_Sequential:
- ui->transferAlgorithm->setCurrentIndex(1);
- break;
- case TransferAlgorithm_Parallel:
- ui->transferAlgorithm->setCurrentIndex(2);
- break;
- default:
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
- ui->transferAlgorithm->setCurrentIndex(0);
- break;
- }
return true;
}
//to have interface widget to do modal dialog
-void CopyEngine::setInterfacePointer(QWidget * interface)
+void CopyEngine::setInterfacePointer(QWidget * uiinterface)
{
- this->interface=interface;
- filters=new Filters(tempWidget);
- renamingRules=new RenamingRules(tempWidget);
+ this->uiinterface=uiinterface;
+ if(filters==NULL)
+ filters=new Filters(tempWidget);
+ if(renamingRules==NULL)
+ renamingRules=new RenamingRules(tempWidget);
if(uiIsInstalled)
{
+ connect(ui->autoStart, &QCheckBox::toggled, this,&CopyEngine::setAutoStart);
connect(ui->doRightTransfer, &QCheckBox::toggled, this,&CopyEngine::setRightTransfer);
connect(ui->keepDate, &QCheckBox::toggled, this,&CopyEngine::setKeepDate);
- connect(ui->blockSize, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngine::setBlockSize);
- connect(ui->autoStart, &QCheckBox::toggled, this,&CopyEngine::setAutoStart);
- connect(ui->doChecksum, &QCheckBox::toggled, this,&CopyEngine::doChecksum_toggled);
- connect(ui->checksumIgnoreIfImpossible, &QCheckBox::toggled, this,&CopyEngine::checksumIgnoreIfImpossible_toggled);
- connect(ui->checksumOnlyOnError, &QCheckBox::toggled, this,&CopyEngine::checksumOnlyOnError_toggled);
- connect(ui->osBuffer, &QCheckBox::toggled, this,&CopyEngine::osBuffer_toggled);
- connect(ui->osBufferLimited, &QCheckBox::toggled, this,&CopyEngine::osBufferLimited_toggled);
- connect(ui->osBufferLimit, &QSpinBox::editingFinished, this,&CopyEngine::osBufferLimit_editingFinished);
+ connect(ui->os_spec_flags, &QCheckBox::toggled, this,&CopyEngine::setOsSpecFlags);
+ connect(ui->native_copy, &QCheckBox::toggled, this,&CopyEngine::setNativeCopy);
connect(ui->moveTheWholeFolder, &QCheckBox::toggled, this,&CopyEngine::setMoveTheWholeFolder);
connect(ui->deletePartiallyTransferredFiles, &QCheckBox::toggled, this,&CopyEngine::setDeletePartiallyTransferredFiles);
connect(ui->followTheStrictOrder, &QCheckBox::toggled, this,&CopyEngine::setFollowTheStrictOrder);
connect(ui->checkBoxDestinationFolderExists, &QCheckBox::toggled, this,&CopyEngine::setCheckDestinationFolderExists);
+ connect(ui->mkpath, &QCheckBox::toggled, this,&CopyEngine::setMkFullPath);
+ connect(ui->checksum, &QCheckBox::toggled, this,&CopyEngine::setChecksum);
#ifdef ULTRACOPIER_PLUGIN_RSYNC
connect(ui->rsync, &QCheckBox::toggled, this,&CopyEngine::setRsync);
#endif
@@ -389,14 +382,10 @@ void CopyEngine::setInterfacePointer(QWidget * interface)
connect(ui->inodeThreads, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngine::setInodeThreads);
connect(ui->defaultDestinationFolderBrowse, &QPushButton::clicked, this,&CopyEngine::defaultDestinationFolderBrowse);
- connect(ui->sequentialBuffer, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngine::setSequentialBuffer);
- connect(ui->parallelBuffer, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngine::setParallelBuffer);
- connect(ui->parallelizeIfSmallerThan, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngine::setParallelizeIfSmallerThan);
connect(ui->comboBoxFolderError, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngine::setFolderError);
connect(ui->comboBoxFolderCollision, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngine::setFolderCollision);
connect(ui->comboBoxFileError, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngine::setFileError);
connect(ui->comboBoxFileCollision, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngine::setFileCollision);
- connect(ui->transferAlgorithm, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngine::setTransferAlgorithm);
if(!connect(renamingRules,&RenamingRules::sendNewRenamingRules,this,&CopyEngine::sendNewRenamingRules))
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect sendNewRenamingRules()");
@@ -404,8 +393,14 @@ void CopyEngine::setInterfacePointer(QWidget * interface)
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to connect renamingRules.clicked()");
}
- filters->setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
- set_setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+ if(!filters->setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions))
+ {
+ includeStrings.clear();
+ includeOptions.clear();
+ excludeStrings.clear();
+ excludeOptions.clear();
+ set_setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+ }
renamingRules->setRenamingRules(firstRenamingRule,otherRenamingRule);
emit send_sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
@@ -421,8 +416,22 @@ bool CopyEngine::haveSameDestination(const std::string &destination)
return listThread->haveSameDestination(destination);
}
+std::string CopyEngine::stringimplode(const std::vector<std::string>& elems, const std::string &delim)
+{
+ std::string newString;
+ for (std::vector<std::string>::const_iterator ii = elems.begin(); ii != elems.cend(); ++ii)
+ {
+ newString += (*ii);
+ if ( ii + 1 != elems.end() ) {
+ newString += delim;
+ }
+ }
+ return newString;
+}
+
bool CopyEngine::newCopy(const std::vector<std::string> &sources)
{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,stringimplode(sources,", "));
if(forcedMode && mode!=Ultracopier::Copy)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to move, you can't copy with it");
@@ -445,6 +454,7 @@ bool CopyEngine::newCopy(const std::vector<std::string> &sources)
bool CopyEngine::newCopy(const std::vector<std::string> &sources,const std::string &destination)
{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,stringimplode(sources,", ")+" "+destination);
if(forcedMode && mode!=Ultracopier::Copy)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to move, you can't copy with it");
@@ -456,6 +466,7 @@ bool CopyEngine::newCopy(const std::vector<std::string> &sources,const std::stri
bool CopyEngine::newMove(const std::vector<std::string> &sources)
{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,stringimplode(sources,", "));
if(forcedMode && mode!=Ultracopier::Move)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to copy, you can't move with it");
@@ -478,6 +489,7 @@ bool CopyEngine::newMove(const std::vector<std::string> &sources)
bool CopyEngine::newMove(const std::vector<std::string> &sources,const std::string &destination)
{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,stringimplode(sources,", ")+" "+destination);
if(forcedMode && mode!=Ultracopier::Move)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The engine is forced to copy, you can't move with it");
@@ -505,13 +517,13 @@ std::string CopyEngine::askDestination()
std::string destination = listThread->getUniqueDestinationFolder();
if(!destination.empty())
{
- QMessageBox::StandardButton button=QMessageBox::question(interface,tr("Destination"),tr("Use the actual destination \"%1\"?")
+ QMessageBox::StandardButton button=QMessageBox::question(uiinterface,tr("Destination"),tr("Use the actual destination \"%1\"?")
.arg(QString::fromStdString(destination)),
QMessageBox::Yes | QMessageBox::No,QMessageBox::Yes);
if(button==QMessageBox::Yes)
return destination;
}
- destination=QFileDialog::getExistingDirectory(interface,QString::fromStdString(facilityEngine->translateText("Select destination directory")),QStringLiteral(""),QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks).toStdString();
+ destination=QFileDialog::getExistingDirectory(uiinterface,QString::fromStdString(facilityEngine->translateText("Select destination directory")),QStringLiteral(""),QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks).toStdString();
return destination;
}
@@ -529,11 +541,7 @@ uint64_t CopyEngine::realByteTransfered()
//speed limitation
bool CopyEngine::supportSpeedLimitation() const
{
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
return true;
- #else
- return false;
- #endif
}
/** \brief to sync the transfer list
@@ -543,76 +551,21 @@ void CopyEngine::syncTransferList()
listThread->syncTransferList();
}
-void CopyEngine::set_doChecksum(bool doChecksum)
-{
- listThread->set_doChecksum(doChecksum);
- if(uiIsInstalled)
- {
- ui->doChecksum->setChecked(doChecksum);
- ui->checksumOnlyOnError->setEnabled(ui->doChecksum->isChecked());
- ui->checksumIgnoreIfImpossible->setEnabled(ui->doChecksum->isChecked());
- }
- this->doChecksum=doChecksum;
-}
-
-void CopyEngine::set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible)
-{
- listThread->set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
- if(uiIsInstalled)
- ui->checksumIgnoreIfImpossible->setChecked(checksumIgnoreIfImpossible);
- this->checksumIgnoreIfImpossible=checksumIgnoreIfImpossible;
-}
-
-void CopyEngine::set_checksumOnlyOnError(bool checksumOnlyOnError)
-{
- listThread->set_checksumOnlyOnError(checksumOnlyOnError);
- if(uiIsInstalled)
- ui->checksumOnlyOnError->setChecked(checksumOnlyOnError);
- this->checksumOnlyOnError=checksumOnlyOnError;
-}
-
-void CopyEngine::set_osBuffer(bool osBuffer)
-{
- listThread->set_osBuffer(osBuffer);
- if(uiIsInstalled)
- {
- ui->osBuffer->setChecked(osBuffer);
- updateBufferCheckbox();
- }
- this->osBuffer=osBuffer;
-}
-
-void CopyEngine::set_osBufferLimited(bool osBufferLimited)
-{
- listThread->set_osBufferLimited(osBufferLimited);
- if(uiIsInstalled)
- {
- ui->osBufferLimited->setChecked(osBufferLimited);
- updateBufferCheckbox();
- }
- this->osBufferLimited=osBufferLimited;
-}
-
-void CopyEngine::set_osBufferLimit(unsigned int osBufferLimit)
-{
- emit send_osBufferLimit(osBufferLimit);
- if(uiIsInstalled)
- ui->osBufferLimit->setValue(osBufferLimit);
- this->osBufferLimit=osBufferLimit;
-}
-
-void CopyEngine::updateBufferCheckbox()
-{
- ui->osBufferLimited->setEnabled(ui->osBuffer->isChecked());
- ui->osBufferLimit->setEnabled(ui->osBuffer->isChecked() && ui->osBufferLimited->isChecked());
-}
-
void CopyEngine::set_setFilters(std::vector<std::string> includeStrings,std::vector<std::string> includeOptions,std::vector<std::string> excludeStrings,std::vector<std::string> excludeOptions)
{
+ if(filters==NULL)
+ filters=new Filters();
if(filters!=NULL)
{
- filters->setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+ if(!filters->setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions))
+ {
+ includeStrings.clear();
+ includeOptions.clear();
+ excludeStrings.clear();
+ excludeOptions.clear();
+ }
emit send_setFilters(filters->getInclude(),filters->getExclude());
+ listThread->set_setFilters(filters->getInclude(),filters->getExclude());
}
this->includeStrings=includeStrings;
this->includeOptions=includeOptions;
@@ -627,7 +580,7 @@ void CopyEngine::setRenamingRules(std::string firstRenamingRule,std::string othe
bool CopyEngine::userAddFolder(const Ultracopier::CopyMode &mode)
{
- std::string source = QFileDialog::getExistingDirectory(interface,QString::fromStdString(facilityEngine->translateText("Select source directory")),
+ std::string source = QFileDialog::getExistingDirectory(uiinterface,QString::fromStdString(facilityEngine->translateText("Select source directory")),
QStringLiteral(""),
QFileDialog::ShowDirsOnly | QFileDialog::DontResolveSymlinks).toStdString();
if(source.empty() || source=="")
@@ -644,7 +597,7 @@ bool CopyEngine::userAddFile(const Ultracopier::CopyMode &mode)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
QStringList sources = QFileDialog::getOpenFileNames(
- interface,
+ uiinterface,
QString::fromStdString(facilityEngine->translateText("Select one or more files to open")),
QStringLiteral(""),
QString::fromStdString(facilityEngine->translateText("All files"))+QStringLiteral(" (*)"));
@@ -751,7 +704,7 @@ void CopyEngine::forceMode(const Ultracopier::CopyMode &mode)
void CopyEngine::exportTransferList()
{
- std::string fileName = QFileDialog::getSaveFileName(interface,QString::fromStdString(facilityEngine->translateText("Save transfer list")),QStringLiteral("transfer-list.lst"),QString::fromStdString(facilityEngine->translateText("Transfer list"))+QStringLiteral(" (*.lst)")).toStdString();
+ std::string fileName = QFileDialog::getSaveFileName(uiinterface,QString::fromStdString(facilityEngine->translateText("Save transfer list")),QStringLiteral("transfer-list.lst"),QString::fromStdString(facilityEngine->translateText("Transfer list"))+QStringLiteral(" (*.lst)")).toStdString();
if(fileName.empty())
return;
emit signal_exportTransferList(fileName);
@@ -759,7 +712,7 @@ void CopyEngine::exportTransferList()
void CopyEngine::importTransferList()
{
- std::string fileName = QFileDialog::getOpenFileName(interface,QString::fromStdString(facilityEngine->translateText("Open transfer list")),QStringLiteral("transfer-list.lst"),QString::fromStdString(facilityEngine->translateText("Transfer list"))+QStringLiteral(" (*.lst)")).toStdString();
+ std::string fileName = QFileDialog::getOpenFileName(uiinterface,QString::fromStdString(facilityEngine->translateText("Open transfer list")),QStringLiteral("transfer-list.lst"),QString::fromStdString(facilityEngine->translateText("Transfer list"))+QStringLiteral(" (*.lst)")).toStdString();
if(fileName.empty())
return;
emit signal_importTransferList(fileName);
@@ -767,20 +720,19 @@ void CopyEngine::importTransferList()
void CopyEngine::warningTransferList(const std::string &warning)
{
- QMessageBox::warning(interface,QString::fromStdString(facilityEngine->translateText("Error")),QString::fromStdString(warning));
+ QMessageBox::warning(uiinterface,QString::fromStdString(facilityEngine->translateText("Error")),QString::fromStdString(warning));
}
void CopyEngine::errorTransferList(const std::string &error)
{
- QMessageBox::critical(interface,QString::fromStdString(facilityEngine->translateText("Error")),QString::fromStdString(error));
+ QMessageBox::critical(uiinterface,QString::fromStdString(facilityEngine->translateText("Error")),QString::fromStdString(error));
}
bool CopyEngine::setSpeedLimitation(const int64_t &speedLimitation)
{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"maxSpeed: "+std::to_string(speedLimitation));
- maxSpeed=speedLimitation;
- emit send_speedLimitation(speedLimitation);
- return true;
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"maxSpeed: "+std::to_string(speedLimitation));
+ emit signal_setSpeedLimitation(speedLimitation);
+ return false;
}
void CopyEngine::setFileCollision(int index)
@@ -801,7 +753,7 @@ void CopyEngine::setFileCollision(int index)
alwaysDoThisActionForFileExists=FileExists_Overwrite;
break;
case 3:
- alwaysDoThisActionForFileExists=FileExists_OverwriteIfNotSame;
+ alwaysDoThisActionForFileExists=FileExists_OverwriteIfNotSameMdate;
break;
case 4:
alwaysDoThisActionForFileExists=FileExists_OverwriteIfNewer;
@@ -842,38 +794,7 @@ void CopyEngine::setFileError(int index)
alwaysDoThisActionForFileError=FileError_NotSet;
break;
}
- emit signal_setCollisionAction(alwaysDoThisActionForFileExists);
-}
-
-void CopyEngine::setTransferAlgorithm(int index)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action index: "+std::to_string(index));
- if(uiIsInstalled)
- if(index!=ui->transferAlgorithm->currentIndex())
- ui->transferAlgorithm->setCurrentIndex(index);
- switch(index)
- {
- case 0:
- transferAlgorithm=TransferAlgorithm_Automatic;
- break;
- case 1:
- transferAlgorithm=TransferAlgorithm_Sequential;
- break;
- case 2:
- transferAlgorithm=TransferAlgorithm_Parallel;
- break;
- default:
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Error, unknow index, ignored");
- transferAlgorithm=TransferAlgorithm_Automatic;
- break;
- }
- if(transferAlgorithm==TransferAlgorithm_Sequential)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Sequential");
- else if(transferAlgorithm==TransferAlgorithm_Automatic)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Automatic");
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Parallel");
- emit signal_setTransferAlgorithm(transferAlgorithm);
+ //emit signal_setCollisionAction(alwaysDoThisActionForFileExists);
}
void CopyEngine::setRightTransfer(const bool doRightTransfer)
@@ -893,44 +814,20 @@ void CopyEngine::setKeepDate(const bool keepDate)
listThread->setKeepDate(keepDate);
}
-//set block size in KB
-void CopyEngine::setBlockSize(const int blockSize)
+void CopyEngine::setOsSpecFlags(const bool os_spec_flags)
{
- this->blockSize=blockSize;
+ this->os_spec_flags=os_spec_flags;
if(uiIsInstalled)
- {
- ui->blockSize->setValue(blockSize);
- ui->sequentialBuffer->setSingleStep(blockSize);
- ui->parallelBuffer->setSingleStep(blockSize);
- }
- emit send_blockSize(blockSize);
- updatedBlockSize();
+ ui->os_spec_flags->setChecked(os_spec_flags);
+ listThread->setOsSpecFlags(os_spec_flags);
}
-void CopyEngine::setParallelBuffer(int parallelBuffer)
+void CopyEngine::setNativeCopy(const bool native_copy)
{
- parallelBuffer=round((float)parallelBuffer/(float)blockSize)*blockSize;
- this->parallelBuffer=parallelBuffer;
+ this->native_copy=native_copy;
if(uiIsInstalled)
- ui->parallelBuffer->setValue(parallelBuffer);
- emit send_parallelBuffer(parallelBuffer/blockSize);
-}
-
-void CopyEngine::setSequentialBuffer(int sequentialBuffer)
-{
- sequentialBuffer=round((float)sequentialBuffer/(float)blockSize)*blockSize;
- this->sequentialBuffer=sequentialBuffer;
- if(uiIsInstalled)
- ui->sequentialBuffer->setValue(sequentialBuffer);
- emit send_sequentialBuffer(sequentialBuffer/blockSize);
-}
-
-void CopyEngine::setParallelizeIfSmallerThan(int parallelizeIfSmallerThan)
-{
- this->parallelizeIfSmallerThan=parallelizeIfSmallerThan;
- if(uiIsInstalled)
- ui->parallelizeIfSmallerThan->setValue(parallelizeIfSmallerThan);
- emit send_parallelizeIfSmallerThan(parallelizeIfSmallerThan*1024);
+ ui->native_copy->setChecked(native_copy);
+ listThread->setNativeCopy(native_copy);
}
void CopyEngine::setMoveTheWholeFolder(const bool &moveTheWholeFolder)
@@ -946,6 +843,7 @@ void CopyEngine::setFollowTheStrictOrder(const bool &followTheStrictOrder)
this->followTheStrictOrder=followTheStrictOrder;
if(uiIsInstalled)
ui->followTheStrictOrder->setChecked(followTheStrictOrder);
+ listThread->setFollowTheStrictOrder(followTheStrictOrder);
emit send_followTheStrictOrder(followTheStrictOrder);
}
@@ -979,15 +877,6 @@ void CopyEngine::inodeThreadsFinished()
emit send_setInodeThreads(inodeThreads);
}
-//set auto start
-void CopyEngine::setAutoStart(const bool autoStart)
-{
- this->autoStart=autoStart;
- if(uiIsInstalled)
- ui->autoStart->setChecked(autoStart);
- listThread->setAutoStart(autoStart);
-}
-
#ifdef ULTRACOPIER_PLUGIN_RSYNC
/// \brief set rsync
void CopyEngine::setRsync(const bool rsync)
@@ -1013,6 +902,21 @@ void CopyEngine::setCheckDestinationFolderExists(const bool checkDestinationFold
listThread->setCheckDestinationFolderExists(checkDestinationFolderExists);
}
+void CopyEngine::setMkFullPath(const bool mkFullPath)
+{
+ this->mkFullPath=mkFullPath;
+ if(uiIsInstalled)
+ ui->mkpath->setChecked(mkFullPath);
+ listThread->setMkFullPath(mkFullPath);
+}
+
+void CopyEngine::setChecksum(const bool checksum)
+{
+ this->checksum=checksum;
+ if(uiIsInstalled)
+ ui->checksum->setChecked(checksum);
+}
+
//reset widget
void CopyEngine::resetTempWidget()
{
@@ -1022,6 +926,10 @@ void CopyEngine::resetTempWidget()
void CopyEngine::setFolderCollision(int index)
{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action index: "+std::to_string(index));
+ if(uiIsInstalled)
+ if(index!=ui->comboBoxFolderCollision->currentIndex())
+ ui->comboBoxFolderCollision->setCurrentIndex(index);
switch(index)
{
case 0:
@@ -1037,10 +945,15 @@ void CopyEngine::setFolderCollision(int index)
setComboBoxFolderCollision(FolderExists_Rename,false);
break;
}
+ emit signal_setFolderCollision(alwaysDoThisActionForFolderExists);
}
void CopyEngine::setFolderError(int index)
{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action index: "+std::to_string(index));
+ if(uiIsInstalled)
+ if(index!=ui->comboBoxFolderError->currentIndex())
+ ui->comboBoxFolderError->setCurrentIndex(index);
switch(index)
{
case 0:
@@ -1050,6 +963,7 @@ void CopyEngine::setFolderError(int index)
setComboBoxFolderError(FileError_Skip,false);
break;
}
+ emit signal_setCollisionAction(alwaysDoThisActionForFileExists);
}
//set the translate
@@ -1078,10 +992,6 @@ void CopyEngine::newLanguageLoaded()
ui->comboBoxFileCollision->setItemText(4,tr("Overwrite if newer"));
ui->comboBoxFileCollision->setItemText(5,tr("Overwrite if older"));
ui->comboBoxFileCollision->setItemText(6,tr("Rename"));
-
- ui->transferAlgorithm->setItemText(0,tr("Automatic"));
- ui->transferAlgorithm->setItemText(1,tr("Sequential"));
- ui->transferAlgorithm->setItemText(2,tr("Parallel"));
}
else
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"ui not loaded!");
@@ -1112,7 +1022,7 @@ void CopyEngine::setComboBoxFolderCollision(FolderExistsAction action,bool chang
void CopyEngine::setComboBoxFolderError(FileErrorAction action,bool changeComboBox)
{
- alwaysDoThisActionForFileError=action;
+ alwaysDoThisActionForFolderError=action;
if(!changeComboBox || !uiIsInstalled)
return;
switch(action)
@@ -1126,37 +1036,6 @@ void CopyEngine::setComboBoxFolderError(FileErrorAction action,bool changeComboB
}
}
-void CopyEngine::doChecksum_toggled(bool doChecksum)
-{
- listThread->set_doChecksum(doChecksum);
-}
-
-void CopyEngine::checksumOnlyOnError_toggled(bool checksumOnlyOnError)
-{
- listThread->set_checksumOnlyOnError(checksumOnlyOnError);
-}
-
-void CopyEngine::checksumIgnoreIfImpossible_toggled(bool checksumIgnoreIfImpossible)
-{
- listThread->set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
-}
-
-void CopyEngine::osBuffer_toggled(bool osBuffer)
-{
- listThread->set_osBuffer(osBuffer);
- updateBufferCheckbox();
-}
-
-void CopyEngine::osBufferLimited_toggled(bool osBufferLimited)
-{
- listThread->set_osBufferLimited(osBufferLimited);
- updateBufferCheckbox();
-}
-
-void CopyEngine::osBufferLimit_editingFinished()
-{
- emit send_osBufferLimit(ui->osBufferLimit->value());
-}
void CopyEngine::showFilterDialog()
{
@@ -1208,21 +1087,6 @@ void CopyEngine::newActionInProgess(Ultracopier::EngineActionInProgress action)
}
}
-void CopyEngine::updatedBlockSize()
-{
- if(uiIsInstalled)
- {
- ui->sequentialBuffer->setMinimum(ui->blockSize->value());
- ui->sequentialBuffer->setSingleStep(ui->blockSize->value());
- ui->sequentialBuffer->setMaximum(ui->blockSize->value()*ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK);
- ui->parallelBuffer->setMinimum(ui->blockSize->value());
- ui->parallelBuffer->setSingleStep(ui->blockSize->value());
- ui->parallelBuffer->setMaximum(ui->blockSize->value()*ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK);
- }
- setParallelBuffer(parallelBuffer);
- setSequentialBuffer(sequentialBuffer);
-}
-
void CopyEngine::setCheckDiskSpace(const bool &checkDiskSpace)
{
this->checkDiskSpace=checkDiskSpace;
@@ -1231,23 +1095,35 @@ void CopyEngine::setCheckDiskSpace(const bool &checkDiskSpace)
listThread->setCheckDiskSpace(checkDiskSpace);
}
-void CopyEngine::setDefaultDestinationFolder(const std::string &defaultDestinationFolder)
+void CopyEngine::setBuffer(const bool &buffer)
{
- this->defaultDestinationFolder=defaultDestinationFolder;
+ this->buffer=buffer;
if(uiIsInstalled)
- ui->defaultDestinationFolder->setText(QString::fromStdString(defaultDestinationFolder));
+ ui->buffer->setChecked(buffer);
+ listThread->setBuffer(buffer);
}
-void CopyEngine::setCopyListOrder(const bool &order)
+void CopyEngine::setDefaultDestinationFolder(const std::string &defaultDestinationFolder)
{
- listThread->setCopyListOrder(order);
+ this->defaultDestinationFolder=defaultDestinationFolder;
+ if(uiIsInstalled)
+ ui->defaultDestinationFolder->setText(QString::fromStdString(defaultDestinationFolder));
}
void CopyEngine::exportErrorIntoTransferList()
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"exportErrorIntoTransferList");
- std::string fileName = QFileDialog::getSaveFileName(interface,QString::fromStdString(facilityEngine->translateText("Save transfer list")),QStringLiteral("transfer-list.lst"),QString::fromStdString(facilityEngine->translateText("Transfer list"))+QStringLiteral(" (*.lst)")).toStdString();
+ std::string fileName = QFileDialog::getSaveFileName(uiinterface,QString::fromStdString(facilityEngine->translateText("Save transfer list")),QStringLiteral("transfer-list.lst"),QString::fromStdString(facilityEngine->translateText("Transfer list"))+QStringLiteral(" (*.lst)")).toStdString();
if(fileName.empty())
return;
emit signal_exportErrorIntoTransferList(fileName);
}
+
+//set auto start
+void CopyEngine::setAutoStart(const bool autoStart)
+{
+ this->autoStart=autoStart;
+ if(uiIsInstalled)
+ ui->autoStart->setChecked(autoStart);
+ listThread->setAutoStart(autoStart);
+}
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngine.h b/plugins/CopyEngine/Ultracopier-Spec/CopyEngine.h
index e5311d8..caba5b5 100644..100755
--- a/plugins/CopyEngine/Ultracopier/CopyEngine.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/CopyEngine.h
@@ -8,7 +8,6 @@
#include <QList>
#include <vector>
#include <string>
-#include <QFileInfo>
#include <QFile>
#include <QFileDialog>
#include <QMessageBox>
@@ -52,17 +51,14 @@ private:
QWidget * tempWidget;
Ui::copyEngineOptions * ui;
bool uiIsInstalled;
- QWidget * interface;
+ QWidget * uiinterface;
Filters * filters;
RenamingRules * renamingRules;
FacilityInterface * facilityEngine;
- uint32_t maxSpeed;
bool doRightTransfer;
bool keepDate;
- int blockSize;
- int parallelBuffer;
- int sequentialBuffer;
- int parallelizeIfSmallerThan;
+ bool os_spec_flags;
+ bool native_copy;
bool followTheStrictOrder;
bool deletePartiallyTransferredFiles;
int inodeThreads;
@@ -73,22 +69,23 @@ private:
bool rsync;
#endif
bool checkDestinationFolderExists;
+ bool mkFullPath;
+ bool checksum;
FileExistsAction alwaysDoThisActionForFileExists;
FileErrorAction alwaysDoThisActionForFileError;
FileErrorAction alwaysDoThisActionForFolderError;
FolderExistsAction alwaysDoThisActionForFolderExists;
- TransferAlgorithm transferAlgorithm;
bool dialogIsOpen;
volatile bool stopIt;
std::string defaultDestinationFolder;
/// \brief error queue
struct errorQueueItem
{
- TransferThread * transfer; ///< NULL if send by scan thread
+ TransferThreadAsync * transfer; ///< NULL if send by scan thread
ScanFileOrFolder * scan; ///< NULL if send by transfer thread
bool mkPath;
bool rmPath;
- QFileInfo inode;
+ INTERNALTYPEPATH inode;
std::string errorString;
ErrorType errorType;
};
@@ -96,10 +93,10 @@ private:
/// \brief already exists queue
struct alreadyExistsQueueItem
{
- TransferThread * transfer; ///< NULL if send by scan thread
+ TransferThreadAsync * transfer; ///< NULL if send by scan thread
ScanFileOrFolder * scan; ///< NULL if send by transfer thread
- QFileInfo source;
- QFileInfo destination;
+ INTERNALTYPEPATH source;
+ INTERNALTYPEPATH destination;
bool isSame;
};
std::vector<alreadyExistsQueueItem> alreadyExistsQueue;
@@ -107,16 +104,13 @@ private:
Ultracopier::CopyMode mode;
bool forcedMode;
- bool doChecksum;
- bool checksumIgnoreIfImpossible;
- bool checksumOnlyOnError;
- bool osBuffer;
- bool osBufferLimited;
bool checkDiskSpace;
+ bool buffer;
unsigned int osBufferLimit;
std::vector<std::string> includeStrings,includeOptions,excludeStrings,excludeOptions;
std::string firstRenamingRule;
std::string otherRenamingRule;
+ uint64_t errorPutAtEnd;
//send action done timer
QTimer timerActionDone;
@@ -128,112 +122,99 @@ private:
private slots:
#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
void updateTheDebugInfo(const std::vector<std::string> &newList, const std::vector<std::string> &newList2, const int &numberOfInodeOperation);
+ friend class DebugDialog;
#endif
/************* External call ********************/
//dialog message
/// \note Can be call without queue because all call will be serialized
- void fileAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,TransferThread * thread);
+ void fileAlreadyExistsSlot(INTERNALTYPEPATH source, INTERNALTYPEPATH destination, bool isSame, TransferThreadAsync * thread);
/// \note Can be call without queue because all call will be serialized
- void errorOnFileSlot(QFileInfo fileInfo, std::string errorString, TransferThread * thread, const ErrorType &errorType);
+ void errorOnFileSlot(INTERNALTYPEPATH fileInfo, std::string errorString, TransferThreadAsync * thread, const ErrorType &errorType);
/// \note Can be call without queue because all call will be serialized
- void folderAlreadyExistsSlot(QFileInfo source,QFileInfo destination,bool isSame,ScanFileOrFolder * thread);
+ void folderAlreadyExistsSlot(INTERNALTYPEPATH source,INTERNALTYPEPATH destination,bool isSame,ScanFileOrFolder * thread);
/// \note Can be call without queue because all call will be serialized
- void errorOnFolderSlot(QFileInfo fileInfo, std::string errorString, ScanFileOrFolder * thread, ErrorType errorType);
+ void errorOnFolderSlot(INTERNALTYPEPATH fileInfo, std::string errorString, ScanFileOrFolder * thread, ErrorType errorType);
//mkpath event
- void mkPathErrorOnFolderSlot(QFileInfo, std::string, ErrorType errorType);
+ void mkPathErrorOnFolderSlot(INTERNALTYPEPATH, std::string, ErrorType errorType);
//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);
+ void fileAlreadyExists(INTERNALTYPEPATH source, INTERNALTYPEPATH destination, bool isSame, TransferThreadAsync * thread, bool isCalledByShowOneNewDialog=false);
/// \note Can be call without queue because all call will be serialized
- void errorOnFile(QFileInfo fileInfo, std::string errorString, TransferThread * thread, const ErrorType &errorType, bool isCalledByShowOneNewDialog=false);
+ void errorOnFile(INTERNALTYPEPATH fileInfo, std::string errorString, TransferThreadAsync * thread, const ErrorType &errorType, 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);
+ void folderAlreadyExists(INTERNALTYPEPATH source,INTERNALTYPEPATH destination,bool isSame,ScanFileOrFolder * thread,bool isCalledByShowOneNewDialog=false);
/// \note Can be call without queue because all call will be serialized
- void errorOnFolder(QFileInfo fileInfo, std::string errorString, ScanFileOrFolder * thread, ErrorType errorType, bool isCalledByShowOneNewDialog=false);
+ void errorOnFolder(INTERNALTYPEPATH fileInfo, std::string errorString, ScanFileOrFolder * thread, ErrorType errorType, bool isCalledByShowOneNewDialog=false);
//mkpath event
- void mkPathErrorOnFolder(QFileInfo, std::string, const ErrorType &errorType, bool isCalledByShowOneNewDialog=false);
+ void mkPathErrorOnFolder(INTERNALTYPEPATH, std::string, const ErrorType &errorType, bool isCalledByShowOneNewDialog=false);
//show one new dialog if needed
void showOneNewDialog();
void sendNewFilters();
- void doChecksum_toggled(bool);
- void checksumOnlyOnError_toggled(bool);
- void checksumIgnoreIfImpossible_toggled(bool);
- void osBuffer_toggled(bool);
- void osBufferLimited_toggled(bool);
- void osBufferLimit_editingFinished();
void showFilterDialog();
void sendNewRenamingRules(std::string firstRenamingRule,std::string otherRenamingRule);
void showRenamingRules();
void get_realBytesTransfered(quint64 realBytesTransfered);
void newActionInProgess(Ultracopier::EngineActionInProgress);
- void updatedBlockSize();
- void updateBufferCheckbox();
- void haveNeedPutAtBottom(bool needPutAtBottom, const QFileInfo &fileInfo, const std::string &errorString, TransferThread *thread, const ErrorType &errorType);
+ void haveNeedPutAtBottom(bool needPutAtBottom, const INTERNALTYPEPATH &fileInfo, const std::string &errorString, TransferThreadAsync *thread, const ErrorType &errorType);
void missingDiskSpace(std::vector<Diskspace> list);
- void exportErrorIntoTransferList();
+ void exportErrorIntoTransferList() override;
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);
+ bool getOptionsEngine(QWidget * tempWidget) override;
/** \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);
+ void setInterfacePointer(QWidget * uiinterface) override;
//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 std::vector<std::string> &sources);
+ bool haveSameSource(const std::vector<std::string> &sources) override;
/** \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 std::string &destination);
+ bool haveSameDestination(const std::string &destination) override;
//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 std::vector<std::string> &sources);
+ bool newCopy(const std::vector<std::string> &sources) override;
/** \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 std::vector<std::string> &sources,const std::string &destination);
+ bool newCopy(const std::vector<std::string> &sources,const std::string &destination) override;
/** \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 std::vector<std::string> &sources);
+ bool newMove(const std::vector<std::string> &sources) override;
/** \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 std::vector<std::string> &sources,const std::string &destination);
+ bool newMove(const std::vector<std::string> &sources,const std::string &destination) override;
/** \brief send the new transfer list
* \param file the transfer list */
- void newTransferList(const std::string &file);
+ void newTransferList(const std::string &file) override;
/** \brief to get byte read, use by Ultracopier for the speed calculation
* real size transfered to right speed calculation */
- uint64_t realByteTransfered();
+ uint64_t realByteTransfered() override;
/** \brief support speed limitation */
- bool supportSpeedLimitation() const;
+ bool supportSpeedLimitation() const override;
/** \brief to set drives detected
* specific to this copy engine */
/** \brief to sync the transfer list
* Used when the interface is changed, useful to minimize the memory size */
- void syncTransferList();
+ void syncTransferList() override;
- void set_doChecksum(bool doChecksum);
- void set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible);
- void set_checksumOnlyOnError(bool checksumOnlyOnError);
- void set_osBuffer(bool osBuffer);
- void set_osBufferLimited(bool osBufferLimited);
- void set_osBufferLimit(unsigned int osBufferLimit);
void set_setFilters(std::vector<std::string> includeStrings,std::vector<std::string> includeOptions,std::vector<std::string> excludeStrings,std::vector<std::string> excludeOptions);
void setRenamingRules(std::string firstRenamingRule,std::string otherRenamingRule);
#ifdef ULTRACOPIER_PLUGIN_RSYNC
@@ -241,54 +222,55 @@ public:
#endif
void setCheckDiskSpace(const bool &checkDiskSpace);
void setDefaultDestinationFolder(const std::string &defaultDestinationFolder);
- void setCopyListOrder(const bool &order);
void defaultDestinationFolderBrowse();
std::string askDestination();
+ static std::string stringimplode(const std::vector<std::string>& elems, const std::string &delim);
+ void setBuffer(const bool &buffer);
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 Ultracopier::CopyMode &mode);
+ bool userAddFolder(const Ultracopier::CopyMode &mode) override;
/** \brief add file called on the interface
* Used by manual adding */
- bool userAddFile(const Ultracopier::CopyMode &mode);
+ bool userAddFile(const Ultracopier::CopyMode &mode) override;
//action on the copy
/// \brief put the transfer in pause
- void pause();
+ void pause() override;
/// \brief resume the transfer
- void resume();
+ void resume() override;
/** \brief skip one transfer entry
* \param id id of the file to remove */
- void skip(const uint64_t &id);
+ void skip(const uint64_t &id) override;
/// \brief cancel all the transfer
- void cancel();
+ void cancel() override;
//edit the transfer list
/** \brief remove the selected item
* \param ids ids is the id list of the selected items */
- void removeItems(const std::vector<uint64_t> &ids);
+ void removeItems(const std::vector<uint64_t> &ids) override;
/** \brief move on top of the list the selected item
* \param ids ids is the id list of the selected items */
- void moveItemsOnTop(const std::vector<uint64_t> &ids);
+ void moveItemsOnTop(const std::vector<uint64_t> &ids) override;
/** \brief move up the list the selected item
* \param ids ids is the id list of the selected items */
- void moveItemsUp(const std::vector<uint64_t> &ids);
+ void moveItemsUp(const std::vector<uint64_t> &ids) override;
/** \brief move down the list the selected item
* \param ids ids is the id list of the selected items */
- void moveItemsDown(const std::vector<uint64_t> &ids);
+ void moveItemsDown(const std::vector<uint64_t> &ids) override;
/** \brief move on bottom of the list the selected item
* \param ids ids is the id list of the selected items */
- void moveItemsOnBottom(const std::vector<uint64_t> &ids);
+ void moveItemsOnBottom(const std::vector<uint64_t> &ids) override;
/** \brief give the forced mode, to export/import transfer list */
- void forceMode(const Ultracopier::CopyMode &mode);
+ void forceMode(const Ultracopier::CopyMode &mode) override;
/// \brief export the transfer list into a file
- void exportTransferList();
+ void exportTransferList() override;
/// \brief import the transfer list into a file
- void importTransferList();
+ void importTransferList() override;
/** \brief to set the speed limitation
* -1 if not able, 0 if disabled */
- bool setSpeedLimitation(const int64_t &speedLimitation);
+ bool setSpeedLimitation(const int64_t &speedLimitation) override;
// specific to this copy engine
@@ -296,12 +278,9 @@ public slots:
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);
+ void setOsSpecFlags(bool os_spec_flags);
+ void setNativeCopy(bool native_copy);
- void setParallelBuffer(int parallelBuffer);
- void setSequentialBuffer(int sequentialBuffer);
- void setParallelizeIfSmallerThan(int parallelizeIfSmallerThan);
void setMoveTheWholeFolder(const bool &moveTheWholeFolder);
void setFollowTheStrictOrder(const bool &followTheStrictOrder);
void setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles);
@@ -313,6 +292,8 @@ public slots:
void setAutoStart(const bool autoStart);
/// \brief set if need check if the destination folder exists
void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ void setMkFullPath(const bool mkFullPath);
+ void setChecksum(const bool checksum);
/// \brief reset widget
void resetTempWidget();
//autoconnect
@@ -320,7 +301,6 @@ public slots:
void setFolderError(int index);
void setFileCollision(int index);
void setFileError(int index);
- void setTransferAlgorithm(int index);
/// \brief need retranslate the insterface
void newLanguageLoaded();
private slots:
@@ -333,6 +313,7 @@ signals:
void signal_pause() const;
void signal_resume() const;
void signal_skip(const uint64_t &id) const;
+ void signal_setSpeedLimitation(const int64_t &speedLimitation);
//edit the transfer list
void signal_removeItems(const std::vector<uint64_t> &ids) const;
@@ -347,14 +328,13 @@ signals:
void signal_exportErrorIntoTransferList(const std::string &fileName) const;
//action
- void signal_setTransferAlgorithm(TransferAlgorithm transferAlgorithm) const;
void signal_setCollisionAction(FileExistsAction alwaysDoThisActionForFileExists) const;
- void signal_setComboBoxFolderCollision(FolderExistsAction action) const;
+ //void signal_setComboBoxFolderCollision(FolderExistsAction action) const;// -> duplicate with signal_setFolderCollision ?
void signal_setFolderCollision(FolderExistsAction action) const;
//internal cancel
void tryCancel() const;
- void getNeedPutAtBottom(const QFileInfo &fileInfo,const std::string &errorString,TransferThread * thread,const ErrorType &errorType) const;
+ void getNeedPutAtBottom(const INTERNALTYPEPATH &fileInfo,const std::string &errorString,TransferThreadAsync * thread,const ErrorType &errorType) const;
#ifdef ULTRACOPIER_PLUGIN_DEBUG
/// \brief To debug source
@@ -364,14 +344,8 @@ signals:
//other signals
void queryOneNewDialog() const;
- void send_speedLimitation(const uint64_t &speedLimitation) const;
- void send_blockSize(const int &blockSize) const;
- void send_osBufferLimit(const unsigned int &osBufferLimit) const;
void send_setFilters(const std::vector<Filters_rules> &include,const std::vector<Filters_rules> &exclude) const;
void send_sendNewRenamingRules(std::string firstRenamingRule,std::string otherRenamingRule) const;
- void send_parallelBuffer(const int &parallelBuffer) const;
- void send_sequentialBuffer(const int &sequentialBuffer) const;
- void send_parallelizeIfSmallerThan(const int &parallelizeIfSmallerThan) const;
void send_followTheStrictOrder(const bool &followTheStrictOrder) const;
void send_deletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles) const;
void send_setInodeThreads(const int &inodeThreads) const;
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngine.pro b/plugins/CopyEngine/Ultracopier-Spec/CopyEngine.pro
index 112e999..c7b7651 100644..100755
--- a/plugins/CopyEngine/Ultracopier/CopyEngine.pro
+++ b/plugins/CopyEngine/Ultracopier-Spec/CopyEngine.pro
@@ -3,23 +3,17 @@ QMAKE_CXXFLAGS+="-std=c++0x -Wall -Wextra"
mac:QMAKE_CXXFLAGS+="-stdlib=libc++"
QT += widgets xml
-DEFINES += UNICODE _UNICODE
+DEFINES += _FILE_OFFSET_BITS=64 UNICODE _UNICODE WIDESTRING _LARGE_FILE_SOURCE=1
TEMPLATE = lib
CONFIG += plugin
-win32 {
- LIBS += -ladvapi32
-}
-HEADERS = \
+HEADERS += \
$$PWD/StructEnumDefinition.h \
$$PWD/StructEnumDefinition_CopyEngine.h \
$$PWD/DebugEngineMacro.h \
- $$PWD/Variable.h \
+ $$PWD/CopyEngineUltracopier-SpecVariable.h \
$$PWD/TransferThread.h \
- $$PWD/ReadThread.h \
- $$PWD/WriteThread.h \
$$PWD/MkPath.h \
- $$PWD/AvancedQFile.h \
$$PWD/ListThread.h \
$$PWD/../../../interface/PluginInterface_CopyEngine.h \
$$PWD/../../../interface/OptionInterface.h \
@@ -37,13 +31,12 @@ HEADERS = \
$$PWD/FileIsSameDialog.h \
$$PWD/FolderExistsDialog.h \
$$PWD/ScanFileOrFolder.h \
- $$PWD/DiskSpace.h
-SOURCES = \
+ $$PWD/DiskSpace.h \
+ async/ReadThread.h \
+ async/WriteThread.h
+SOURCES += \
$$PWD/TransferThread.cpp \
- $$PWD/ReadThread.cpp \
- $$PWD/WriteThread.cpp \
$$PWD/MkPath.cpp \
- $$PWD/AvancedQFile.cpp \
$$PWD/ListThread.cpp \
$$PWD/../../../cpp11addition.cpp \
$$PWD/../../../cpp11additionstringtointcpp.cpp \
@@ -61,7 +54,16 @@ SOURCES = \
$$PWD/FileIsSameDialog.cpp \
$$PWD/FolderExistsDialog.cpp \
$$PWD/ScanFileOrFolder.cpp \
- $$PWD/DiskSpace.cpp
+ $$PWD/DiskSpace.cpp \
+ ListThreadActions.cpp \
+ ListThreadListChange.cpp \
+ ListThreadMedia.cpp \
+ ListThreadNew.cpp \
+ ListThreadOptions.cpp \
+ ListThreadScan.cpp \
+ ListThreadStat.cpp \
+ async/ReadThread.cpp \
+ async/WriteThread.cpp
TARGET = $$qtLibraryTarget(copyEngine)
TRANSLATIONS += \
$$PWD/Languages/ar/translation.ts \
@@ -104,3 +106,10 @@ OTHER_FILES += \
RESOURCES += \
$$PWD/copyEngineResources.qrc
}
+
+win32 {
+ LIBS += -ladvapi32
+ DEFINES += WIDESTRING
+}
+HEADERS += $$PWD/async/TransferThreadAsync.h
+SOURCES += $$PWD/async/TransferThreadAsync.cpp
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngineFactory.cpp b/plugins/CopyEngine/Ultracopier-Spec/CopyEngineFactory.cpp
index ce86c94..9dc9bc2 100644..100755
--- a/plugins/CopyEngine/Ultracopier/CopyEngineFactory.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/CopyEngineFactory.cpp
@@ -10,6 +10,13 @@
#include "../../../cpp11addition.h"
#include "CopyEngineFactory.h"
+#include "TransferThread.h"
+#ifdef Q_OS_LINUX
+#include <sys/sysinfo.h>
+#endif
+#ifdef Q_OS_WIN32
+#include <sysinfoapi.h>
+#endif
// The cmath header from MSVC does not contain round()
#if (defined(_WIN64) || defined(_WIN32)) && defined(_MSC_VER)
@@ -23,22 +30,22 @@ CopyEngineFactory::CopyEngineFactory() :
{
qRegisterMetaType<FolderExistsAction>("FolderExistsAction");
qRegisterMetaType<FileExistsAction>("FileExistsAction");
- qRegisterMetaType<QList<Filters_rules> >("QList<Filters_rules>");
+ qRegisterMetaType<std::vector<Filters_rules> >("std::vector<Filters_rules>");
qRegisterMetaType<TransferStat>("TransferStat");
- qRegisterMetaType<QList<QByteArray> >("QList<QByteArray>");
- qRegisterMetaType<TransferAlgorithm>("TransferAlgorithm");
qRegisterMetaType<ActionType>("ActionType");
qRegisterMetaType<ErrorType>("ErrorType");
qRegisterMetaType<Diskspace>("Diskspace");
- qRegisterMetaType<QList<Diskspace> >("QList<Diskspace>");
- qRegisterMetaType<QFileInfo>("QFileInfo");
+ qRegisterMetaType<std::vector<Diskspace> >("std::vector<Diskspace>");
qRegisterMetaType<Ultracopier::CopyMode>("Ultracopier::CopyMode");
- qRegisterMetaType<std::vector<Filters_rules> >("std::vector<Filters_rules>");
+ qRegisterMetaType<TransferThread::dirent_uc>("TransferThread::dirent_uc");
+ #ifdef WIDESTRING
+ qRegisterMetaType<std::wstring>("std::wstring");
+ qRegisterMetaType<wchar_t *>("wchar_t *");
+ #endif
tempWidget=new QWidget();
ui->setupUi(tempWidget);
ui->toolBox->setCurrentIndex(0);
- ui->blockSize->setMaximum(ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE);
errorFound=false;
optionsEngine=NULL;
filters=new Filters(tempWidget);
@@ -46,38 +53,29 @@ CopyEngineFactory::CopyEngineFactory() :
connect(ui->doRightTransfer, &QCheckBox::toggled, this,&CopyEngineFactory::setDoRightTransfer);
connect(ui->keepDate, &QCheckBox::toggled, this,&CopyEngineFactory::setKeepDate);
- connect(ui->blockSize, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngineFactory::setBlockSize);
- connect(ui->sequentialBuffer, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngineFactory::setSequentialBuffer);
- connect(ui->parallelBuffer, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngineFactory::setParallelBuffer);
- connect(ui->parallelizeIfSmallerThan, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngineFactory::setParallelizeIfSmallerThan);
+ connect(ui->native_copy, &QCheckBox::toggled, this,&CopyEngineFactory::setNativeCopy);
+ connect(ui->os_spec_flags, &QCheckBox::toggled, this,&CopyEngineFactory::setOsSpecFlags);
connect(ui->inodeThreads, static_cast<void(QSpinBox::*)(int)>(&QSpinBox::valueChanged), this,&CopyEngineFactory::on_inodeThreads_editingFinished);
connect(ui->autoStart, &QCheckBox::toggled, this,&CopyEngineFactory::setAutoStart);
- connect(ui->doChecksum, &QCheckBox::toggled, this,&CopyEngineFactory::doChecksum_toggled);
connect(ui->comboBoxFolderError, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngineFactory::setFolderError);
connect(ui->comboBoxFolderCollision, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngineFactory::setFolderCollision);
connect(ui->comboBoxFileError, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngineFactory::setFileError);
connect(ui->comboBoxFileCollision, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngineFactory::setFileCollision);
- connect(ui->transferAlgorithm, static_cast<void(QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this,&CopyEngineFactory::setTransferAlgorithm);
connect(ui->checkBoxDestinationFolderExists, &QCheckBox::toggled, this,&CopyEngineFactory::setCheckDestinationFolder);
- connect(ui->checksumIgnoreIfImpossible, &QCheckBox::toggled, this,&CopyEngineFactory::checksumIgnoreIfImpossible_toggled);
- connect(ui->checksumOnlyOnError, &QCheckBox::toggled, this,&CopyEngineFactory::checksumOnlyOnError_toggled);
- connect(ui->osBuffer, &QCheckBox::toggled, this,&CopyEngineFactory::osBuffer_toggled);
- connect(ui->osBufferLimited, &QCheckBox::toggled, this,&CopyEngineFactory::osBufferLimited_toggled);
- connect(ui->osBufferLimit, &QSpinBox::editingFinished, this,&CopyEngineFactory::osBufferLimit_editingFinished);
+ connect(ui->mkpath, &QCheckBox::toggled, this,&CopyEngineFactory::setMkFullPath);
+ connect(ui->checksum, &QCheckBox::toggled, this,&CopyEngineFactory::setChecksum);
#ifdef ULTRACOPIER_PLUGIN_RSYNC
connect(ui->rsync, &QCheckBox::toggled, this,&CopyEngineFactory::setRsync);
#endif
connect(ui->inodeThreads, &QSpinBox::editingFinished, this,&CopyEngineFactory::on_inodeThreads_editingFinished);
- connect(ui->osBufferLimited, &QAbstractButton::toggled, this,&CopyEngineFactory::updateBufferCheckbox);
- connect(ui->osBuffer, &QAbstractButton::toggled, this,&CopyEngineFactory::updateBufferCheckbox);
connect(ui->moveTheWholeFolder, &QCheckBox::toggled, this,&CopyEngineFactory::moveTheWholeFolder);
connect(ui->followTheStrictOrder, &QCheckBox::toggled, this,&CopyEngineFactory::followTheStrictOrder);
connect(ui->deletePartiallyTransferredFiles,&QCheckBox::toggled, this,&CopyEngineFactory::deletePartiallyTransferredFiles);
connect(ui->renameTheOriginalDestination,&QCheckBox::toggled, this,&CopyEngineFactory::renameTheOriginalDestination);
connect(ui->checkDiskSpace, &QCheckBox::toggled, this,&CopyEngineFactory::checkDiskSpace);
+ connect(ui->buffer, &QCheckBox::toggled, this,&CopyEngineFactory::setBuffer);
connect(ui->defaultDestinationFolderBrowse,&QPushButton::clicked, this,&CopyEngineFactory::defaultDestinationFolderBrowse);
connect(ui->defaultDestinationFolder,&QLineEdit::editingFinished, this,&CopyEngineFactory::defaultDestinationFolder);
- connect(ui->copyListOrder, &QCheckBox::toggled, this,&CopyEngineFactory::copyListOrder);
connect(filters,&Filters::sendNewFilters,this,&CopyEngineFactory::sendNewFilters);
connect(ui->filters,&QPushButton::clicked,this,&CopyEngineFactory::showFilterDialog);
@@ -112,28 +110,21 @@ PluginInterface_CopyEngine * CopyEngineFactory::getInstance()
connect(this,&CopyEngineFactory::reloadLanguage,realObject,&CopyEngine::newLanguageLoaded);
realObject->setRightTransfer(ui->doRightTransfer->isChecked());
realObject->setKeepDate(ui->keepDate->isChecked());
- realObject->setBlockSize(ui->blockSize->value());
- realObject->setAutoStart(ui->autoStart->isChecked());
+ realObject->setOsSpecFlags(ui->os_spec_flags->isChecked());
+ realObject->setNativeCopy(ui->native_copy->isChecked());
#ifdef ULTRACOPIER_PLUGIN_RSYNC
realObject->setRsync(ui->rsync->isChecked());
#endif
+ realObject->setAutoStart(ui->autoStart->isChecked());
realObject->setFolderCollision(ui->comboBoxFolderCollision->currentIndex());
realObject->setFolderError(ui->comboBoxFolderError->currentIndex());
realObject->setFileCollision(ui->comboBoxFileCollision->currentIndex());
realObject->setFileError(ui->comboBoxFileError->currentIndex());
- realObject->setTransferAlgorithm(ui->transferAlgorithm->currentIndex());
realObject->setCheckDestinationFolderExists(ui->checkBoxDestinationFolderExists->isChecked());
- realObject->set_doChecksum(ui->doChecksum->isChecked());
- realObject->set_checksumIgnoreIfImpossible(ui->checksumIgnoreIfImpossible->isChecked());
- realObject->set_checksumOnlyOnError(ui->checksumOnlyOnError->isChecked());
- realObject->set_osBuffer(ui->osBuffer->isChecked());
- realObject->set_osBufferLimited(ui->osBufferLimited->isChecked());
- realObject->set_osBufferLimit(ui->osBufferLimit->value());
+ realObject->setMkFullPath(ui->mkpath->isChecked());
+ realObject->setChecksum(ui->checksum->isChecked());
realObject->set_setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
realObject->setRenamingRules(firstRenamingRule,otherRenamingRule);
- realObject->setSequentialBuffer(ui->sequentialBuffer->value());
- realObject->setParallelBuffer(ui->parallelBuffer->value());
- realObject->setParallelizeIfSmallerThan(ui->parallelizeIfSmallerThan->value());
realObject->setMoveTheWholeFolder(ui->moveTheWholeFolder->isChecked());
realObject->setFollowTheStrictOrder(ui->followTheStrictOrder->isChecked());
realObject->setDeletePartiallyTransferredFiles(ui->deletePartiallyTransferredFiles->isChecked());
@@ -141,7 +132,7 @@ PluginInterface_CopyEngine * CopyEngineFactory::getInstance()
realObject->setRenameTheOriginalDestination(ui->renameTheOriginalDestination->isChecked());
realObject->setCheckDiskSpace(ui->checkDiskSpace->isChecked());
realObject->setDefaultDestinationFolder(ui->defaultDestinationFolder->text().toStdString());
- realObject->setCopyListOrder(ui->copyListOrder->isChecked());
+ realObject->setBuffer(ui->buffer->isChecked());
return newTransferEngine;
}
@@ -159,11 +150,33 @@ void CopyEngineFactory::setResources(OptionInterface * options,const std::string
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("Unable to change date time of files, only gcc is supported"));
#endif
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,COMPILERINFO);
+ #if defined (UNICODE)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"UNICODE set");
+ #endif
+ #if defined (_FILE_OFFSET_BITS)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"_FILE_OFFSET_BITS set to "+std::to_string(_FILE_OFFSET_BITS));
+ #endif
+ #if defined (WIDESTRING)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"WIDESTRING set");
+ #endif
+ #if defined (_LARGE_FILE_SOURCE)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"_LARGE_FILE_SOURCE set to "+std::to_string(_LARGE_FILE_SOURCE));
+ #endif
#if defined (ULTRACOPIER_PLUGIN_CHECKLISTTYPE)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"CHECK LIST TYPE set");
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"CHECK LIST TYPE set");
#else
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"CHECK LIST TYPE not set");
#endif
+ #ifdef Q_OS_WIN32
+ MEMORYSTATUSEX memoryStatus;
+ if(GlobalMemoryStatusEx(&memoryStatus))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Detected Memory MB Windows: "+std::to_string(memoryStatus.ullTotalPhys/1024));
+ #endif
+ #ifdef Q_OS_LINUX
+ struct sysinfo info;
+ if(sysinfo(&info)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Detected Memory MB Linux: "+std::to_string(info.totalhigh*info.mem_unit/1024/1024));
+ #endif
if(options!=NULL)
{
//load the options
@@ -174,25 +187,17 @@ void CopyEngineFactory::setResources(OptionInterface * options,const std::string
#else
KeysList.push_back(std::pair<std::string, std::string>("keepDate","true"));
#endif
+ KeysList.push_back(std::pair<std::string, std::string>("native_copy","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("os_spec_flags","true"));
KeysList.push_back(std::pair<std::string, std::string>("blockSize",std::to_string(ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE)));
- uint32_t sequentialBuffer=ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*ULTRACOPIER_PLUGIN_DEFAULT_SEQUENTIAL_NUMBER_OF_BLOCK;
- uint32_t parallelBuffer=ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
//to prevent swap and other bad effect, only under windows and unix for now
#if defined(Q_OS_WIN32) or (defined(Q_OS_LINUX) and defined(_SC_PHYS_PAGES))
size_t max_memory=getTotalSystemMemory()/1024;
- if(max_memory>0)
- {
- if(max_memory>2147483648)
- max_memory=2147483648;
- if(sequentialBuffer>(max_memory/10))
- sequentialBuffer=max_memory/10;
- if(parallelBuffer>(max_memory/100))
- parallelBuffer=max_memory/100;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("detected memory: %1MB").arg(max_memory/1024).toStdString());
+ if(max_memory>2147483648)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("detected memory: %1MB").arg(max_memory/1024).toStdString());
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,QStringLiteral("detected memory: %1GB").arg(max_memory/(1024*1024)).toStdString());
#endif
- KeysList.push_back(std::pair<std::string, std::string>("sequentialBuffer",std::to_string(sequentialBuffer)));
- KeysList.push_back(std::pair<std::string, std::string>("parallelBuffer",std::to_string(parallelBuffer)));
KeysList.push_back(std::pair<std::string, std::string>("parallelizeIfSmallerThan",std::to_string(128)));//128KB, better for modern hardware: Multiple queue en linux, SSD, ...
KeysList.push_back(std::pair<std::string, std::string>("autoStart","true"));
#ifdef ULTRACOPIER_PLUGIN_RSYNC
@@ -204,34 +209,45 @@ void CopyEngineFactory::setResources(OptionInterface * options,const std::string
KeysList.push_back(std::pair<std::string, std::string>("fileCollision",std::to_string(0)));
KeysList.push_back(std::pair<std::string, std::string>("transferAlgorithm",std::to_string(0)));
KeysList.push_back(std::pair<std::string, std::string>("checkDestinationFolder","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("mkpath","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("checksum","false"));
KeysList.push_back(std::pair<std::string, std::string>("includeStrings",""));
KeysList.push_back(std::pair<std::string, std::string>("includeOptions",""));
KeysList.push_back(std::pair<std::string, std::string>("excludeStrings",""));
KeysList.push_back(std::pair<std::string, std::string>("excludeOptions",""));
- KeysList.push_back(std::pair<std::string, std::string>("doChecksum","false"));
KeysList.push_back(std::pair<std::string, std::string>("checksumIgnoreIfImpossible","true"));
KeysList.push_back(std::pair<std::string, std::string>("checksumOnlyOnError","true"));
- KeysList.push_back(std::pair<std::string, std::string>("osBuffer","false"));
KeysList.push_back(std::pair<std::string, std::string>("firstRenamingRule",""));
KeysList.push_back(std::pair<std::string, std::string>("otherRenamingRule",""));
KeysList.push_back(std::pair<std::string, std::string>("osBufferLimited","false"));
KeysList.push_back(std::pair<std::string, std::string>("osBufferLimit",std::to_string(512)));
KeysList.push_back(std::pair<std::string, std::string>("deletePartiallyTransferredFiles","true"));
KeysList.push_back(std::pair<std::string, std::string>("moveTheWholeFolder","true"));
- KeysList.push_back(std::pair<std::string, std::string>("followTheStrictOrder","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("followTheStrictOrder","true"));
KeysList.push_back(std::pair<std::string, std::string>("renameTheOriginalDestination","false"));
KeysList.push_back(std::pair<std::string, std::string>("checkDiskSpace","true"));
KeysList.push_back(std::pair<std::string, std::string>("defaultDestinationFolder",""));
- KeysList.push_back(std::pair<std::string, std::string>("inodeThreads",std::to_string(1)));
- KeysList.push_back(std::pair<std::string, std::string>("copyListOrder","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("inodeThreads",std::to_string(16)));
+ #ifdef Q_OS_WIN32
+ //un Windows, without buffer the write seam should be aligned and full block, Ultracopier not support this
+ KeysList.push_back(std::pair<std::string, std::string>("osBuffer","true"));
+ KeysList.push_back(std::pair<std::string, std::string>("buffer","true"));
+ #else
+ KeysList.push_back(std::pair<std::string, std::string>("osBuffer","false"));
+ KeysList.push_back(std::pair<std::string, std::string>("buffer","false"));
+ #endif
options->addOptionGroup(KeysList);
optionsEngine=options;
resetOptions();
- updateBufferCheckbox();
-
- updatedBlockSize();
+ std::string firstRenamingRule=options->getOptionValue("firstRenamingRule");
+ if(firstRenamingRule.find("%name%")==std::string::npos || firstRenamingRule.find("%suffix%")==std::string::npos)
+ options->setOptionValue("firstRenamingRule","");
+ std::string otherRenamingRule=options->getOptionValue("otherRenamingRule");
+ if(otherRenamingRule.find("%name%")==std::string::npos || otherRenamingRule.find("%suffix%")==std::string::npos
+ || otherRenamingRule.find("%number%")==std::string::npos)
+ options->setOptionValue("otherRenamingRule","");
}
}
@@ -264,6 +280,12 @@ bool CopyEngineFactory::canDoOnlyCopy() const
return false;
}
+/// \brief to get if have pause
+bool CopyEngineFactory::havePause()
+{
+ return true;
+}
+
void CopyEngineFactory::resetOptions()
{
auto options=optionsEngine;
@@ -274,7 +296,12 @@ void CopyEngineFactory::resetOptions()
#endif
ui->doRightTransfer->setChecked(stringtobool(options->getOptionValue("doRightTransfer")));
ui->keepDate->setChecked(stringtobool(options->getOptionValue("keepDate")));
- ui->blockSize->setValue(stringtouint32(options->getOptionValue("blockSize")));//keep before sequentialBuffer and parallelBuffer
+ ui->os_spec_flags->setChecked(stringtobool(options->getOptionValue("os_spec_flags")));
+ ui->native_copy->setChecked(stringtobool(options->getOptionValue("native_copy")));
+ #ifdef Q_OS_WIN32
+ ui->native_copy->setEnabled(false);
+ ui->native_copy->setToolTip(tr("Supported only on Windows"));
+ #endif
ui->autoStart->setChecked(stringtobool(options->getOptionValue("autoStart")));
#ifdef ULTRACOPIER_PLUGIN_RSYNC
ui->rsync->setChecked(stringtobool(options->getOptionValue("rsync")));
@@ -286,13 +313,9 @@ void CopyEngineFactory::resetOptions()
ui->comboBoxFolderCollision->setCurrentIndex(stringtouint32(options->getOptionValue("folderCollision")));
ui->comboBoxFileError->setCurrentIndex(stringtouint32(options->getOptionValue("fileError")));
ui->comboBoxFileCollision->setCurrentIndex(stringtouint32(options->getOptionValue("fileCollision")));
- ui->transferAlgorithm->setCurrentIndex(stringtouint32(options->getOptionValue("transferAlgorithm")));
ui->checkBoxDestinationFolderExists->setChecked(stringtobool(options->getOptionValue("checkDestinationFolder")));
- ui->parallelizeIfSmallerThan->setValue(stringtouint32(options->getOptionValue("parallelizeIfSmallerThan")));
- ui->sequentialBuffer->setValue(stringtouint32(options->getOptionValue("sequentialBuffer")));
- ui->parallelBuffer->setValue(stringtouint32(options->getOptionValue("parallelBuffer")));
- ui->sequentialBuffer->setSingleStep(ui->blockSize->value());
- ui->parallelBuffer->setSingleStep(ui->blockSize->value());
+ ui->mkpath->setChecked(stringtobool(options->getOptionValue("mkpath")));
+ ui->checksum->setChecked(stringtobool(options->getOptionValue("checksum")));
ui->deletePartiallyTransferredFiles->setChecked(stringtobool(options->getOptionValue("deletePartiallyTransferredFiles")));
ui->moveTheWholeFolder->setChecked(stringtobool(options->getOptionValue("moveTheWholeFolder")));
ui->followTheStrictOrder->setChecked(stringtobool(options->getOptionValue("followTheStrictOrder")));
@@ -300,28 +323,33 @@ void CopyEngineFactory::resetOptions()
ui->renameTheOriginalDestination->setChecked(stringtobool(options->getOptionValue("renameTheOriginalDestination")));
ui->checkDiskSpace->setChecked(stringtobool(options->getOptionValue("checkDiskSpace")));
ui->defaultDestinationFolder->setText(QString::fromStdString(options->getOptionValue("defaultDestinationFolder")));
+ ui->buffer->setChecked(stringtobool(options->getOptionValue("buffer")));
- ui->doChecksum->setChecked(stringtobool(options->getOptionValue("doChecksum")));
- ui->checksumIgnoreIfImpossible->setChecked(stringtobool(options->getOptionValue("checksumIgnoreIfImpossible")));
- ui->checksumOnlyOnError->setChecked(stringtobool(options->getOptionValue("checksumOnlyOnError")));
-
- ui->osBuffer->setChecked(stringtobool(options->getOptionValue("osBuffer")));
- ui->osBufferLimited->setChecked(stringtobool(options->getOptionValue("osBufferLimited")));
- ui->osBufferLimit->setValue(stringtouint32(options->getOptionValue("osBufferLimit")));
//ui->autoStart->setChecked(options->getOptionValue("autoStart").toBool());//moved from options(), wrong previous place
- includeStrings=stringtostringlist(options->getOptionValue("includeStrings"));
- includeOptions=stringtostringlist(options->getOptionValue("includeOptions"));
- excludeStrings=stringtostringlist(options->getOptionValue("excludeStrings"));
- excludeOptions=stringtostringlist(options->getOptionValue("excludeOptions"));
- filters->setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+ std::string s;
+ s=options->getOptionValue("includeStrings");
+ includeStrings=stringtostringlist(s);
+ s=options->getOptionValue("includeOptions");
+ includeOptions=stringtostringlist(s);
+ s=options->getOptionValue("excludeStrings");
+ excludeStrings=stringtostringlist(s);
+ s=options->getOptionValue("excludeOptions");
+ excludeOptions=stringtostringlist(s);
+ if(!filters->setFilters(includeStrings,includeOptions,excludeStrings,excludeOptions))
+ {
+ includeStrings.clear();
+ includeOptions.clear();
+ excludeStrings.clear();
+ excludeOptions.clear();
+ options->setOptionValue("includeStrings","");
+ options->setOptionValue("includeOptions","");
+ options->setOptionValue("excludeStrings","");
+ options->setOptionValue("excludeOptions","");
+ }
firstRenamingRule=options->getOptionValue("firstRenamingRule");
otherRenamingRule=options->getOptionValue("otherRenamingRule");
renamingRules->setRenamingRules(firstRenamingRule,otherRenamingRule);
- ui->checksumOnlyOnError->setEnabled(ui->doChecksum->isChecked());
- ui->checksumIgnoreIfImpossible->setEnabled(ui->doChecksum->isChecked());
- ui->copyListOrder->setChecked(stringtobool(options->getOptionValue("copyListOrder")));
-
optionsEngine=options;
}
@@ -344,50 +372,18 @@ void CopyEngineFactory::setKeepDate(bool keepDate)
optionsEngine->setOptionValue("keepDate",booltostring(keepDate));
}
-void CopyEngineFactory::setBlockSize(int blockSize)
+void CopyEngineFactory::setOsSpecFlags(bool os_spec_flags)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
if(optionsEngine!=NULL)
- optionsEngine->setOptionValue("blockSize",std::to_string(blockSize));
- updatedBlockSize();
+ optionsEngine->setOptionValue("os_spec_flags",booltostring(os_spec_flags));
}
-void CopyEngineFactory::setParallelBuffer(int parallelBuffer)
-{
- if(optionsEngine!=NULL)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
- parallelBuffer=round((float)parallelBuffer/(float)ui->blockSize->value())*ui->blockSize->value();
- ui->parallelBuffer->setValue(parallelBuffer);
- optionsEngine->setOptionValue("parallelBuffer",std::to_string(parallelBuffer));
- }
-}
-
-void CopyEngineFactory::setSequentialBuffer(int sequentialBuffer)
-{
- if(optionsEngine!=NULL)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
- sequentialBuffer=round((float)sequentialBuffer/(float)ui->blockSize->value())*ui->blockSize->value();
- ui->sequentialBuffer->setValue(sequentialBuffer);
- optionsEngine->setOptionValue("sequentialBuffer",std::to_string(sequentialBuffer));
- }
-}
-
-void CopyEngineFactory::setParallelizeIfSmallerThan(int parallelizeIfSmallerThan)
-{
- if(optionsEngine!=NULL)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
- optionsEngine->setOptionValue("parallelizeIfSmallerThan",std::to_string(parallelizeIfSmallerThan));
- }
-}
-
-void CopyEngineFactory::setAutoStart(bool autoStart)
+void CopyEngineFactory::setNativeCopy(bool native_copy)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
if(optionsEngine!=NULL)
- optionsEngine->setOptionValue("autoStart",booltostring(autoStart));
+ optionsEngine->setOptionValue("native_copy",booltostring(native_copy));
}
void CopyEngineFactory::setFolderCollision(int index)
@@ -404,18 +400,25 @@ void CopyEngineFactory::setFolderError(int index)
optionsEngine->setOptionValue("folderError",std::to_string(index));
}
-void CopyEngineFactory::setTransferAlgorithm(int index)
+void CopyEngineFactory::setCheckDestinationFolder()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("checkDestinationFolder",booltostring(ui->checkBoxDestinationFolderExists->isChecked()));
+}
+
+void CopyEngineFactory::setMkFullPath()
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
if(optionsEngine!=NULL)
- optionsEngine->setOptionValue("transferAlgorithm",std::to_string(index));
+ optionsEngine->setOptionValue("mkpath",booltostring(ui->mkpath->isChecked()));
}
-void CopyEngineFactory::setCheckDestinationFolder()
+void CopyEngineFactory::setChecksum()
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
if(optionsEngine!=NULL)
- optionsEngine->setOptionValue("checkDestinationFolder",booltostring(ui->checkBoxDestinationFolderExists->isChecked()));
+ optionsEngine->setOptionValue("checksum",booltostring(ui->checksum->isChecked()));
}
void CopyEngineFactory::newLanguageLoaded()
@@ -444,9 +447,6 @@ void CopyEngineFactory::newLanguageLoaded()
ui->comboBoxFileCollision->setItemText(5,tr("Overwrite if older"));
ui->comboBoxFileCollision->setItemText(6,tr("Rename"));
- ui->transferAlgorithm->setItemText(0,tr("Automatic"));
- ui->transferAlgorithm->setItemText(1,tr("Sequential"));
- ui->transferAlgorithm->setItemText(2,tr("Parallel"));
if(optionsEngine!=NULL)
{
filters->newLanguageLoaded();
@@ -456,43 +456,6 @@ void CopyEngineFactory::newLanguageLoaded()
this->optionsEngine=optionsEngine;
}
-void CopyEngineFactory::doChecksum_toggled(bool doChecksum)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
- if(optionsEngine!=NULL)
- optionsEngine->setOptionValue("doChecksum",booltostring(doChecksum));
-}
-
-void CopyEngineFactory::checksumOnlyOnError_toggled(bool checksumOnlyOnError)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
- if(optionsEngine!=NULL)
- optionsEngine->setOptionValue("checksumOnlyOnError",booltostring(checksumOnlyOnError));
-}
-
-void CopyEngineFactory::osBuffer_toggled(bool osBuffer)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
- if(optionsEngine!=NULL)
- optionsEngine->setOptionValue("osBuffer",booltostring(osBuffer));
- ui->osBufferLimit->setEnabled(ui->osBuffer->isChecked() && ui->osBufferLimited->isChecked());
-}
-
-void CopyEngineFactory::osBufferLimited_toggled(bool osBufferLimited)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
- if(optionsEngine!=NULL)
- optionsEngine->setOptionValue("osBufferLimited",booltostring(osBufferLimited));
- ui->osBufferLimit->setEnabled(ui->osBuffer->isChecked() && ui->osBufferLimited->isChecked());
-}
-
-void CopyEngineFactory::osBufferLimit_editingFinished()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the spinbox have changed");
- if(optionsEngine!=NULL)
- optionsEngine->setOptionValue("osBufferLimit",std::to_string(ui->osBufferLimit->value()));
-}
-
void CopyEngineFactory::showFilterDialog()
{
if(optionsEngine==NULL)
@@ -543,19 +506,6 @@ void CopyEngineFactory::showRenamingRules()
renamingRules->exec();
}
-void CopyEngineFactory::updateBufferCheckbox()
-{
- ui->osBufferLimited->setEnabled(ui->osBuffer->isChecked());
- ui->osBufferLimit->setEnabled(ui->osBuffer->isChecked() && ui->osBufferLimited->isChecked());
-}
-
-void CopyEngineFactory::checksumIgnoreIfImpossible_toggled(bool checksumIgnoreIfImpossible)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
- if(optionsEngine!=NULL)
- optionsEngine->setOptionValue("checksumIgnoreIfImpossible",booltostring(checksumIgnoreIfImpossible));
-}
-
void CopyEngineFactory::setFileCollision(int index)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"action index: "+std::to_string(index));
@@ -596,18 +546,6 @@ void CopyEngineFactory::setFileError(int index)
}
}
-void CopyEngineFactory::updatedBlockSize()
-{
- ui->sequentialBuffer->setMinimum(ui->blockSize->value());
- ui->sequentialBuffer->setSingleStep(ui->blockSize->value());
- ui->sequentialBuffer->setMaximum(ui->blockSize->value()*ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK);
- ui->parallelBuffer->setMinimum(ui->blockSize->value());
- ui->parallelBuffer->setSingleStep(ui->blockSize->value());
- ui->parallelBuffer->setMaximum(ui->blockSize->value()*ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK);
- setParallelBuffer(ui->parallelBuffer->value());
- setSequentialBuffer(ui->sequentialBuffer->value());
-}
-
void CopyEngineFactory::deletePartiallyTransferredFiles(bool checked)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
@@ -701,9 +639,16 @@ void CopyEngineFactory::setRsync(bool rsync)
}
#endif
-void CopyEngineFactory::copyListOrder(bool checked)
+void CopyEngineFactory::setBuffer(bool checked)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
+ if(optionsEngine!=NULL)
+ optionsEngine->setOptionValue("buffer",booltostring(checked));
+}
+
+void CopyEngineFactory::setAutoStart(bool autoStart)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"the value have changed");
if(optionsEngine!=NULL)
- optionsEngine->setOptionValue("copyListOrder",booltostring(checked));
+ optionsEngine->setOptionValue("autoStart",booltostring(autoStart));
}
diff --git a/plugins/CopyEngine/Ultracopier/CopyEngineFactory.h b/plugins/CopyEngine/Ultracopier-Spec/CopyEngineFactory.h
index 59c4208..810af80 100644..100755
--- a/plugins/CopyEngine/Ultracopier/CopyEngineFactory.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/CopyEngineFactory.h
@@ -50,22 +50,25 @@ public:
CopyEngineFactory();
~CopyEngineFactory();
/// \brief to return the instance of the copy engine
- PluginInterface_CopyEngine * getInstance();
+ PluginInterface_CopyEngine * getInstance() override;
/// \brief set the resources, to store options, to have facilityInterface
- void setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,FacilityInterface * facilityInterface,const bool &portableVersion);
+ void setResources(OptionInterface * options,const std::string &writePath,const std::string &pluginPath,
+ FacilityInterface * facilityInterface,const bool &portableVersion) override;
//get mode allowed
/// \brief define if can copy file, folder or both
- Ultracopier::CopyType getCopyType();
+ Ultracopier::CopyType getCopyType() override;
/// \brief to return which kind of transfer list operation is supported
- Ultracopier::TransferListOperation getTransferListOperation();
+ Ultracopier::TransferListOperation getTransferListOperation() override;
/// \brief define if can only copy, or copy and move
- bool canDoOnlyCopy() const;
+ bool canDoOnlyCopy() const override;
/// \brief to get the supported protocols for the source
- std::vector<std::string> supportedProtocolsForTheSource() const;
+ std::vector<std::string> supportedProtocolsForTheSource() const override;
/// \brief to get the supported protocols for the destination
- std::vector<std::string> supportedProtocolsForTheDestination() const;
+ std::vector<std::string> supportedProtocolsForTheDestination() const override;
/// \brief to get the options of the copy engine
- QWidget * options();
+ QWidget * options() override;
+ /// \brief to get if have pause
+ bool havePause() override;
private:
Ui::copyEngineOptions *ui;
@@ -87,33 +90,23 @@ private slots:
void init();
void setDoRightTransfer(bool doRightTransfer);
void setKeepDate(bool keepDate);
- void setBlockSize(int blockSize);
- void setParallelBuffer(int parallelBuffer);
- void setSequentialBuffer(int sequentialBuffer);
- void setParallelizeIfSmallerThan(int parallelizeIfSmallerThan);
- void setAutoStart(bool autoStart);
+ void setOsSpecFlags(bool os_spec_flags);
+ void setNativeCopy(bool native_copy);
#ifdef ULTRACOPIER_PLUGIN_RSYNC
void setRsync(bool rsync);
#endif
void setFolderCollision(int index);
void setFolderError(int index);
- void setTransferAlgorithm(int index);
void setCheckDestinationFolder();
+ void setMkFullPath();
+ void setChecksum();
void showFilterDialog();
void sendNewFilters(const std::vector<std::string> &includeStrings,const std::vector<std::string> &includeOptions,
const std::vector<std::string> &excludeStrings,const std::vector<std::string> &excludeOptions);
- void doChecksum_toggled(bool);
- void checksumOnlyOnError_toggled(bool);
- void osBuffer_toggled(bool);
- void osBufferLimited_toggled(bool);
- void osBufferLimit_editingFinished();
- void checksumIgnoreIfImpossible_toggled(bool);
void sendNewRenamingRules(const std::string &firstRenamingRule, const std::string &otherRenamingRule);
void showRenamingRules();
- void updateBufferCheckbox();
void setFileCollision(int index);
void setFileError(int index);
- void updatedBlockSize();
void deletePartiallyTransferredFiles(bool checked);
void renameTheOriginalDestination(bool checked);
void checkDiskSpace(bool checked);
@@ -122,10 +115,11 @@ private slots:
void followTheStrictOrder(bool checked);
void moveTheWholeFolder(bool checked);
void on_inodeThreads_editingFinished();
- void copyListOrder(bool checked);
+ void setBuffer(bool checked);
+ void setAutoStart(bool autoStart);
public slots:
- void resetOptions();
- void newLanguageLoaded();
+ void resetOptions() override;
+ void newLanguageLoaded() override;
signals:
void reloadLanguage() const;
};
diff --git a/plugins/CopyEngine/Ultracopier/Variable.h b/plugins/CopyEngine/Ultracopier-Spec/CopyEngineUltracopier-SpecVariable.h
index 3311483..247680c 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Variable.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/CopyEngineUltracopier-SpecVariable.h
@@ -8,9 +8,9 @@
//Un-comment this next line to put ultracopier plugin in debug mode
#ifndef ULTRACOPIER_NODEBUG
-#define ULTRACOPIER_PLUGIN_DEBUG
+//#define ULTRACOPIER_PLUGIN_DEBUG
//#define ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
-#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+//#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW
#define ULTRACOPIER_PLUGIN_DEBUG_WINDOW_TIMER 150
#endif
@@ -18,18 +18,18 @@
#define ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL 100
#define ULTRACOPIER_PLUGIN_NUMSEMSPEEDMANAGEMENT 2
#define ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER 1
-#define ULTRACOPIER_PLUGIN_MINIMALYEAR 1995
+#define ULTRACOPIER_PLUGIN_MINIMALYEAR_TIMESTAMPS 788965200//1995
#define ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE 256 //in KB
#define ULTRACOPIER_PLUGIN_DEFAULT_SEQUENTIAL_NUMBER_OF_BLOCK 512
-#define ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK 4 //in KB
+#define ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK 128
#define ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE 16*1024 //in KB
#define ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK 2048
#define ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK 128 //in KB
//if set, check the inode type at scanFileOrFolder, deprecated into the new algorithm and not used
#define ULTRACOPIER_PLUGIN_CHECKLISTTYPE
-
#define ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+
//#define ULTRACOPIER_PLUGIN_RIGHTS
/** \brief Need be greater than 2, but greater than 20 to be efficient */
@@ -37,8 +37,6 @@
#define ULTRACOPIER_PLUGIN_TIME_UPDATE_PROGRESSION 200
#define ULTRACOPIER_PLUGIN_TIME_UPDATE_MOUNT_MS 60*1000
-//#define ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
-
#endif // VARIABLE_H
diff --git a/plugins/CopyEngine/Ultracopier/DebugDialog.cpp b/plugins/CopyEngine/Ultracopier-Spec/DebugDialog.cpp
index 0b3fec4..79e1088 100644..100755
--- a/plugins/CopyEngine/Ultracopier/DebugDialog.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/DebugDialog.cpp
@@ -4,6 +4,7 @@
#include "DebugDialog.h"
#include "ui_debugDialog.h"
+#include "CopyEngine.h"
#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
@@ -12,6 +13,8 @@ DebugDialog::DebugDialog(QWidget *parent) :
ui(new Ui::debugDialog)
{
ui->setupUi(this);
+ connect(&timer,&QTimer::timeout,this,&DebugDialog::updateOnTimer);
+ timer.start(200);
}
DebugDialog::~DebugDialog()
@@ -51,4 +54,10 @@ void DebugDialog::setTransferThreadList(const std::vector<std::string> &list)
}
}
+void DebugDialog::updateOnTimer()
+{
+ ui->alreadyExistsQueue->setValue(copyEngine->alreadyExistsQueue.size());
+ ui->errorQueue->setValue(copyEngine->errorQueue.size());
+}
+
#endif
diff --git a/plugins/CopyEngine/Ultracopier/DebugDialog.h b/plugins/CopyEngine/Ultracopier-Spec/DebugDialog.h
index c84cfaa..0da388e 100644..100755
--- a/plugins/CopyEngine/Ultracopier/DebugDialog.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/DebugDialog.h
@@ -10,11 +10,14 @@
#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
#include <QWidget>
+#include <QTimer>
namespace Ui {
class debugDialog;
}
+class CopyEngine;
+
/// \brief class to the dialog to have debug information
class DebugDialog : public QWidget
{
@@ -30,8 +33,14 @@ public:
void setActiveTransfer(const int &activeTransfer);
/// \brief show many many inode is manipulated
void setInodeUsage(const int &inodeUsage);
+
+ CopyEngine *copyEngine;
private:
Ui::debugDialog *ui;
+ QTimer timer;
+
+private slots:
+ void updateOnTimer();
};
#endif // ULTRACOPIER_PLUGIN_DEBUG_WINDOW
diff --git a/plugins/CopyEngine/Ultracopier/DebugEngineMacro.h b/plugins/CopyEngine/Ultracopier-Spec/DebugEngineMacro.h
index f9b5349..f9b5349 100644..100755
--- a/plugins/CopyEngine/Ultracopier/DebugEngineMacro.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/DebugEngineMacro.h
diff --git a/plugins/CopyEngine/Ultracopier/DiskSpace.cpp b/plugins/CopyEngine/Ultracopier-Spec/DiskSpace.cpp
index e9b996d..e9b996d 100644..100755
--- a/plugins/CopyEngine/Ultracopier/DiskSpace.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/DiskSpace.cpp
diff --git a/plugins/CopyEngine/Ultracopier/DiskSpace.h b/plugins/CopyEngine/Ultracopier-Spec/DiskSpace.h
index 5a923ab..5a923ab 100644..100755
--- a/plugins/CopyEngine/Ultracopier/DiskSpace.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/DiskSpace.h
diff --git a/plugins/CopyEngine/Ultracopier/DiskSpace.ui b/plugins/CopyEngine/Ultracopier-Spec/DiskSpace.ui
index 10b5c69..ebf380f 100644..100755
--- a/plugins/CopyEngine/Ultracopier/DiskSpace.ui
+++ b/plugins/CopyEngine/Ultracopier-Spec/DiskSpace.ui
@@ -15,7 +15,7 @@
</property>
<property name="windowIcon">
<iconset resource="copyEngineResources.qrc">
- <normaloff>:/CopyEngine/Ultracopier/resources/remove.png</normaloff>:/CopyEngine/Ultracopier/resources/remove.png</iconset>
+ <normaloff>:/CopyEngine/Ultracopier-Spec/resources/remove.png</normaloff>:/CopyEngine/Ultracopier-Spec/resources/remove.png</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/DriveManagement.cpp b/plugins/CopyEngine/Ultracopier-Spec/DriveManagement.cpp
new file mode 100755
index 0000000..148eabb
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/DriveManagement.cpp
@@ -0,0 +1,180 @@
+#include "DriveManagement.h"
+
+#include <QDir>
+#include <QFileInfoList>
+#include <QStorageInfo>
+
+#include "../../../cpp11addition.h"
+
+DriveManagement::DriveManagement()
+{
+ tryUpdate();
+ #ifdef Q_OS_WIN32
+ reg3=std::regex("^[a-zA-Z]:[\\\\/].*");
+ reg4=std::regex("^([a-zA-Z]:[\\\\/]).*$");
+ #endif
+ /// \warn ULTRACOPIER_DEBUGCONSOLE() don't work here because the sinal slot is not connected!
+}
+
+//get drive of an file or folder
+/// \todo do network drive support for windows
+std::string DriveManagement::getDrive(const std::string &fileOrFolder) const
+{
+ const std::string &inode=fileOrFolder;
+ Q_UNUSED(inode);
+ #ifdef Q_OS_WIN32
+ //optimized to windows version:
+ if(fileOrFolder.size()>=3)
+ {
+ if(fileOrFolder.at(1)==L':' && (fileOrFolder.at(2)==L'\\' || fileOrFolder.at(2)==L'/'))
+ {
+ char driveLetter=toupper(fileOrFolder.at(0));
+ return driveLetter+std::string(":/");
+ }
+ }
+
+ if(fileOrFolder.size()>=5)
+ {
+ char f1=fileOrFolder.at(0);
+ char f2=fileOrFolder.at(1);
+ if(f1=='/' || f1=='\\')
+ if(f2=='/' || f2=='\\')
+ {
+ bool postSeparador=false;
+ std::string post;
+ unsigned int index=2;
+ unsigned int s=2;
+ while(index<fileOrFolder.size())
+ {
+ const char c=fileOrFolder.at(index);
+ if(c=='/' || c=='\\')
+ {
+ if(postSeparador==false)
+ {
+ post="//"+fileOrFolder.substr(2,index-2);
+ postSeparador=true;
+ char c;
+ do
+ {
+ index++;
+ c=fileOrFolder.at(index);
+ } while((c=='/' || c=='\\') && index<fileOrFolder.size());
+ s=index;
+ }
+ else
+ return post+"/"+fileOrFolder.substr(s,index-s);
+ }
+ index++;
+ }
+ return post;
+ }
+ /*std::string returnString=fileOrFolder;
+ std::regex_replace(returnString,reg2,"$1");
+ return returnString;*/
+ }
+ //due to lack of WMI support into mingw, the new drive event is never called, this is a workaround
+ if(std::regex_match(fileOrFolder,reg3))
+ {
+ std::string returnString=fileOrFolder;
+ std::regex_replace(returnString,reg4,"$1");
+ return QDir::toNativeSeparators(QString::fromStdString(returnString)).toUpper().toStdString();
+ }
+ #else
+ int size=mountSysPoint.size();
+ for (int i = 0; i < size; ++i) {
+ if(stringStartWith(inode,mountSysPoint.at(i)))
+ return mountSysPoint.at(i);
+ }
+ #endif
+ //if unable to locate the right mount point
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"unable to locate the right mount point for: "+inode+", mount point: "+stringimplode(mountSysPoint,";"));
+ return std::string();
+}
+
+std::string DriveManagement::getDriveType(const std::string &drive) const
+{
+ int index=vectorindexOf(mountSysPoint,drive);
+ if(index!=-1)
+ return driveType.at(index);
+ return std::string();
+}
+
+bool DriveManagement::isSameDrive(const std::string &file1,const std::string &file2) const
+{
+ if(file1.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"file1 is empty");
+ return false;
+ }
+ if(file2.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"file2 is empty");
+ return false;
+ }
+ if(mountSysPoint.size()==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"no mount point found");
+ return false;
+ }
+ const std::string &drive1=getDrive(file1);
+ if(drive1.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"drive for the file1 not found: "+file1);
+ return false;
+ }
+ const std::string &drive2=getDrive(file2);
+ if(drive2.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"drive for the file2 not found: "+file2);
+ return false;
+ }
+ if(drive1==drive2)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,drive1+" is egal to "+drive2);
+ return true;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,drive1+" is NOT egal to "+drive2);
+ return false;
+ }
+}
+
+void DriveManagement::tryUpdate()
+{
+ mountSysPoint.clear();
+ driveType.clear();
+ std::vector<std::pair<std::string/*mountSysPoint*/,std::string/*driveType*/> > temp;
+ const QList<QStorageInfo> mountedVolumesList=QStorageInfo::mountedVolumes();
+ int index=0;
+ while(index<mountedVolumesList.size())
+ {
+ std::string mountSysPoint=QDir::toNativeSeparators(mountedVolumesList.at(index).rootPath()).toStdString();
+ #ifdef Q_OS_WIN32
+ std::string driveType;
+ if(mountSysPoint!="A:\\" && mountSysPoint!="A:/" && mountSysPoint!="A:" && mountSysPoint!="A" &&
+ mountSysPoint!="a:\\" && mountSysPoint!="a:/" && mountSysPoint!="a:" && mountSysPoint!="a")
+ {
+ const QByteArray &data=mountedVolumesList.at(index).fileSystemType();
+ driveType=std::string(data.constData(),data.size());
+ }
+ #else
+ const QByteArray &data=mountedVolumesList.at(index).fileSystemType();
+ std::string driveType=std::string(data.constData(),data.size());
+ #endif
+ temp.push_back(std::pair<std::string/*mountSysPoint*/,std::string/*driveType*/>(mountSysPoint,driveType));
+ index++;
+ }
+ /*sort larger to small mount point, to correctly detect it: /mnt, /
+ then /mnt/folder/file will be detected as /mnt
+ then /folder/file will be detected as / */
+ std::sort(temp.begin(), temp.end(), [](
+ std::pair<std::string/*mountSysPoint*/,std::string/*driveType*/> a,
+ std::pair<std::string/*mountSysPoint*/,std::string/*driveType*/> b) {
+ return a.first.size() > b.first.size();
+ });
+ for(const std::pair<std::string/*mountSysPoint*/,std::string/*driveType*/> &a : temp) {
+ mountSysPoint.push_back(a.first);
+ driveType.push_back(a.second);
+ }
+}
diff --git a/plugins/CopyEngine/Ultracopier/DriveManagement.h b/plugins/CopyEngine/Ultracopier-Spec/DriveManagement.h
index 8013b7c..24c8af6 100644..100755
--- a/plugins/CopyEngine/Ultracopier/DriveManagement.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/DriveManagement.h
@@ -18,13 +18,13 @@ public:
bool isSameDrive(const std::string &file1, const std::string &file2) const;
/// \brief get drive of an file or folder
std::string getDrive(const std::string &fileOrFolder) const;
- QByteArray getDriveType(const std::string &drive) const;
+ std::string getDriveType(const std::string &drive) const;
void tryUpdate();
protected:
- std::vector<std::string> mountSysPoint;
- std::vector<QByteArray> driveType;
+ std::vector<std::string> mountSysPoint;
+ std::vector<std::string> driveType;
#ifdef Q_OS_WIN32
- std::regex reg1,reg2,reg3,reg4;
+ std::regex reg3,reg4;
#endif
signals:
/// \brief To debug source
diff --git a/plugins/CopyEngine/Ultracopier/Environment.h b/plugins/CopyEngine/Ultracopier-Spec/Environment.h
index 34db2a2..9cb5732 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Environment.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/Environment.h
@@ -3,7 +3,7 @@
\author alpha_one_x86
\licence GPL3, see the file COPYING */
-#include "Variable.h"
+#include "CopyEngineUltracopier-SpecVariable.h"
/// \brief The global include
#include "StructEnumDefinition.h"
#include "StructEnumDefinition_CopyEngine.h"
diff --git a/plugins/CopyEngine/Ultracopier-Spec/EventLoop.cpp b/plugins/CopyEngine/Ultracopier-Spec/EventLoop.cpp
new file mode 100755
index 0000000..c2e237a
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/EventLoop.cpp
@@ -0,0 +1,71 @@
+#include "EventLoop.h"
+#include "CallBackEventLoop.h"
+
+#ifdef ASYNCFILEMANIP
+
+#ifdef Q_OS_LINUX
+#include <sys/epoll.h>
+#include <signal.h>
+#endif
+
+EventLoop EventLoop::eventLoop;
+
+EventLoop::EventLoop()
+{
+ int efd = epoll_create1(0);
+ if(efd==-1)
+ {
+ fprintf(stderr,"%s, errno %i\n", strerror(errno), errno);
+ abort();
+ }
+ //start();->put cpu at 100%
+ stopIt=false;
+}
+
+EventLoop::~EventLoop()
+{
+ stop();
+ QThread::wait();
+}
+
+void EventLoop::stop()
+{
+ stopIt=true;
+}
+
+void EventLoop::run()
+{
+ while(!stopIt)
+ {
+ int number_of_events = epoll_wait(efd, events, MAXEVENTS, -1);
+ if (-1 == number_of_events && EINTR == errno)
+ return;
+ for(int i = 0; i < number_of_events; i++)
+ static_cast<CallBackEventLoop *>(events[i].data.ptr)->callBack();
+ }
+}
+
+void EventLoop::watchSource(CallBackEventLoop * const object,const int &fd)
+{
+ epoll_event event;
+ event.events = EPOLLIN | EPOLLPRI | EPOLLERR | EPOLLET;
+ event.data.ptr = object;
+ if(epoll_ctl(efd, EPOLL_CTL_ADD, fd, &event)!=0)
+ {
+ printf("%s, errno %i\n", strerror(errno), errno);
+ //abort();
+ }
+}
+
+void EventLoop::watchDestination(CallBackEventLoop * const object,const int &fd)
+{
+ epoll_event event;
+ event.events = EPOLLOUT | EPOLLPRI | EPOLLERR | EPOLLET;
+ event.data.ptr = object;
+ if(epoll_ctl(efd, EPOLL_CTL_ADD, fd, &event)!=0)
+ {
+ printf("%s, errno %i\n", strerror(errno), errno);
+ //abort();
+ }
+}
+#endif
diff --git a/plugins/CopyEngine/Ultracopier-Spec/EventLoop.h b/plugins/CopyEngine/Ultracopier-Spec/EventLoop.h
new file mode 100755
index 0000000..3d68ce2
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/EventLoop.h
@@ -0,0 +1,30 @@
+#ifndef EVENTLOOP_H
+#define EVENTLOOP_H
+
+#include "Variable.h"
+
+#ifdef ASYNCFILEMANIP
+#include <QThread>
+#include "CallBackEventLoop.h"
+#include <sys/epoll.h>
+#define MAXEVENTS 64
+
+class EventLoop : public QThread
+{
+public:
+ EventLoop();
+ ~EventLoop();
+ static EventLoop eventLoop;
+ void watchSource(CallBackEventLoop * const object,const int &fd);
+ void watchDestination(CallBackEventLoop * const object,const int &fd);
+protected:
+ void run();
+ void stop();
+private:
+ epoll_event events[MAXEVENTS];
+ int efd;
+ bool stopIt;
+};
+#endif
+
+#endif // EVENTLOOP_H
diff --git a/plugins/CopyEngine/Ultracopier/FileErrorDialog.cpp b/plugins/CopyEngine/Ultracopier-Spec/FileErrorDialog.cpp
index d88fb90..587a889 100644..100755
--- a/plugins/CopyEngine/Ultracopier/FileErrorDialog.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/FileErrorDialog.cpp
@@ -1,12 +1,13 @@
#include "FileErrorDialog.h"
#include "ui_fileErrorDialog.h"
#include "TransferThread.h"
+#include "../../../cpp11addition.h"
#include <QString>
bool FileErrorDialog::isInAdmin=false;
-FileErrorDialog::FileErrorDialog(QWidget *parent, QFileInfo fileInfo, std::string errorString, const ErrorType &errorType) :
+FileErrorDialog::FileErrorDialog(QWidget *parent, INTERNALTYPEPATH fileInfo, std::string errorString, const ErrorType &errorType,FacilityInterface * facilityEngine) :
QDialog(parent),
ui(new Ui::fileErrorDialog)
{
@@ -20,58 +21,103 @@ FileErrorDialog::FileErrorDialog(QWidget *parent, QFileInfo fileInfo, std::strin
ui->setupUi(this);
action=FileError_Cancel;
ui->label_error->setText(QString::fromStdString(errorString));
- if(fileInfo.exists())
+#ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA fileInfoW;
+ if(GetFileAttributesExW(fileInfo.c_str(),GetFileExInfoStandard,&fileInfoW))
{
- ui->label_content_file_name->setText(QString::fromStdString(TransferThread::resolvedName(fileInfo)));
+ uint64_t mdate=fileInfoW.ftLastWriteTime.dwHighDateTime;
+ mdate<<=32;
+ mdate|=fileInfoW.ftLastWriteTime.dwLowDateTime;
+ uint64_t size=fileInfoW.nFileSizeHigh;
+ size<<=32;
+ size|=fileInfoW.nFileSizeLow;
+#else
+ struct stat p_statbuf;
+ if(stat(TransferThread::internalStringTostring(fileInfo).c_str(), &p_statbuf)==0)
+ {
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_MAC
+ uint64_t mdate=p_statbuf.st_mtimespec.tv_sec;
+ #else
+ uint64_t mdate=*reinterpret_cast<int64_t*>(&p_statbuf.st_mtim);
+ #endif
+ #else
+ uint64_t mdate=*reinterpret_cast<int64_t*>(&p_statbuf.st_mtime);
+ #endif
+ const uint64_t size=p_statbuf.st_size;
+#endif
+ ui->label_content_file_name->setText(
+ QString::fromStdString(
+ TransferThread::resolvedName(
+ TransferThread::internalStringTostring(fileInfo)
+ )
+ )
+ );
if(ui->label_content_file_name->text().isEmpty())
{
- ui->label_content_file_name->setText(fileInfo.absoluteFilePath());
+ ui->label_content_file_name->setText(QString::fromStdString(TransferThread::internalStringTostring(fileInfo)));
ui->label_folder->setVisible(false);
ui->label_content_folder->setVisible(false);
}
else
{
- QString folder=fileInfo.absolutePath();
+ std::string folder=TransferThread::internalStringTostring(fileInfo);
if(folder.size()>80)
- folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
- ui->label_content_folder->setText(fileInfo.absolutePath());
+ folder=folder.substr(0,38)+"..."+folder.substr(folder.size()-38);
+ ui->label_content_folder->setText(QString::fromStdString(FSabsolutePath(TransferThread::internalStringTostring(fileInfo))));
}
- ui->label_content_size->setText(QString::number(fileInfo.size()));
- QDateTime maxTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
- if(maxTime<fileInfo.lastModified())
+ ui->label_content_size->setText(QString::fromStdString(facilityEngine->sizeToString(size)));
+ if(ULTRACOPIER_PLUGIN_MINIMALYEAR_TIMESTAMPS<mdate)
{
ui->label_modified->setVisible(true);
ui->label_content_modified->setVisible(true);
- ui->label_content_modified->setText(fileInfo.lastModified().toString());
+ ui->label_content_modified->setText(QDateTime::fromMSecsSinceEpoch(mdate*1000).toString());
}
else
{
ui->label_modified->setVisible(false);
ui->label_content_modified->setVisible(false);
}
- if(fileInfo.isDir())
+ #ifdef Q_OS_WIN32
+ if(fileInfoW.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ #else
+ if(S_ISDIR(p_statbuf.st_mode))
+ #endif
{
this->setWindowTitle(tr("Error on folder"));
ui->label_size->hide();
ui->label_content_size->hide();
ui->label_file_name->setText(tr("Folder name"));
}
- ui->label_file_destination->setVisible(fileInfo.isSymLink());
- ui->label_content_file_destination->setVisible(fileInfo.isSymLink());
- if(fileInfo.isSymLink())
- ui->label_content_file_destination->setText(fileInfo.symLinkTarget());
+ #ifdef Q_OS_UNIX
+ ui->label_file_destination->setVisible(p_statbuf.st_mode==S_IFLNK);
+ ui->label_content_file_destination->setVisible(p_statbuf.st_mode==S_IFLNK);
+ if(S_ISLNK(p_statbuf.st_mode))
+ {
+ char buf[1024];
+ ssize_t len;
+ if ((len = readlink(TransferThread::internalStringTostring(fileInfo).c_str(), buf, sizeof(buf)-1)) != -1)
+ {
+ buf[len] = '\0';
+ ui->label_content_file_destination->setText(buf);
+ }
+ }
+ #else
+ ui->label_file_destination->setVisible(false);
+ ui->label_content_file_destination->setVisible(false);
+ #endif
}
else
{
- ui->label_content_file_name->setText(QString::fromStdString(TransferThread::resolvedName(fileInfo)));
+ ui->label_content_file_name->setText(QString::fromStdString(TransferThread::resolvedName(TransferThread::internalStringTostring(fileInfo))));
if(ui->label_content_file_name->text().isEmpty())
{
- ui->label_content_file_name->setText(fileInfo.absoluteFilePath());
+ ui->label_content_file_name->setText(QString::fromStdString(TransferThread::internalStringTostring(fileInfo)));
ui->label_folder->setVisible(false);
ui->label_content_folder->setVisible(false);
}
else
- ui->label_content_folder->setText(fileInfo.absolutePath());
+ ui->label_content_folder->setText(QString::fromStdString(FSabsolutePath(TransferThread::internalStringTostring(fileInfo))));
ui->label_file_destination->hide();
ui->label_content_file_destination->hide();
diff --git a/plugins/CopyEngine/Ultracopier/FileErrorDialog.h b/plugins/CopyEngine/Ultracopier-Spec/FileErrorDialog.h
index 133a8b0..635eebc 100644..100755
--- a/plugins/CopyEngine/Ultracopier/FileErrorDialog.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/FileErrorDialog.h
@@ -7,13 +7,18 @@
#include <QWidget>
#include <QString>
#include <QDateTime>
-#include <QFileInfo>
+#include <string>
#include "Environment.h"
+#include "../../../interface/FacilityInterface.h"
#ifndef FILEERRORDIALOG_H
#define FILEERRORDIALOG_H
-
+#ifdef WIDESTRING
+#define INTERNALTYPEPATH std::wstring
+#else
+#define INTERNALTYPEPATH std::string
+#endif
namespace Ui {
class fileErrorDialog;
@@ -25,7 +30,7 @@ class FileErrorDialog : public QDialog
Q_OBJECT
public:
/// \brief create the object and pass all the informations to it
- explicit FileErrorDialog(QWidget *parent,QFileInfo fileInfo,std::string errorString,const ErrorType &errorType);
+ explicit FileErrorDialog(QWidget *parent, INTERNALTYPEPATH fileInfo, std::string errorString, const ErrorType &errorType, FacilityInterface *facilityEngine);
~FileErrorDialog();
/// \brief return the the always checkbox is checked
bool getAlways();
diff --git a/plugins/CopyEngine/Ultracopier/FileExistsDialog.cpp b/plugins/CopyEngine/Ultracopier-Spec/FileExistsDialog.cpp
index 10b8543..e0d841e 100644..100755
--- a/plugins/CopyEngine/Ultracopier/FileExistsDialog.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/FileExistsDialog.cpp
@@ -1,6 +1,7 @@
#include "FileExistsDialog.h"
#include "ui_fileExistsDialog.h"
#include "TransferThread.h"
+#include "../../../cpp11addition.h"
#ifdef Q_OS_WIN32
#define CURRENTSEPARATOR "\\"
@@ -8,11 +9,11 @@
#define CURRENTSEPARATOR "/"
#endif
-#include <QRegularExpression>
-#include <QFileInfo>
#include <QMessageBox>
-FileExistsDialog::FileExistsDialog(QWidget *parent, QFileInfo source, QFileInfo destination, std::string firstRenamingRule, std::string otherRenamingRule) :
+FileExistsDialog::FileExistsDialog(QWidget *parent, INTERNALTYPEPATH source,
+ INTERNALTYPEPATH destination, std::string firstRenamingRule,
+ std::string otherRenamingRule,FacilityInterface * facilityEngine) :
QDialog(parent),
ui(new Ui::fileExistsDialog)
{
@@ -25,58 +26,111 @@ FileExistsDialog::FileExistsDialog(QWidget *parent, QFileInfo source, QFileInfo
ui->setupUi(this);
action=FileExists_Cancel;
- destinationInfo=destination;
- oldName=TransferThread::resolvedName(destination);
+ destinationInfo=TransferThread::internalStringTostring(destination);
+ oldName=TransferThread::resolvedName(TransferThread::internalStringTostring(destination));
ui->lineEditNewName->setText(QString::fromStdString(oldName));
ui->lineEditNewName->setPlaceholderText(QString::fromStdString(oldName));
+
ui->Overwrite->addAction(ui->actionOverwrite_if_newer);
+ ui->Overwrite->addAction(ui->actionOverwrite_if_older);
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(QString::fromStdString(TransferThread::resolvedName(source)));
- QString folder=source.absolutePath();
+ ui->Overwrite->addAction(ui->actionOverwrite_if_not_same_size);
+ ui->Overwrite->addAction(ui->actionOverwrite_if_not_same_size_and_date);
+
+ ui->label_content_source_file_name->setText(QString::fromStdString(TransferThread::resolvedName(TransferThread::internalStringTostring(source))));
+ std::string folder=TransferThread::internalStringTostring(FSabsolutePath(source));
if(folder.size()>80)
- folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
- ui->label_content_source_folder->setText(folder);
- 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(QString::fromStdString(TransferThread::resolvedName(destination)));
- folder=destination.absolutePath();
+ folder=folder.substr(0,38)+"..."+folder.substr(folder.size()-38);
+ ui->label_content_source_folder->setText(QString::fromStdString(folder));
+ ui->label_content_destination_file_name->setText(QString::fromStdString(TransferThread::resolvedName(TransferThread::internalStringTostring(destination))));
+ folder=TransferThread::internalStringTostring(FSabsolutePath(destination));
if(folder.size()>80)
- folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
- ui->label_content_destination_folder->setText(folder);
- QDateTime maxTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
- if(maxTime<source.lastModified())
+ folder=folder.substr(0,38)+"..."+folder.substr(folder.size()-38);
+ ui->label_content_destination_folder->setText(QString::fromStdString(folder));
+ //QDateTime maxTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
+#ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA sourceW;
+ if(GetFileAttributesExW(source.c_str(),GetFileExInfoStandard,&sourceW))
+ {
+ uint64_t mdate=sourceW.ftLastWriteTime.dwHighDateTime;
+ mdate<<=32;
+ mdate|=sourceW.ftLastWriteTime.dwLowDateTime;
+ uint64_t size=sourceW.nFileSizeHigh;
+ size<<=32;
+ size|=sourceW.nFileSizeLow;
+#else
+ struct stat source_statbuf;
+ #ifdef Q_OS_UNIX
+ if(lstat(TransferThread::internalStringTostring(source).c_str(), &source_statbuf)==0)
+ #else
+ if(stat(TransferThread::internalStringTostring(source).c_str(), &source_statbuf)==0)
+ #endif
{
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_MAC
+ const uint64_t mdate=source_statbuf.st_mtimespec.tv_sec;
+ #else
+ const uint64_t mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtim);
+ #endif
+ #else
+ const uint64_t mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtime);
+ #endif
+ const uint64_t size=source_statbuf.st_size;
+#endif
ui->label_source_modified->setVisible(true);
+ ui->label_content_source_size->setVisible(true);
+ ui->label_content_source_size->setText(QString::fromStdString(facilityEngine->sizeToString(size)));
ui->label_content_source_modified->setVisible(true);
- ui->label_content_source_modified->setText(source.lastModified().toString());
+ ui->label_content_source_modified->setText(QDateTime::fromMSecsSinceEpoch(mdate*1000).toString());
}
else
{
+ ui->label_content_source_size->setVisible(false);
+ ui->label_source_size->setVisible(false);
+ ui->label_source_modified->setVisible(false);
+ ui->label_content_source_modified->setVisible(false);
ui->label_source_modified->setVisible(false);
ui->label_content_source_modified->setVisible(false);
}
- if(maxTime<destination.lastModified())
+#ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA destinationW;
+ if(GetFileAttributesExW(destination.c_str(),GetFileExInfoStandard,&destinationW))
{
+ uint64_t mdate=destinationW.ftLastWriteTime.dwHighDateTime;
+ mdate<<=32;
+ mdate|=destinationW.ftLastWriteTime.dwLowDateTime;
+ uint64_t size=destinationW.nFileSizeHigh;
+ size<<=32;
+ size|=destinationW.nFileSizeLow;
+#else
+ struct stat destination_statbuf;
+ #ifdef Q_OS_UNIX
+ if(lstat(TransferThread::internalStringTostring(destination).c_str(), &destination_statbuf)==0)
+ #else
+ if(stat(TransferThread::internalStringTostring(destination).c_str(), &destination_statbuf)==0)
+ #endif
+ {
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_MAC
+ const uint64_t mdate=destination_statbuf.st_mtimespec.tv_sec;
+ #else
+ const uint64_t mdate=*reinterpret_cast<int64_t*>(&destination_statbuf.st_mtim);
+ #endif
+ #else
+ const uint64_t mdate=*reinterpret_cast<int64_t*>(&destination_statbuf.st_mtime);
+ #endif
+ const uint64_t size=destination_statbuf.st_size;
+#endif
ui->label_destination_modified->setVisible(true);
+ ui->label_content_destination_size->setVisible(true);
+ ui->label_content_destination_size->setText(QString::fromStdString(facilityEngine->sizeToString(size)));
ui->label_content_destination_modified->setVisible(true);
- ui->label_content_destination_modified->setText(destination.lastModified().toString());
+ ui->label_content_destination_modified->setText(QDateTime::fromMSecsSinceEpoch(mdate*1000).toString());
}
else
{
ui->label_destination_modified->setVisible(false);
ui->label_content_destination_modified->setVisible(false);
- }
- if(!source.exists())
- {
- ui->label_content_source_size->setVisible(false);
- ui->label_source_size->setVisible(false);
- ui->label_source_modified->setVisible(false);
- ui->label_content_source_modified->setVisible(false);
- }
- if(!destination.exists())
- {
ui->label_content_destination_size->setVisible(false);
ui->label_destination_size->setVisible(false);
ui->label_destination_modified->setVisible(false);
@@ -114,8 +168,8 @@ std::string FileExistsDialog::getNewName()
void FileExistsDialog::on_SuggestNewName_clicked()
{
- QFileInfo destinationInfo=this->destinationInfo;
- QString absolutePath=destinationInfo.absolutePath();
+ std::string destinationInfo=this->destinationInfo;
+ QString absolutePath=QString::fromStdString(FSabsolutePath(destinationInfo));
QString fileName=QString::fromStdString(TransferThread::resolvedName(destinationInfo));
QString suffix="";
QString destination;
@@ -148,11 +202,18 @@ void FileExistsDialog::on_SuggestNewName_clicked()
}
newFileName.replace(QStringLiteral("%name%"),fileName);
newFileName.replace(QStringLiteral("%suffix%"),suffix);
- destination=absolutePath+CURRENTSEPARATOR+newFileName;
- destinationInfo.setFile(destination);
+ destination=absolutePath;
+ if(!destination.endsWith('/')
+ #ifdef Q_OS_WIN32
+ && !destination.endsWith('\\')
+ #endif
+ )
+ destination+=CURRENTSEPARATOR;
+ destination+=newFileName;
+ destinationInfo=destination.toStdString();
num++;
}
- while(destinationInfo.exists());
+ while(TransferThread::exists(destinationInfo.c_str()));
ui->lineEditNewName->setText(newFileName);
}
@@ -188,7 +249,7 @@ void FileExistsDialog::on_actionOverwrite_if_newer_triggered()
void FileExistsDialog::on_actionOverwrite_if_not_same_modification_date_triggered()
{
- action=FileExists_OverwriteIfNotSame;
+ action=FileExists_OverwriteIfNotSameMdate;
this->close();
}
@@ -238,3 +299,15 @@ void FileExistsDialog::on_lineEditNewName_editingFinished()
{
updateRenameButton();
}
+
+void FileExistsDialog::on_actionOverwrite_if_not_same_size_triggered()
+{
+ action=FileExists_OverwriteIfNotSameSize;
+ this->close();
+}
+
+void FileExistsDialog::on_actionOverwrite_if_not_same_size_and_date_triggered()
+{
+ action=FileExists_OverwriteIfNotSameSizeAndDate;
+ this->close();
+}
diff --git a/plugins/CopyEngine/Ultracopier/FileExistsDialog.h b/plugins/CopyEngine/Ultracopier-Spec/FileExistsDialog.h
index 05ff7e0..ae3e02b 100644..100755
--- a/plugins/CopyEngine/Ultracopier/FileExistsDialog.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/FileExistsDialog.h
@@ -7,13 +7,19 @@
#include <QWidget>
#include <QString>
#include <QDateTime>
-#include <QFileInfo>
-#include <QDir>
+#include <string>
#include "Environment.h"
+#include "../../../interface/FacilityInterface.h"
#ifndef FILEEXISTSDIALOG_H
#define FILEEXISTSDIALOG_H
+#ifdef WIDESTRING
+#define INTERNALTYPEPATH std::wstring
+#else
+#define INTERNALTYPEPATH std::string
+#endif
+
namespace Ui {
class fileExistsDialog;
}
@@ -24,7 +30,7 @@ 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,std::string firstRenamingRule,std::string otherRenamingRule);
+ explicit FileExistsDialog(QWidget *parent, INTERNALTYPEPATH source, INTERNALTYPEPATH destination, std::string firstRenamingRule, std::string otherRenamingRule, FacilityInterface *facilityEngine);
~FileExistsDialog();
/// \brief return the the always checkbox is checked
bool getAlways();
@@ -48,11 +54,13 @@ private slots:
void on_lineEditNewName_returnPressed();
void on_actionOverwrite_if_older_triggered();
void on_lineEditNewName_editingFinished();
+ void on_actionOverwrite_if_not_same_size_triggered();
+ void on_actionOverwrite_if_not_same_size_and_date_triggered();
private:
Ui::fileExistsDialog *ui;
FileExistsAction action;
std::string oldName;
- QFileInfo destinationInfo;
+ std::string destinationInfo;
std::string firstRenamingRule;
std::string otherRenamingRule;
};
diff --git a/plugins/CopyEngine/Ultracopier/FileIsSameDialog.cpp b/plugins/CopyEngine/Ultracopier-Spec/FileIsSameDialog.cpp
index 7683d1d..69d63d0 100644..100755
--- a/plugins/CopyEngine/Ultracopier/FileIsSameDialog.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/FileIsSameDialog.cpp
@@ -1,6 +1,7 @@
#include "FileIsSameDialog.h"
#include "ui_fileIsSameDialog.h"
#include "TransferThread.h"
+#include "../../../cpp11addition.h"
#ifdef Q_OS_WIN32
#define CURRENTSEPARATOR "\\"
@@ -8,11 +9,10 @@
#define CURRENTSEPARATOR "/"
#endif
-#include <QRegularExpression>
-#include <QFileInfo>
#include <QMessageBox>
-FileIsSameDialog::FileIsSameDialog(QWidget *parent, QFileInfo fileInfo, std::string firstRenamingRule, std::string otherRenamingRule) :
+FileIsSameDialog::FileIsSameDialog(QWidget *parent, INTERNALTYPEPATH fileInfo,
+ std::string firstRenamingRule, std::string otherRenamingRule,FacilityInterface * facilityEngine) :
QDialog(parent),
ui(new Ui::fileIsSameDialog)
{
@@ -25,31 +25,60 @@ FileIsSameDialog::FileIsSameDialog(QWidget *parent, QFileInfo fileInfo, std::str
ui->setupUi(this);
action=FileExists_Cancel;
- oldName=TransferThread::resolvedName(fileInfo);
- destinationInfo=fileInfo;
+ oldName=TransferThread::resolvedName(TransferThread::internalStringTostring(fileInfo));
+ destinationInfo=TransferThread::internalStringTostring(fileInfo);
ui->lineEditNewName->setText(QString::fromStdString(oldName));
ui->lineEditNewName->setPlaceholderText(QString::fromStdString(oldName));
- ui->label_content_size->setText(QString::number(fileInfo.size()));
- ui->label_content_modified->setText(fileInfo.lastModified().toString());
- ui->label_content_file_name->setText(QString::fromStdString(TransferThread::resolvedName(fileInfo)));
- QString folder=fileInfo.absolutePath();
+ ui->label_content_file_name->setText(QString::fromStdString(TransferThread::resolvedName(TransferThread::internalStringTostring(fileInfo))));
+ std::string folder=FSabsolutePath(TransferThread::internalStringTostring(fileInfo));
if(folder.size()>80)
- folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
- ui->label_content_folder->setText(folder);
+ folder=folder.substr(0,38)+"..."+folder.substr(folder.size()-38);
+ ui->label_content_folder->setText(QString::fromStdString(folder));
updateRenameButton();
- QDateTime maxTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
- if(maxTime<fileInfo.lastModified())
+#ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA fileInfoW;
+ if(GetFileAttributesExW(fileInfo.c_str(),GetFileExInfoStandard,&fileInfoW))
{
- ui->label_modified->setVisible(true);
- ui->label_content_modified->setVisible(true);
- ui->label_content_modified->setText(fileInfo.lastModified().toString());
- }
- else
+ uint64_t mdate=fileInfoW.ftLastWriteTime.dwHighDateTime;
+ mdate<<=32;
+ mdate|=fileInfoW.ftLastWriteTime.dwLowDateTime;
+ uint64_t size=fileInfoW.nFileSizeHigh;
+ size<<=32;
+ size|=fileInfoW.nFileSizeLow;
+#else
+ struct stat source_statbuf;
+ #ifdef Q_OS_UNIX
+ if(lstat(TransferThread::internalStringTostring(fileInfo).c_str(), &source_statbuf)==0)
+ #else
+ if(stat(TransferThread::internalStringTostring(fileInfo).c_str(), &source_statbuf)==0)
+ #endif
{
- ui->label_modified->setVisible(false);
- ui->label_content_modified->setVisible(false);
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_MAC
+ const uint64_t mdate=source_statbuf.st_mtimespec.tv_sec;
+ #else
+ const uint64_t mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtim);
+ #endif
+ #else
+ const uint64_t mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtime);
+ #endif
+ const uint64_t size=source_statbuf.st_size;
+#endif
+ ui->label_content_size->setText(QString::fromStdString(facilityEngine->sizeToString(size)));
+ ui->label_content_size->setVisible(true);
+ if(ULTRACOPIER_PLUGIN_MINIMALYEAR_TIMESTAMPS<mdate)
+ {
+ ui->label_modified->setVisible(true);
+ ui->label_content_modified->setVisible(true);
+ ui->label_content_modified->setText(QDateTime::fromMSecsSinceEpoch(mdate*1000).toString());
+ }
+ else
+ {
+ ui->label_modified->setVisible(false);
+ ui->label_content_modified->setVisible(false);
+ }
}
- if(!fileInfo.exists())
+ else
{
ui->label_content_size->setVisible(false);
ui->label_size->setVisible(false);
@@ -88,8 +117,8 @@ std::string FileIsSameDialog::getNewName()
void FileIsSameDialog::on_SuggestNewName_clicked()
{
- QFileInfo destinationInfo=this->destinationInfo;
- QString absolutePath=destinationInfo.absolutePath();
+ std::string destinationInfo=this->destinationInfo;
+ QString absolutePath=QString::fromStdString(FSabsolutePath(destinationInfo));
QString fileName=QString::fromStdString(TransferThread::resolvedName(destinationInfo));
QString suffix="";
QString destination;
@@ -108,25 +137,32 @@ void FileIsSameDialog::on_SuggestNewName_clicked()
if(num==1)
{
if(firstRenamingRule.empty())
- newFileName=tr("%name% - copy");
+ newFileName=tr("%name% - copy%suffix%");
else
newFileName=QString::fromStdString(firstRenamingRule);
}
else
{
if(otherRenamingRule.empty())
- newFileName=tr("%name% - copy (%number%)");
+ newFileName=tr("%name% - copy (%number%)%suffix%");
else
newFileName=QString::fromStdString(otherRenamingRule);
newFileName.replace(QStringLiteral("%number%"),QString::number(num));
}
newFileName.replace(QStringLiteral("%name%"),fileName);
newFileName.replace(QStringLiteral("%suffix%"),suffix);
- destination=absolutePath+CURRENTSEPARATOR+newFileName+suffix;
- destinationInfo.setFile(destination);
+ destination=absolutePath;
+ if(!destination.endsWith('/')
+ #ifdef Q_OS_WIN32
+ && !destination.endsWith('\\')
+ #endif
+ )
+ destination+=CURRENTSEPARATOR;
+ destination+=newFileName;
+ destinationInfo=destination.toStdString();
num++;
}
- while(destinationInfo.exists());
+ while(TransferThread::exists(destinationInfo.c_str()));
ui->lineEditNewName->setText(newFileName);
}
diff --git a/plugins/CopyEngine/Ultracopier/FileIsSameDialog.h b/plugins/CopyEngine/Ultracopier-Spec/FileIsSameDialog.h
index 5dc0067..25a43b9 100644..100755
--- a/plugins/CopyEngine/Ultracopier/FileIsSameDialog.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/FileIsSameDialog.h
@@ -7,13 +7,19 @@
#include <QWidget>
#include <QString>
#include <QDateTime>
-#include <QFileInfo>
-#include <QDir>
+#include <string>
#include "Environment.h"
+#include "../../../interface/FacilityInterface.h"
#ifndef FILEISSAMEDIALOG_H
#define FILEISSAMEDIALOG_H
+#ifdef WIDESTRING
+#define INTERNALTYPEPATH std::wstring
+#else
+#define INTERNALTYPEPATH std::string
+#endif
+
namespace Ui {
class fileIsSameDialog;
}
@@ -24,7 +30,7 @@ class FileIsSameDialog : public QDialog
Q_OBJECT
public:
/// \brief create the object and pass all the informations to it
- explicit FileIsSameDialog(QWidget *parent,QFileInfo fileInfo,std::string firstRenamingRule,std::string otherRenamingRule);
+ explicit FileIsSameDialog(QWidget *parent, INTERNALTYPEPATH fileInfo, std::string firstRenamingRule, std::string otherRenamingRule, FacilityInterface *facilityEngine);
~FileIsSameDialog();
/// \brief return the the always checkbox is checked
bool getAlways();
@@ -48,7 +54,7 @@ private:
Ui::fileIsSameDialog *ui;
FileExistsAction action;
std::string oldName;
- QFileInfo destinationInfo;
+ std::string destinationInfo;
std::string firstRenamingRule;
std::string otherRenamingRule;
diff --git a/plugins/CopyEngine/Ultracopier/FilterRules.cpp b/plugins/CopyEngine/Ultracopier-Spec/FilterRules.cpp
index 0f6bf2c..965f5f3 100644..100755
--- a/plugins/CopyEngine/Ultracopier/FilterRules.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/FilterRules.cpp
@@ -47,9 +47,9 @@ ApplyOn FilterRules::get_apply_on()
{
case 0:
return ApplyOn_file;
- case 1:
- return ApplyOn_fileAndFolder;
case 2:
+ return ApplyOn_fileAndFolder;
+ case 1:
return ApplyOn_folder;
}
return ApplyOn_fileAndFolder;
@@ -89,10 +89,10 @@ void FilterRules::set_apply_on(ApplyOn apply_on)
ui->apply_on->setCurrentIndex(0);
break;
case ApplyOn_fileAndFolder:
- ui->apply_on->setCurrentIndex(1);
+ ui->apply_on->setCurrentIndex(2);
break;
case ApplyOn_folder:
- ui->apply_on->setCurrentIndex(2);
+ ui->apply_on->setCurrentIndex(1);
break;
}
}
@@ -117,7 +117,7 @@ void FilterRules::updateChecking()
QString tempString;
if(ui->search_type->currentIndex()==0)
{
- tempString=QRegularExpression::escape(ui->search->text());
+ //tempString=QRegularExpression::escape(ui->search->text()); -> generate bug because escape contains slash
if(tempString.contains('/') || tempString.contains('\\'))
isValid=false;
}
@@ -191,3 +191,9 @@ void FilterRules::on_buttonBox_clicked(QAbstractButton *button)
accept();
}
}
+
+void FilterRules::on_search_textChanged(const QString &arg1)
+{
+ Q_UNUSED(arg1);
+ updateChecking();
+}
diff --git a/plugins/CopyEngine/Ultracopier/FilterRules.h b/plugins/CopyEngine/Ultracopier-Spec/FilterRules.h
index 0838792..e57ea97 100644..100755
--- a/plugins/CopyEngine/Ultracopier/FilterRules.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/FilterRules.h
@@ -36,6 +36,7 @@ private slots:
void on_search_type_currentIndexChanged(int index);
void on_need_match_all_clicked();
void on_buttonBox_clicked(QAbstractButton *button);
+ void on_search_textChanged(const QString &arg1);
private:
Ui::FilterRules *ui;
void updateChecking();
diff --git a/plugins/CopyEngine/Ultracopier/FilterRules.ui b/plugins/CopyEngine/Ultracopier-Spec/FilterRules.ui
index a4006fe..a4006fe 100644..100755
--- a/plugins/CopyEngine/Ultracopier/FilterRules.ui
+++ b/plugins/CopyEngine/Ultracopier-Spec/FilterRules.ui
diff --git a/plugins/CopyEngine/Ultracopier/Filters.cpp b/plugins/CopyEngine/Ultracopier-Spec/Filters.cpp
index c7b1526..214896c 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Filters.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/Filters.cpp
@@ -16,10 +16,10 @@ Filters::~Filters()
delete ui;
}
-void Filters::setFilters(std::vector<std::string> includeStrings,std::vector<std::string> includeOptions,std::vector<std::string> excludeStrings,std::vector<std::string> excludeOptions)
+bool Filters::setFilters(std::vector<std::string> includeStrings,std::vector<std::string> includeOptions,std::vector<std::string> excludeStrings,std::vector<std::string> excludeOptions)
{
if(includeStrings.size()!=includeOptions.size() || excludeStrings.size()!=excludeOptions.size())
- return;
+ return false;
Filters_rules new_item;
include.clear();
@@ -77,6 +77,7 @@ void Filters::setFilters(std::vector<std::string> includeStrings,std::vector<std
}
reShowAll();
+ return true;
}
void Filters::reShowAll()
@@ -269,9 +270,12 @@ bool Filters::convertToRegex(Filters_rules &item)
std::string tempString;
if(item.search_type==SearchType_rawText)
{
+ //here to validate below the regex
tempString=QRegularExpression::escape(QString::fromStdString(item.search_text)).toStdString();
- if(tempString.find('/') != std::string::npos || tempString.find('\\') != std::string::npos)
- isValid=false;
+ //do search on string only on file or file and folder, QRegularExpression::escape() introduce \ on special char
+ if(item.apply_on!=ApplyOn::ApplyOn_folder)
+ if(item.search_text.find('/') != std::string::npos || item.search_text.find('\\') != std::string::npos)
+ isValid=false;
}
else if(item.search_type==SearchType_simpleRegex)
{
diff --git a/plugins/CopyEngine/Ultracopier/Filters.h b/plugins/CopyEngine/Ultracopier-Spec/Filters.h
index 6645afc..60e2277 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Filters.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/Filters.h
@@ -18,7 +18,7 @@ class Filters : public QDialog
public:
explicit Filters(QWidget *parent = 0);
~Filters();
- void setFilters(std::vector<std::string> includeStrings, std::vector<std::string> includeOptions, std::vector<std::string> excludeStrings, std::vector<std::string> excludeOptions);
+ bool setFilters(std::vector<std::string> includeStrings, std::vector<std::string> includeOptions, std::vector<std::string> excludeStrings, std::vector<std::string> excludeOptions);
void reShowAll();
std::vector<Filters_rules> getInclude() const;
std::vector<Filters_rules> getExclude() const;
diff --git a/plugins/CopyEngine/Ultracopier/Filters.ui b/plugins/CopyEngine/Ultracopier-Spec/Filters.ui
index 33822af..ed6a0a2 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Filters.ui
+++ b/plugins/CopyEngine/Ultracopier-Spec/Filters.ui
@@ -14,14 +14,23 @@
<string>Filters</string>
</property>
<property name="windowIcon">
- <iconset resource="resources.qrc">
- <normaloff>:/CopyEngine/Ultracopier/resources/filter.png</normaloff>:/CopyEngine/Ultracopier/resources/filter.png</iconset>
+ <iconset resource="copyEngineResources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier-Spec/resources/filter.png</normaloff>:/CopyEngine/Ultracopier-Spec/resources/filter.png</iconset>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>1</number>
</property>
- <property name="margin">
+ <property name="leftMargin">
+ <number>1</number>
+ </property>
+ <property name="topMargin">
+ <number>1</number>
+ </property>
+ <property name="rightMargin">
+ <number>1</number>
+ </property>
+ <property name="bottomMargin">
<number>1</number>
</property>
<item>
@@ -33,7 +42,16 @@
<property name="spacing">
<number>1</number>
</property>
- <property name="margin">
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
<number>2</number>
</property>
<item>
@@ -48,24 +66,24 @@
<item>
<widget class="QToolButton" name="add_exclusion">
<property name="icon">
- <iconset resource="resources.qrc">
- <normaloff>:/CopyEngine/Ultracopier/resources/add.png</normaloff>:/CopyEngine/Ultracopier/resources/add.png</iconset>
+ <iconset resource="copyEngineResources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier-Spec/resources/add.png</normaloff>:/CopyEngine/Ultracopier-Spec/resources/add.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="edit_exclusion">
<property name="icon">
- <iconset resource="resources.qrc">
- <normaloff>:/CopyEngine/Ultracopier/resources/edit.png</normaloff>:/CopyEngine/Ultracopier/resources/edit.png</iconset>
+ <iconset resource="copyEngineResources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier-Spec/resources/edit.png</normaloff>:/CopyEngine/Ultracopier-Spec/resources/edit.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="remove_exclusion">
<property name="icon">
- <iconset resource="resources.qrc">
- <normaloff>:/CopyEngine/Ultracopier/resources/remove.png</normaloff>:/CopyEngine/Ultracopier/resources/remove.png</iconset>
+ <iconset resource="copyEngineResources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier-Spec/resources/remove.png</normaloff>:/CopyEngine/Ultracopier-Spec/resources/remove.png</iconset>
</property>
</widget>
</item>
@@ -96,7 +114,16 @@
<property name="spacing">
<number>1</number>
</property>
- <property name="margin">
+ <property name="leftMargin">
+ <number>2</number>
+ </property>
+ <property name="topMargin">
+ <number>2</number>
+ </property>
+ <property name="rightMargin">
+ <number>2</number>
+ </property>
+ <property name="bottomMargin">
<number>2</number>
</property>
<item>
@@ -120,24 +147,24 @@
<item>
<widget class="QToolButton" name="add_inclusion">
<property name="icon">
- <iconset resource="resources.qrc">
- <normaloff>:/CopyEngine/Ultracopier/resources/add.png</normaloff>:/CopyEngine/Ultracopier/resources/add.png</iconset>
+ <iconset resource="copyEngineResources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier-Spec/resources/add.png</normaloff>:/CopyEngine/Ultracopier-Spec/resources/add.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="edit_inclusion">
<property name="icon">
- <iconset resource="resources.qrc">
- <normaloff>:/CopyEngine/Ultracopier/resources/edit.png</normaloff>:/CopyEngine/Ultracopier/resources/edit.png</iconset>
+ <iconset resource="copyEngineResources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier-Spec/resources/edit.png</normaloff>:/CopyEngine/Ultracopier-Spec/resources/edit.png</iconset>
</property>
</widget>
</item>
<item>
<widget class="QToolButton" name="remove_inclusion">
<property name="icon">
- <iconset resource="resources.qrc">
- <normaloff>:/CopyEngine/Ultracopier/resources/remove.png</normaloff>:/CopyEngine/Ultracopier/resources/remove.png</iconset>
+ <iconset resource="copyEngineResources.qrc">
+ <normaloff>:/CopyEngine/Ultracopier-Spec/resources/remove.png</normaloff>:/CopyEngine/Ultracopier-Spec/resources/remove.png</iconset>
</property>
</widget>
</item>
@@ -188,7 +215,7 @@
</layout>
</widget>
<resources>
- <include location="resources.qrc"/>
+ <include location="copyEngineResources.qrc"/>
</resources>
<connections/>
</ui>
diff --git a/plugins/CopyEngine/Ultracopier/FolderExistsDialog.cpp b/plugins/CopyEngine/Ultracopier-Spec/FolderExistsDialog.cpp
index 59466ed..f37acd1 100644..100755
--- a/plugins/CopyEngine/Ultracopier/FolderExistsDialog.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/FolderExistsDialog.cpp
@@ -1,6 +1,7 @@
#include "FolderExistsDialog.h"
#include "ui_folderExistsDialog.h"
#include "TransferThread.h"
+#include "../../../cpp11addition.h"
#ifdef Q_OS_WIN32
#define CURRENTSEPARATOR "\\"
@@ -9,10 +10,9 @@
#endif
#include <QMessageBox>
-#include <QFileInfo>
-#include <QMessageBox>
-FolderExistsDialog::FolderExistsDialog(QWidget *parent, QFileInfo source, bool isSame, QFileInfo destination, std::string firstRenamingRule, std::string otherRenamingRule) :
+FolderExistsDialog::FolderExistsDialog(QWidget *parent, INTERNALTYPEPATH source, bool isSame, INTERNALTYPEPATH destination,
+ std::string firstRenamingRule, std::string otherRenamingRule) :
QDialog(parent),
ui(new Ui::folderExistsDialog)
{
@@ -25,15 +25,42 @@ FolderExistsDialog::FolderExistsDialog(QWidget *parent, QFileInfo source, bool i
ui->setupUi(this);
action=FolderExists_Cancel;
- oldName=TransferThread::resolvedName(destination);
+ oldName=TransferThread::resolvedName(TransferThread::internalStringTostring(destination));
ui->lineEditNewName->setText(QString::fromStdString(oldName));
ui->lineEditNewName->setPlaceholderText(QString::fromStdString(oldName));
- ui->label_content_source_modified->setText(source.lastModified().toString());
- ui->label_content_source_folder_name->setText(source.fileName());
- QString folder=source.absolutePath();
+#ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA fileInfoW;
+ if(GetFileAttributesExW(source.c_str(),GetFileExInfoStandard,&fileInfoW))
+ {
+ uint64_t mdate=fileInfoW.ftLastWriteTime.dwHighDateTime;
+ mdate<<=32;
+ mdate|=fileInfoW.ftLastWriteTime.dwLowDateTime;
+ uint64_t size=fileInfoW.nFileSizeHigh;
+ size<<=32;
+ size|=fileInfoW.nFileSizeLow;
+#else
+ struct stat source_statbuf;
+ if(TransferThread::exists(source))
+ {
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_MAC
+ const uint64_t mdate=source_statbuf.st_mtimespec.tv_sec;
+ #else
+ const uint64_t mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtim);
+ #endif
+ #else
+ const uint64_t mdate=*reinterpret_cast<int64_t*>(&source_statbuf.st_mtime);
+ #endif
+#endif
+ ui->label_content_source_modified->setText(QDateTime::fromMSecsSinceEpoch(mdate*1000).toString());
+ }
+ else
+ ui->label_content_source_modified->hide();
+ ui->label_content_source_folder_name->setText(QString::fromStdString(TransferThread::resolvedName(TransferThread::internalStringTostring(source))));
+ std::string folder=TransferThread::internalStringTostring(FSabsolutePath(source));
if(folder.size()>80)
- folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
- ui->label_content_source_folder->setText(folder);
+ folder=folder.substr(0,38)+"..."+folder.substr(folder.size()-38);
+ ui->label_content_source_folder->setText(QString::fromStdString(folder));
if(ui->label_content_source_folder_name->text().isEmpty())
{
ui->label_source_folder_name->hide();
@@ -41,7 +68,7 @@ FolderExistsDialog::FolderExistsDialog(QWidget *parent, QFileInfo source, bool i
}
if(isSame)
{
- this->destinationInfo=source;
+ this->destinationInfo=TransferThread::internalStringTostring(source);
ui->label_source->hide();
ui->label_destination->hide();
ui->label_destination_modified->hide();
@@ -53,14 +80,29 @@ FolderExistsDialog::FolderExistsDialog(QWidget *parent, QFileInfo source, bool i
}
else
{
- this->destinationInfo=destination;
+ this->destinationInfo=TransferThread::internalStringTostring(destination);
this->setWindowTitle(tr("Folder already exists"));
- ui->label_content_destination_modified->setText(destination.lastModified().toString());
- ui->label_content_destination_folder_name->setText(destination.fileName());
- QString folder=destination.absolutePath();
+ struct stat destination_statbuf;
+ if(TransferThread::exists(destination))
+ {
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_MAC
+ const uint64_t mdate=destination_statbuf.st_mtimespec.tv_sec;
+ #else
+ const uint64_t mdate=*reinterpret_cast<int64_t*>(&destination_statbuf.st_mtim);
+ #endif
+ #else
+ const uint64_t mdate=*reinterpret_cast<int64_t*>(&destination_statbuf.st_mtime);
+ #endif
+ ui->label_content_destination_modified->setText(QDateTime::fromMSecsSinceEpoch(mdate*1000).toString());
+ }
+ else
+ ui->label_content_destination_modified->hide();
+ ui->label_content_destination_folder_name->setText(QString::fromStdString(TransferThread::resolvedName(TransferThread::internalStringTostring(destination))));
+ std::string folder=TransferThread::internalStringTostring(FSabsolutePath(destination));
if(folder.size()>80)
- folder=folder.mid(0,38)+"..."+folder.mid(folder.size()-38);
- ui->label_content_destination_folder->setText(folder);
+ folder=folder.substr(0,38)+"..."+folder.substr(folder.size()-38);
+ ui->label_content_destination_folder->setText(QString::fromStdString(folder));
if(ui->label_content_destination_folder_name->text().isEmpty())
{
ui->label_destination_folder_name->hide();
@@ -99,8 +141,8 @@ std::string FolderExistsDialog::getNewName()
void FolderExistsDialog::on_SuggestNewName_clicked()
{
- QFileInfo destinationInfo=this->destinationInfo;
- QString absolutePath=destinationInfo.absolutePath();
+ std::string destinationInfo=this->destinationInfo;
+ QString absolutePath=QString::fromStdString(FSabsolutePath(destinationInfo));
QString fileName=QString::fromStdString(TransferThread::resolvedName(destinationInfo));
QString suffix;
QString destination;
@@ -119,7 +161,7 @@ void FolderExistsDialog::on_SuggestNewName_clicked()
if(num==1)
{
if(firstRenamingRule.empty())
- newFileName=tr("%name% - copy");
+ newFileName=tr("%name% - copy%suffix%");
else
{
newFileName=QString::fromStdString(firstRenamingRule);
@@ -128,17 +170,25 @@ void FolderExistsDialog::on_SuggestNewName_clicked()
else
{
if(otherRenamingRule.empty())
- newFileName=tr("%name% - copy (%number%)");
+ newFileName=tr("%name% - copy (%number%)%suffix%");
else
newFileName=QString::fromStdString(otherRenamingRule);
newFileName.replace(QStringLiteral("%number%"),QString::number(num));
}
newFileName.replace(QStringLiteral("%name%"),fileName);
- destination=absolutePath+CURRENTSEPARATOR+newFileName+suffix;
- destinationInfo.setFile(destination);
+ newFileName.replace(QStringLiteral("%suffix%"),suffix);
+ destination=absolutePath;
+ if(!destination.endsWith('/')
+ #ifdef Q_OS_WIN32
+ && !destination.endsWith('\\')
+ #endif
+ )
+ destination+=CURRENTSEPARATOR;
+ destination+=newFileName;
+ destinationInfo=destination.toStdString();
num++;
}
- while(destinationInfo.exists());
+ while(TransferThread::exists(destinationInfo.c_str()));
ui->lineEditNewName->setText(newFileName);
}
@@ -190,7 +240,7 @@ void FolderExistsDialog::on_lineEditNewName_returnPressed()
QMessageBox::warning(this,tr("Error"),tr("Try rename with using special characters"));
}
-void FolderExistsDialog::on_lineEditNewName_textChanged(const std::string &arg1)
+void FolderExistsDialog::on_lineEditNewName_textChanged(const QString &arg1)
{
Q_UNUSED(arg1);
updateRenameButton();
diff --git a/plugins/CopyEngine/Ultracopier/FolderExistsDialog.h b/plugins/CopyEngine/Ultracopier-Spec/FolderExistsDialog.h
index a3bcf67..8681ba6 100644..100755
--- a/plugins/CopyEngine/Ultracopier/FolderExistsDialog.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/FolderExistsDialog.h
@@ -7,10 +7,7 @@
#define FOLDERISSAMEDIALOG_H
#include <QDialog>
-#include <QFileInfo>
-#include <QString>
-#include <QDateTime>
-#include <QDir>
+#include <string>
#include "Environment.h"
@@ -18,6 +15,12 @@ namespace Ui {
class folderExistsDialog;
}
+#ifdef WIDESTRING
+#define INTERNALTYPEPATH std::wstring
+#else
+#define INTERNALTYPEPATH std::string
+#endif
+
/// \brief to show file exists dialog, and ask what do
class FolderExistsDialog : public QDialog
{
@@ -25,7 +28,7 @@ class FolderExistsDialog : public QDialog
public:
/// \brief create the object and pass all the informations to it
- explicit FolderExistsDialog(QWidget *parent,QFileInfo source,bool isSame,QFileInfo destination,std::string firstRenamingRule,std::string otherRenamingRule);
+ explicit FolderExistsDialog(QWidget *parent,INTERNALTYPEPATH source,bool isSame,INTERNALTYPEPATH destination,std::string firstRenamingRule,std::string otherRenamingRule);
~FolderExistsDialog();
/// \brief return the the always checkbox is checked
bool getAlways();
@@ -44,14 +47,14 @@ private slots:
void on_Merge_clicked();
void on_lineEditNewName_editingFinished();
void on_lineEditNewName_returnPressed();
- void on_lineEditNewName_textChanged(const std::string &arg1);
+ void on_lineEditNewName_textChanged(const QString &arg1);
private:
Ui::folderExistsDialog *ui;
FolderExistsAction action;
std::string oldName;
std::string firstRenamingRule;
std::string otherRenamingRule;
- QFileInfo destinationInfo;
+ std::string destinationInfo;
};
#endif // FOLDERISSAMEDIALOG_H
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/ar/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/ar/translation.qm
new file mode 100755
index 0000000..a48b608
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/ar/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/ar/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/ar/translation.ts
new file mode 100755
index 0000000..a94fa18
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/ar/translation.ts
@@ -0,0 +1,1147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1" language="ar_JO">
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation>تم إجبار المحرك على الحركة ، لا يمكنك نسخه</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation>تم إجبار المحرك على النسخ ، لا يمكنك التحرك معه</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Destination</source>
+ <translation>الوجهه</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation>استخدام الوجهة الفعلية &quot;%1&quot; ؟</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="685"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation>تم فرض الوضع مسبقا. هذا خطا داخلي ، الرجاء الإبلاغ عنه</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
+ <source>Ask</source>
+ <translation>اسال</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
+ <source>Skip</source>
+ <translation>تخطي</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="980"/>
+ <source>Merge</source>
+ <translation>دمج</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
+ <source>Rename</source>
+ <translation>اعاده تسميه</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="986"/>
+ <source>Put at the end</source>
+ <translation>وضع في نهاية</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="990"/>
+ <source>Overwrite</source>
+ <translation>الكتابة فوق</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="991"/>
+ <source>Overwrite if different</source>
+ <translation>الكتابة فوق إذا كان مختلفا</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="992"/>
+ <source>Overwrite if newer</source>
+ <translation>الكتابة فوق إذا كان أحدث</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="993"/>
+ <source>Overwrite if older</source>
+ <translation>الكتابة فوق إذا كان أقدم</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options error</source>
+ <translation>خطا في الخيارات</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation>لم يتم تحميل محرك الخيارات. غير قادر علي الوصول إلى الفلاتر</translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <source>Ask</source>
+ <translation>اسال</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <source>Skip</source>
+ <translation>تخطي</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Merge</source>
+ <translation>دمج</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
+ <source>Rename</source>
+ <translation>اعاده تسميه</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Put at the end</source>
+ <translation>وضع في نهاية</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <source>Overwrite</source>
+ <translation>الكتابة فوق</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <source>Overwrite if different</source>
+ <translation>الكتابة فوق إذا كان مختلفا</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
+ <source>Overwrite if newer</source>
+ <translation>الكتابة فوق إذا كان أحدث</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
+ <source>Overwrite if older</source>
+ <translation>الكتابة فوق إذا كان أقدم</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options error</source>
+ <translation>خطا في الخيارات</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation>لم يتم تحميل محرك الخيارات. غير قادر علي الوصول إلى الفلاتر</translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation>لم يتم تحميل محرك الخيارات. غير قادر علي الوصول إلى الفلاتر</translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation>مساحة القرص</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation>تحتاج مساحة أكبر على محرك الاقراص هذا لإنهاء هذا النقل</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation>مواصله</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation>إلغاء الأمر</translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation>تتوفر %2 محركات الاقراص %1 ولكن تحتاج %3</translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
+ <source>Error on folder</source>
+ <translation>خطأ في المجلد</translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
+ <source>Folder name</source>
+ <translation>اسم المجلد</translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>% اسم%-نسخ% لاحقه%</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>(% الاسم%-النسخ (% العدد%% اللاحق +ه%</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Error</source>
+ <translation>الخطا</translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Try rename with using special characters</source>
+ <translation>حاول أعاده تسميه باستخدام أحرف خاصه</translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>% اسم%-نسخ% لاحقه%</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>(% الاسم%-النسخ (% العدد%% اللاحق +ه%</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Error</source>
+ <translation>الخطا</translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Try rename with using special characters</source>
+ <translation>حاول أعاده تسميه باستخدام أحرف خاصه</translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation>بحث:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation>نوع البحث:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation>نص خام</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation>Simplified regex</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Perl&apos;s regex</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation>تنطبق على:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation>ملف</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation>مجلد</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation>ملف ومجلد</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation>سلسله اختبار يطابق مع regex</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation>التحقق</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation>سلسله الاختبار:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation>حوار الفلاتر</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation>يجب ان تتطابق السلسلة الكاملة</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation>regex صالحة</translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation>فلاتر</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="39"/>
+ <source>Exclusion filters</source>
+ <translation>فلاتر الاستبعاد</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="111"/>
+ <source>Inclusion filters</source>
+ <translation>فلاتر مدرجة</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="132"/>
+ <source>None = Include all</source>
+ <translation>بلا = تضمين الكل</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
+ <source>Raw text</source>
+ <translation>نص خام</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
+ <source>Simplified regex</source>
+ <translation>المبسطة regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Perl&apos;s regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
+ <source>Only on file</source>
+ <translation>فقط في الملف</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
+ <source>Only on folder</source>
+ <translation>فقط في المجلد</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
+ <source>Full match</source>
+ <translation>تطابق كامل</translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
+ <source>Folder already exists</source>
+ <translation>المجلد موجود بالفعل</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>% اسم%-نسخ% لاحقه%</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>(% الاسم%-النسخ (% العدد%% اللاحق +ه%</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Error</source>
+ <translation>الخطا</translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Try rename with using special characters</source>
+ <translation>حاول أعاده التسميه باستخدام أحرف خاصه</translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation>غير قادر علي القيام بنقل المادة أو نسخه إلى وضع إجباري غير صحيح: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation>غير قادر على حفظ قائمه النقل: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation>مشكلة في قراءة الملف ، أو حجم الملف هو 0</translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation>العنوان الرأسي الخاطئ: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation>قائمة النقل في الوضع المختلط ، ولكن هذا المثيل ليس في هذا الوضع</translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation>قائمه النقل في وضع النسخ ولكن هذا المثيل غير في هذا الوضع</translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation>قائمه النقل في وضع النقل ، ولكن هذا المثيل ليس في هذا الوضع</translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation>عثر على بعض الأخطاء اثناء تحليل الخط</translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation>غير قادر على فتح قائمه النقل: %1</translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
+ <source>Unable to create the folder</source>
+ <translation>غير قادر على إنشاء المجلد</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="227"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation>مجلد المصدر غير موجود</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="255"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation>غير قادر على أعاده تسميه المجلد المؤقت</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="278"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation>غير قادر على القيام بالخطوة الحقيقية النهائية المجلد</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="309"/>
+ <source>Unable to move the folder</source>
+ <translation>غير قادر على نقل المجلد</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation>errno: %1 :غير قادر على نقل المجلد</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
+ <source>Unable to remove</source>
+ <translation>غير قادر على أزاله</translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
+ <source>Internal error, please report it!</source>
+ <translation>خطا داخلي ، يرجى الإبلاغ عن ذلك!</translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
+ <source>Unable to read the source file: </source>
+ <translation>غير قادر على قراءه الملف المصدر:</translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation>تم اقتطاع الملف اثناء القراءة ، وتغيير البيانات المحتملة</translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="35"/>
+ <source>First renaming</source>
+ <translation>أعاده التسمية الاولي</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="41"/>
+ <source>%name% - copy%suffix%</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation>% اسم%-نسخ% لاحقه%</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="57"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation>% الاسم%-النسخ (% العدد%% اللاحق +ه%)</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="67"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation>&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;لاحقه الملف&lt;/span&gt;%لاحقه%&lt;span style=&quot; font-weight:600;&quot;&gt;للعدد الإضافي ،&lt;/span&gt;%عدد%&lt;span style=&quot; font-weight:600;&quot;&gt;لاسم الملف الأصلي ،&lt;/span&gt;%اسم%&lt;span style=&quot; font-weight:600;&quot;&gt;المتغيرات: &lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="51"/>
+ <source>Second renaming</source>
+ <translation>أعاده تسميه ثانيه</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>أعاده تسميه القواعد</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation>%1 - نسخ (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation>%1-نسخ (%2) %3</translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
+ <source>%1 - copy</source>
+ <translation>%1-نسخ</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - نسخ (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
+ <source>%name% - copy</source>
+ <translation>%اسم% - نسخ</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
+ <source>%name% - copy (%number%)</source>
+ <translation>% الاسم%-النسخة (% العدد%)</translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation>مشكله في قراءه المجلد</translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>% اسم%-نسخ% لاحقه%</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>(% الاسم%-النسخ (% العدد%% اللاحق +ه%</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation>الملف غير موجود</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
+ <translation>غير قادر على تغيير التاريخ</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
+ <translation>حاول أعاده تسميه باستخدام أحرف خاصه</translation>
+ </message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation>تاريخ تعديل خاطئ أو غير قادر علي الحصول عليه ، يمكنك تعطيل نقل الوقت للقيام بذلك</translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished">غير قادر على إنشاء مجلد الوجهة:</translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished">errno: %1 غير قادر علي إنشاء المجلد الوجهة</translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation>(خطأ في دقة المسار (مسار فارغ</translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation>غير قادر على إنشاء مجلد الوجهة:</translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation>errno: %1 غير قادر علي إنشاء المجلد الوجهة</translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation>خطا داخلي ، يرجى الإبلاغ عن ذلك!</translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Transfer</source>
+ <translation>نقل</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
+ <source>Move the whole folder</source>
+ <translation>نقل المجلد بأكمله</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
+ <source>Transfer the file rights</source>
+ <translation>نقل حقوق الملف</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
+ <source>Keep the file date</source>
+ <translation>الاحتفاظ بتاريخ الملف</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation>إنشاء مسار كامل إذا لم يكن موجودا</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation>اختباري </translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation>البدء التلقائي</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
+ <source>Error and collision</source>
+ <translation>الخطا والاصطدام</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
+ <source>When folder error</source>
+ <translation>عند خطا في المجلد</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
+ <source>When file error</source>
+ <translation>عند خطا في الملف</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
+ <source>When file collision</source>
+ <translation>عندما تتضارب الملفات</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished">الكتابة فوق إذا اختلف تاريخ التعديل</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
+ <translation>عندما يتضارب المجلد</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
+ <translation>تحقق مما إذا كان مجلد الوجهة موجودا</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
+ <translation>أعاده تسميه القواعد</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
+ <translation>حذف الملفات المنقولة جزئيا</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
+ <translation>أعاده تسميه الوجهة الاصليه</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
+ <source>Performance</source>
+ <translation>الاداء</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation>Inode threads</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
+ <source>Misc</source>
+ <translation>متفرقات</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
+ <source>Check the disk space</source>
+ <translation>تحقق من مساحة القرص</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
+ <source>Use this folder when destination is not set</source>
+ <translation>استخدم هذا المجلد عندما لا يتم تعيين الوجهة</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
+ <source>Browse</source>
+ <translation>استعراض </translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
+ <source>Filters</source>
+ <translation>فلاتر</translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation>خطا في الملف</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation>الخطا</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation>حجم</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation>معدل</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation>اسم الملف</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation>الوجهه</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation>مجلد</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp; تنفيذ هذا الاجراء دوما</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation>جرب مع الامتيازات المرتفعة</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation>وضع إلى أسفل</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation>اعاده المحاوله</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;تخطي</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;الغاء الامر</translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation>الملف موجود</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>المصدر</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>الوجهه</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation>حجم</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation>معدل</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation>اسم الملف</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation>مجلد</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation>اقتراح &amp;اسم جديد</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp; تنفيذ هذا الاجراء دوما</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation>الكتابة فوق إذا اختلف تاريخ التعديل</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;اعاده تسميه</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation>&amp;الكتابة فوق</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;تخطي</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;الغاء الامر</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation>الكتابة فوق إذا كان أحدث</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation>الكتابة فوق إذا كان أقدم</translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation>حجم</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation>معدل</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation>اسم الملف</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation>المصدر والوجهة متشابهان</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation>مجلد</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation>اقتراح &amp;اسم جديد</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp; تنفيذ هذا الاجراء دوما</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;اعاده تسميه</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;تخطي</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;الغاء الامر</translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>المصدر</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>الوجهه</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation>المصدر والوجهة متطابقان</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation>معدل</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation>اسم المجلد</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation>مجلد</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation>اقتراح &amp;اسم جديد</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation>&amp; تنفيذ هذا الاجراء دوما</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;اعاده تسميه</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation>دمج</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation>تخطي</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;الغاء الامر</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/de/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/de/translation.qm
new file mode 100755
index 0000000..10475cf
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/de/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/de/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/de/translation.ts
index fb6408e..dc9f497 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Languages/de/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/de/translation.ts
@@ -2,144 +2,93 @@
<!DOCTYPE TS>
<TS version="2.1" language="de" sourcelanguage="en">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation>Auf dieser Plattform nicht unterstützt</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation>Datum der letzten Änderung ist falsch</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translatorcomment> </translatorcomment>
- <translation>Datum des letzten Zugriffs ist falsch</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation>Unbekannter Fehler: %1</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation>Unbekannter Fehler</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation>Pfad Konvertierungsfehler</translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
<translation>Verschiebemodus - Sie können nicht kopieren</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
<translation>Kopiermodus - Sie können nicht verschieben</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
<translation>Ziel</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
<translation>Aktuelles Ziel: &quot;%1&quot; benutzen?</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
- <translation>Der Modus wurde vorher erzwungen. Interner Fehler - Bitte bei mir melden! </translation>
+ <translation>Der Modus wurde vorher erzwungen. Interner Fehler - Bitte bei mir melden</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation>Fragen</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation>Überspringen</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation>Fusionieren</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation>Umbenennen</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation>Ans Ende verschieben</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation>Überschreiben</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation>Überschreiben, falls verschieden</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation>Überschreiben, falls neuer</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation>Überschreiben, falls älter</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation>Automatisch</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation>Sequentiell</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation>Parallel</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
<translation>Fehlerhafte Optionen</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation>Optionen nicht geladen - Kein Zugriff auf Filter</translation>
</message>
@@ -147,85 +96,75 @@
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation>Fragen</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation>Überspringen</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation>Fusionieren</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation>Umbenennen</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation>Ans Ende verschieben</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation>Überschreiben</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation>Überschreiben, falls verschieden</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation>Überschreiben, falls neuer</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
<source>Overwrite if older</source>
<translation>Überschreiben, falls älter</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation>Automatisch</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation>Sequentiell</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation>Parallel</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
<translation>Fehlerhafte Optionen</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation>Option nicht geladen - Kein Zugriff auf Filter</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
<translation>Option nicht geladen - Kann nicht auf Filter zugreifen</translation>
</message>
@@ -261,12 +200,12 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
<translation>Ordnerfehler</translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
<translation>Ordnername</translation>
</message>
@@ -274,22 +213,22 @@
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">%name% - Kopie%suffix%</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
+ <translation type="unfinished">%name% - Kopie% (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
<translation>Versuche Umbenennung mit Sonderzeichen</translation>
</message>
@@ -297,22 +236,22 @@
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - Kopie</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished">%name% - Kopie%suffix%</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - Kopie (%number%)</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished">%name% - Kopie% (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
<translation>Versuche Umbenennung mit Sonderzeichen</translation>
</message>
@@ -403,55 +342,55 @@
<translation>Filter</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation>Ausschließungs-Filter</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
<translation>Einschließungs-Filter</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
<translation>Keiner = Alle einschließen</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
<translation>Roh-Text</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
<translation>Vereinfachte RegEx</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
<translation>Perls RegEx</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
<translation>Nur auf Datei</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
<translation>Nur auf Ordner</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation>Volle Übereinstimmung</translation>
</message>
@@ -459,27 +398,27 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation>Ordner existiert bereits</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - Kopie</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished">%name% - Kopie%suffix%</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - Kopie (%number%)</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished">%name% - Kopie% (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation>Fehler</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
<translation>Versuche Umbenennung mit Sonderzeichen</translation>
</message>
@@ -487,49 +426,49 @@
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation>Falscher Modus: %1 - Kann Element nicht verschieben oder kopieren</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
<translation>Konnte die Transferliste: %1 nicht speichern</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
<translation>Lesefehler, oder Dateigröße=0</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
<translation>Falscher Header: &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
<translation>Die Transferliste ist im gemischten Modus, aber diese Instanz ist nicht im selben Modus</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
<translation>Die Transferliste ist im Kopiermodus, aber diese Instanz ist nicht im selben Modus</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
<translation>Die Transferliste ist im Verschiebe-Modus, aber diese Instanz ist nicht im selben Modus</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
<translation>Bei der Zeilenanalyse sind Fehler aufgetreten</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
<translation>Transferliste: %1 kann nicht geöffnet werden</translation>
</message>
@@ -537,33 +476,39 @@
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation>Der Ordner kann nicht erstellt werden</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
<translation>Quell-Ordner existiert nicht</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
<translation>Kann den Ordner nicht temporär umbenennen</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
<translation>Kann den Ordner nicht endgültig verschieben</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
<translation>Kann den Ordner nicht verschieben</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation>Kann Ordner nicht verschieben: Fehler Nummer: %1</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation>Kann nicht löschen</translation>
</message>
@@ -571,26 +516,19 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
- <translation>Interner Fehler - Bitte bei mir melden!</translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation>Interner Fehler beim Lesen der Quelldatei: Blockgröße außerhalb des zulässigen Bereichs</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
- <translation>Die Quelldatei kann nicht gelesen werden: </translation>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
- <translation>Datei während des Lesevorgangs abgeschnitten, Daten wurden möglicherweise verändert</translation>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -604,19 +542,19 @@
<location filename="../../RenamingRules.ui" line="41"/>
<source>%name% - copy%suffix%</source>
<extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translation>%name% - Kopie%suffix%</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="57"/>
<source>%name% - copy (%number%)%suffix%</source>
<extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translation>%name% - Kopie% (%number%)%suffix%</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="67"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; für den originalen Dateinamen, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; für die extra Nummer, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; Datei suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="51"/>
@@ -624,194 +562,129 @@
<translation>Zweite Umbenennung</translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation>%1 - Kopie</translation>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>Umbennungsregeln</translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation>%1 - Kopie (%2)</translation>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation>%1 - Kopie%2</translation>
</message>
<message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation>Umbennungsregeln</translation>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation>%1 - Kopie (%2) {1 ?} {2)%3?}</translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation>Ordner der schwarzen Liste</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
<translation>%1 - Kopie</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
<translation>%1 - Kopie (%2)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
- <translation type="unfinished">%name% - Kopie</translation>
+ <translation>%name% - Kopie</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - Kopie (%number%)</translation>
+ <translation>%name% - Kopie (%number%)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation>Dies ist kein Ordner</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation>Ordner existiert bereits</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation>Der Ordner kann nicht gelesen werden</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation>Problem mit der Namen-Encodierung</translation>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation>Problem beim Lesen des Ordners</translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation>Datei nicht gefunden</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished">Interner Fehler: Bereits geöffnet</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished">Laufwerk %1</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished">Unbekannter Ordner</translation>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished">%name% - Kopie%suffix%</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished">Stammverzeichnis</translation>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished">%name% - Kopie% (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished">Quelle existiert nicht</translation>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation>Datei nicht gefunden</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
<source>Unable to change the date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished">Quelldatei existiert nicht</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished">Prüfsummen sind verschieden</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished">Interner Fehler: Ubertragene Größe ungleich</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished">Ordner kann nicht erstellt werden</translation>
+ <translation>Kann Datum nicht ändern</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="228"/>
+ <location filename="../../TransferThread.cpp" line="179"/>
<source>Try rename with using special characters</source>
<translation>Versuche Umbenennung mit Sonderzeichen</translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - Kopie</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - Kopie (%number%)</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished">Andere Datei befindet sich am selben Ort</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation>Falsches Änderungsdatum oder Fehler beim Auslesen, Sie können die Übertragung des Zeitstempels deaktivieren</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished">Interner Fehler: Ziel ist nicht geschlossen</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished">Zielordner konnte nicht erstellt werden: </translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished">Interner Fehler: Puffer ist nicht leer</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished">Zielordner konnte nicht erstellt werden, Fehler Nummer: %1</translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
- <translation>Pfad-Auflösungsfehler (leerer Pfad)</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation>Interner Fehler - Bitte bei mir melden!</translation>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished">Zielordner konnte nicht erstellt werden: </translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation>Quelldatei kann nicht gelesen werden: </translation>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished">Zielordner konnte nicht erstellt werden, Fehler Nummer: %1</translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation>Datenabbruch beim Lesen, Daten wurden möglicherweise verändert</translation>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -822,193 +695,163 @@
<translation>Übertragung</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
<translation>Verschiebe den ganzen Ordner</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
<translation>Übertrage die Dateirechte</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
<translation>Datum der Dateien beibehalten</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation>Übertragung automatisch starten</translation>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation>Vollen Pfad erstellen, wenn nicht vorhanden</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation>Leistung drosseln</translation>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation>Genau nach Reihenfolge</translation>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation>Fehler und Kollision</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
- <translation>Bei Ordnerfehlern:</translation>
+ <translation>Bei Ordnerfehler</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
- <translation>Bei Dateifehlern:</translation>
+ <translation>Bei Dateifehler</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
- <translation>Bei Dateikollisionen:</translation>
+ <translation>Bei Dateikollision</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished">Überschreiben, falls Änderungsdatum verschieden</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
<source>When folder collision</source>
- <translation>Bei Ordnerkollisionen:</translation>
+ <translation>Bei Ordnerkollision</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
<source>Check if destination folder exists</source>
<translation>Prüfen ob Zielordner vorhanden ist</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
<source>Renaming rules</source>
<translation>Umbennungsregeln</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
<source>Delete partially transferred files</source>
<translation>Unvollständig übertragene Dateien löschen</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
<source>Rename the original destination</source>
<translation>Original-Ziel umbenennen</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation>Überprüfung</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation>Prüfsumme</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation>Nur nach einem Fehler</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation>Ignorieren falls unmöglich</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation>Prüfsummen vergleichen</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
<source>Performance</source>
<translation>Leistung</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation>Paralleler Puffer</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation>KB</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation>Blockgröße</translation>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation>Sequentieller Puffer</translation>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation>OS-Puffer aktivieren</translation>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation>OS-Puffer nur verwenden, wenn kleiner als</translation>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation>Übertragungs-Algorithmus</translation>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation>Parallelisieren wenn kleiner als</translation>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation>Verschiedenes</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
<translation>Auf freien Speicherplatz überprüfen</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
- <translation type="unfinished"></translation>
+ <translation>Diesen Ordner benutzen, wenn kein Ziel definiert wurde</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation>Wählen</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation>Filter</translation>
</message>
@@ -1139,6 +982,18 @@
<translation>Überschreiben, falls Änderungsdatum verschieden</translation>
</message>
<message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
<translation>Umbenennen (&amp;R)</translation>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/el/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/el/translation.qm
new file mode 100755
index 0000000..3738845
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/el/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/id/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/el/translation.ts
index e17b3f2..ef5da14 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Languages/id/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/el/translation.ts
@@ -2,143 +2,93 @@
<!DOCTYPE TS>
<TS version="2.1">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -146,85 +96,75 @@
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
+ <source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -260,12 +200,12 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
<translation type="unfinished"></translation>
</message>
@@ -273,22 +213,22 @@
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -296,22 +236,22 @@
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -402,55 +342,55 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation type="unfinished"></translation>
</message>
@@ -458,27 +398,27 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -486,49 +426,49 @@
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -536,33 +476,39 @@
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation type="unfinished"></translation>
</message>
@@ -570,24 +516,17 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
<translation type="unfinished"></translation>
</message>
@@ -623,193 +562,128 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -821,193 +695,163 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
<source>Performance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation type="unfinished"></translation>
</message>
@@ -1138,6 +982,18 @@
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
<translation type="unfinished"></translation>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/en/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/en/translation.qm
new file mode 100755
index 0000000..d925dd6
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/en/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/en/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/en/translation.ts
index 223e40a..4a444fe 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Languages/en/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/en/translation.ts
@@ -2,143 +2,93 @@
<!DOCTYPE TS>
<TS version="2.1" language="en">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -146,85 +96,75 @@
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
+ <source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -260,12 +200,12 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
<translation type="unfinished"></translation>
</message>
@@ -273,22 +213,22 @@
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -296,22 +236,22 @@
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -402,55 +342,55 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation type="unfinished"></translation>
</message>
@@ -458,27 +398,27 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -486,49 +426,49 @@
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -536,33 +476,39 @@
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation type="unfinished"></translation>
</message>
@@ -570,24 +516,17 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
<translation type="unfinished"></translation>
</message>
@@ -628,188 +567,123 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -821,193 +695,163 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
<source>Performance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation type="unfinished"></translation>
</message>
@@ -1138,6 +982,18 @@
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
<translation type="unfinished"></translation>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/es/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/es/translation.qm
new file mode 100755
index 0000000..feaf1fc
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/es/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/es/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/es/translation.ts
index d69e5eb..aad6412 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Languages/es/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/es/translation.ts
@@ -2,143 +2,93 @@
<!DOCTYPE TS>
<TS version="2.1" language="es" sourcelanguage="en">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation>No es compatible con esta plataforma</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation>Fecha de última modificación es incorrecto</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation>Fecha de último acceso es incorrecto</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation>Error desconocido: %1</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation>Error desconocido</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation>Error de conversión de Sendero</translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
<translation>El motor se ve obligado a moverse, no se puede copiar con ella</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
<translation>El motor se ve obligado a copiar, no te puedes mover con él</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
<translation>Destino</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
<translation>Utilice el destino &quot;%1&quot; actual?</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
<translation>El modo se ha visto obligado previamente. Este es un error interno, por favor repórtelo</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation>Pedir</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation>Omitir</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation>Unir</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation>Cambiar el nombre</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation>Ponga al final</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation>Sobrescribir</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation>Sobrescribir si es diferente</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation>Sobrescribir si nuevo</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation>Sobrescribir si es mayor</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation>Automático</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation>Secuencial</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation>Paralelo</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
<translation>error Opciones</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation>Opciones del motor no está cargado. No es posible acceder a los filtros</translation>
</message>
@@ -146,85 +96,75 @@
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation>Pedir</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation>Omitir</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation>Unir</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation>Cambiar el nombre</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation>Ponga al final</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation>Sobrescribir</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation>Sobrescribir si es diferente</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation>Sobrescribir si nuevo</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
<source>Overwrite if older</source>
<translation>Sobrescribir si es mayor</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation>Automático</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation>Secuencial</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation>Paralelo</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
<translation>error Opciones</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation>Opciones del motor no está cargado. No es posible acceder a los filtros</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
<translation>Opciones del motor no está cargado, no se puede acceder a los filtros</translation>
</message>
@@ -260,12 +200,12 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
<translation>Error en la carpeta</translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
<translation>Nombre de la carpeta</translation>
</message>
@@ -273,22 +213,22 @@
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
+ <translation>%name% - copia%suffix%</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
+ <translation>%name% - copia (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
<translation>Trate de cambiar el nombre con el uso de caracteres especiales</translation>
</message>
@@ -296,22 +236,22 @@
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - copia</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>%name% - copia%suffix%</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - copia (%number%)</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>%name% - copia (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
<translation>Trate de cambiar el nombre con el uso de caracteres especiales</translation>
</message>
@@ -402,55 +342,55 @@
<translation>Filtros</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation>Filtros de exclusión</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
<translation>Filtros de inclusión</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
<translation>Ninguno = Incluya todos los</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
<translation>texto Fuente</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
<translation>Simplificado regex</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
<translation>Perl&apos;s regex</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
<translation>Sólo en el archivo</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
<translation>Sólo en la carpeta</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation>Partido completo</translation>
</message>
@@ -458,27 +398,27 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation>Carpeta ya existe</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - copia</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>%name% - copia%suffix%</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - copia (%number%)</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>%name% - copia (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation>Error</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
<translation>Trate de cambiar el nombre con el uso de caracteres especiales</translation>
</message>
@@ -486,49 +426,49 @@
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation>No se puede hacer para mover o copiar elemento en modo incorrecto obligado: %1</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
<translation>No se puede guardar la lista de transferencias: %1</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
<translation>Problema al leer el archivo o archivos de tamaño es 0</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
<translation>Encabezado incorrecto: &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
<translation>La lista de transferencia está en modo mixto, pero este caso no es de este modo</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
<translation>La lista de transferencia está en el modo de copia, pero esta instancia no está en este modo</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
<translation>La lista de transferencia es el modo de desplazamiento, pero esta instancia no está en este modo</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
<translation>Algunos errores han sido encontrados durante el análisis de línea</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
<translation>No se puede abrir la lista de transferencias: %1</translation>
</message>
@@ -536,33 +476,39 @@
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation>No se puede crear la carpeta</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
<translation>La carpeta de origen no existe</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
<translation>No es posible cambiar el nombre de la carpeta temporal</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
<translation>No se puede hacer el movimiento final real de la carpeta</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
<translation>No se puede mover la carpeta</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation>No se puede mover la carpeta: errno: %1</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation>No se puede eliminar</translation>
</message>
@@ -570,26 +516,19 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
- <translation>Error interno, por favor informe de ello!</translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation>Error interno de leer el archivo de origen: tamaño de bloque fuera de rango</translation>
+ <translation>¡Error interno, por favor repórtelo!</translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
- <translation>No se puede leer el archivo de origen: </translation>
+ <translation>No se puede leer el archivo fuente: </translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
- <translation>Archivo truncada durante el cambio de lectura, los datos posibles</translation>
+ <translation>Archivo truncado durante la lectura, posible cambio de datos</translation>
</message>
</context>
<context>
@@ -603,19 +542,19 @@
<location filename="../../RenamingRules.ui" line="41"/>
<source>%name% - copy%suffix%</source>
<extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translation>%name% - copia%suffix%</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="57"/>
<source>%name% - copy (%number%)%suffix%</source>
<extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translation>%name% - copia (%number%)%suffix%</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="67"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; para el nombre del archivo original, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; para el número extra, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; sufijo de archivo&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="51"/>
@@ -623,194 +562,129 @@
<translation>En segundo lugar el cambio de nombre</translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation>%1 - copia</translation>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>Reglas de Cambio de nombre</translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation>%1 - copia (%2)</translation>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation>%1 - copia%2</translation>
</message>
<message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation>Reglas de Cambio de nombre</translation>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation>%1 - copia (%2)%3</translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation>Carpeta de la lista negra</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
<translation>%1 - copia</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
<translation>%1 - copia (%2)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
- <translation type="unfinished">%name% - copia</translation>
+ <translation>%name% - copia</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - copia (%number%)</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation>Esto no es una carpeta</translation>
+ <translation>%name% - copia (%number%)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation>La carpeta no existe</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation>La carpeta no se puede leer</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation>Problema con codificación de nombres</translation>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation>Problema con la carpeta leída</translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation>Archivo no encontrado</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished">Error interno: Ya la apertura</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished">Drive %1</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished">Desconocido carpeta</translation>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>%name% - copia%suffix%</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished">raíz</translation>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>%name% - copia (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished">La fuente no existe</translation>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation>Archivo no encontrado</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
<source>Unable to change the date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished">El archivo de origen no existe</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished">Las sumas de comprobación no coinciden</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished">Error interno: El tamaño transferido no coincide</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished">Incapaz de hacer la carpeta</translation>
+ <translation>No se puede cambiar la fecha</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="228"/>
+ <location filename="../../TransferThread.cpp" line="179"/>
<source>Try rename with using special characters</source>
<translation>Trate de cambiar el nombre con el uso de caracteres especiales</translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - copia</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - copia (%number%)</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished">Otro archivo existe en el mismo lugar</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation>Fecha de modificación incorrecta o incapaz de obtenerla, puede desactivar la transferencia de tiempo para hacerlo</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished">Error interno: El destino no está cerrado</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation>No se puede crear la carpeta de destino: </translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished">Error interno: El buffer no está vacío</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation>No se puede crear la carpeta de destino, errno: %1</translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
- <translation>Error de resolución de ruta (camino vacío)</translation>
+ <translation>Error de resolución de ruta (ruta vacía)</translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation>Error interno, por favor informe de ello!</translation>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation>No se puede crear la carpeta de destino: </translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation>No se puede leer el archivo de origen: </translation>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation>No se puede crear la carpeta de destino, errno: %1</translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation>Archivo truncado durante lectura, posible cambio de datos</translation>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation>¡Error interno, por favor repórtelo!</translation>
</message>
</context>
<context>
@@ -821,193 +695,163 @@
<translation>Transferencia</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
<translation>Mueva la carpeta completa</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
<translation>Transferencia de los derechos de archivo</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
<translation>Mantener la fecha de archivo</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation>Inicio automático de la transferencia</translation>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation>Crear ruta completa si no existe</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation>Si comprueba Menos rendimiento</translation>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation>Suma de comprobación</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation>Siga el orden estricto</translation>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation>Inicio automático</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation>Error y de la colisión</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
<translation>Cuando el error carpeta</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
<translation>Cuando archivo error</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
<translation>Cuando archivo colisión</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation>Sobrescribir si no es del mismo tamaño</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation>Sobrescribir si la fecha de modificación difiere</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
<source>When folder collision</source>
<translation>Cuando la colisión carpeta</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
<source>Check if destination folder exists</source>
<translation>Compruebe si existe la carpeta de destino</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
<source>Renaming rules</source>
<translation>Reglas de Cambio de nombre</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
<source>Delete partially transferred files</source>
<translation>Eliminar archivos parcialmente transferidos</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
<source>Rename the original destination</source>
<translation>Cambie el nombre del destino original</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation>Controlar</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation>Suma de comprobación</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation>Sólo después de un error</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation>No haga caso si no es posible</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation>Verifique checksums</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
<source>Performance</source>
<translation>Rendimiento</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation>Búfer paralelo</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation>KB</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation>Tamaño del bloque</translation>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation>Inode threads</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation>Tampón secuencial</translation>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation>Habilitar el OS de amortiguación</translation>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation>Desmarca esto en Windows crear problema</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation>OS de amortiguación sólo si menor que</translation>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation>Algoritmo de transferencia</translation>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation>Paralelice si más pequeño que</translation>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation>Misc</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
<translation>Compruebe el espacio en disco</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
- <translation type="unfinished"></translation>
+ <translation>Use esta carpeta cuando el destino no esté configurado</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation>Busque</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation>Filtros</translation>
</message>
@@ -1138,6 +982,18 @@
<translation>Sobrescribir si la fecha de modificación difiere</translation>
</message>
<message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation>Sobrescribir si no es del mismo tamaño</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation>Sobrescribir si no es del mismo tamaño y fecha</translation>
+ </message>
+ <message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
<translation>&amp;Cambiar el nombre</translation>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/fr/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/fr/translation.qm
new file mode 100755
index 0000000..c538b95
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/fr/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/fr/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/fr/translation.ts
index 1eeef1b..6bec60f 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Languages/fr/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/fr/translation.ts
@@ -2,143 +2,93 @@
<!DOCTYPE TS>
<TS version="2.1" language="fr" sourcelanguage="en">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation>Non supporté sur cette plateforme</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation>Date de dernière modification du fichier incorrecte</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation>Date du dernier accès au fichier incorrecte</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation>Erreur inconnue: %1</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation>Erreur inconnue</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation>Erreur de conversion de chemain</translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
<translation>Le moteur est forcé en déplacement, vous ne pouvez pas copier avec</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
<translation>Le moteur est forcé en copie, vous ne pouvez pas déplacer avec</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
<translation>Destination</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
<translation>Utiliser la destination actuelle &quot;%1&quot;?</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
<translation>Le mode a été forcé. C&apos;est une erreur interne, merci de la repporter</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation>Demander</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation>Passer</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation>Fusionner</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation>Renommer</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation>Mettre à la fin</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation>Écraser</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation>Écraser si différent</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation>Écraser si plus récent</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation>Écraser si plus vieux</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation>Automatique</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation>Séquentiel</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation>Parallèle</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
<translation>Erreur d&apos;options</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation>Le moteur d&apos;options n&apos;est pas chargé. Impossible d&apos;accédé aux filtres</translation>
</message>
@@ -146,85 +96,75 @@
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation>Demander</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation>Passer</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation>Fusionner</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation>Renommer</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation>Mettre à la fin</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation>Écraser</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation>Écraser si différent</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation>Écraser si plus récent</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
<source>Overwrite if older</source>
<translation>Écraser si plus vieux</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation>Automatique</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation>Séquentiel</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation>Parallèle</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
<translation>Erreur d&apos;options</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation>Le moteur d&apos;options n&apos;est pas chargé. Impossible d&apos;accédé aux filtres</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
<translation>Moteur d&apos;options non chargé, impossible d&apos;accéder aux filtres</translation>
</message>
@@ -260,12 +200,12 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
<translation>Erreur sur un dossier</translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
<translation>Nom de répertoire</translation>
</message>
@@ -273,22 +213,22 @@
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
+ <translation>%name% - copie%suffix%</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
+ <translation>%name% - copie (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
<translation>Essaie de renommage avec caratéres interdits</translation>
</message>
@@ -296,22 +236,22 @@
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - copie</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>%name% - copie%suffix%</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - copie (%number%)</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>%name% - copie (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
<translation>Essaie de renommage avec caratéres interdits</translation>
</message>
@@ -402,55 +342,55 @@
<translation>Filtres</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation>Filtres d&apos;exclusion</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
<translation>Filtres d&apos;inclusion</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
<translation>Aucun = tout inclure</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
<translation>Texte brute</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
<translation>Regex simplifié</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
<translation>Regex perl</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
<translation>Appliquer sur fichier</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
<translation>Appliquer sur dossier</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation>Correspondance totale</translation>
</message>
@@ -458,27 +398,27 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation>Dossier déjà existant</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - copie</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>%name% - copie%suffix%</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - copie (%number%)</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>%name% - copie (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation>Erreur</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
<translation>Essaie de renommage avec caratéres interdits</translation>
</message>
@@ -486,49 +426,49 @@
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation>Impossible de faire un déplacement ou une copie dans le mauvais mode forcé: %1</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
<translation>Impossible de sauvegarder la liste de transfert: %1</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
<translation>Problem durant la lecture, ou taille de fichier est 0</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
<translation>Mauvais en-tête: &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
<translation>La liste de transfert est en mode mixte, mais l&apos;instance n&apos;est pas dans ce mode</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
<translation>La liste de transfert est en mode copie, mais l&apos;instance n&apos;est pas dans ce mode</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
<translation>La liste de transfert est en mode déplacement, mais l&apos;instance n&apos;est pas dans ce mode</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
<translation>Certaine erreur ont été trouvé durant l&apos;analise de la line</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
<translation>Impossible d&apos;ouvrir la list de transfert: %1</translation>
</message>
@@ -536,33 +476,39 @@
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation>Impossible de créer le répertoire</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
<translation>Le dossier source n&apos;éxiste pas</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
<translation>Impossible de renommer le dossier</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
<translation>Impossible de faire le déplacement final du dossier</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
<translation>Impossible de déplacer le dossier</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation>Impossible de déplacer le dossier: errno: %1</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation>Impossible de supprimer</translation>
</message>
@@ -570,27 +516,19 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
- <translation>Erreur interne, merci de la reporter!</translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation>Erreur interne lisant le fichier source: taille de block hors de la plage</translation>
+ <translation>Erreur interne, veuillez la signaler!</translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
<translation>Impossible de lire le fichier source: </translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
- <translatorcomment>La taille du fichier a diminué durant -&gt; changé le texte original</translatorcomment>
- <translation>Fichier a diminué durant la lecture, possible changement de données</translation>
+ <translation>Fichier tronqué lors de la lecture, modification possible des données</translation>
</message>
</context>
<context>
@@ -604,19 +542,19 @@
<location filename="../../RenamingRules.ui" line="41"/>
<source>%name% - copy%suffix%</source>
<extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translation>%name% - copie%suffix%</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="57"/>
<source>%name% - copy (%number%)%suffix%</source>
<extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translation>%name% - copie (%number%)%suffix%</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="67"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; pour le nom original, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; pour le numero extra, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="51"/>
@@ -624,194 +562,129 @@
<translation>Second renommage</translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation>%1 - copie</translation>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>Règles de renommage</translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation>%1 - copie (%2)</translation>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation>%1 - copie%2</translation>
</message>
<message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation>Règles de renommage</translation>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation>%1 - copie (%2) {1 ?} {2)%3?}</translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation>Dossier banis</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
<translation>%1 - copie</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
<translation>%1 - copie (%2)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
- <translation type="unfinished">%name% - copie</translation>
+ <translation>%name% - copie</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - copie (%number%)</translation>
+ <translation>%name% - copie (%number%)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation>N&apos;est pas un dossier</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation>Le répertoire n&apos;existe pas</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation>Le répertoire n&apos;est pas lisible</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation>Problém d&apos;encodage</translation>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation>Probléme avec la lecture du dossier</translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation>Fichier non trouvé</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation>Lecteur %1</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation>Dossier inconnu</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation>racine</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation>La source n&apos;existe pas</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation>Le fichier source n&apos;existe pas</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation>Les sommes de controle ne correspondent pas</translation>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>%name% - copie%suffix%</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation>Erreur interne: La taille transféré ne corresponds pas</translation>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>%name% - copie (%number%)%suffix%</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation>Impossible de créer le dossier</translation>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation>Fichier non trouvé</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="228"/>
+ <location filename="../../TransferThread.cpp" line="179"/>
<source>Try rename with using special characters</source>
<translation>Essaie de renommage avec caratéres interdits</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation>Mauvaise date de modification ou impossible de l&apos;avoir, vous pouvez désactiver le transfert de celui-ci</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation>Erreur interne: Déjà ouvert</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - copie</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - copie (%number%)</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation>Un autre fichier exists à la même place</translation>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
+ <translation>Impossible de changer la date</translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation>Erreur interne: La destination n&apos;est pas fermé</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation>Mauvaise date de modification ou impossible de l&apos;avoir, vous pouvez désactiver le transfert de celui-ci</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation>Erreur interne: Le buffer n&apos;est pas vide</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation>Impossible de créer le dossier de destination: </translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
- <translation>Impossible de changer la date</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation>Impossible de créer le dossier de destination, errno: %1</translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
- <translation>Erreur de résolution de chemain (chemain vide)</translation>
+ <translation>Erreur de résolution de chemin (chemin vide)</translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation>Erreur interne, merci de la reporter!</translation>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation>Impossible de créer le dossier de destination: </translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation>Impossible de lire le fichier source: </translation>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation>Impossible de créer le dossier de destination, errno: %1</translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation>Fichier rétréci pendant la lecture, possible changement de données</translation>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation>Erreur interne, veuillez la signaler!</translation>
</message>
</context>
<context>
@@ -822,193 +695,163 @@
<translation>Transfert</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
<translation>Déplacer le dossier complet</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
<translation>Transférer les droits des fichiers</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
<translation>Garder la date du fichier</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation>Démarrer automatiquement le transfert</translation>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation>Créer le dossier complet si il n&apos;existe pas</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation>Moins de performance si coché</translation>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation>Somme de contrôle</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation>Suivre l&apos;ordre strict</translation>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation>Démarrage automatique</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation>Erreur et collision</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
<translation>En cas d&apos;erreur de répertoire</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
<translation>En cas d&apos;erreur de fichier</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
<translation>En cas de collision de fichier</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation>Écraser si pas la même taille</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation>Écraser si les dates différes</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
<source>When folder collision</source>
<translation>Lors d&apos;une collision de dossier</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
<source>Check if destination folder exists</source>
<translation>Vérifier si le répertoire de destination existe</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
<source>Renaming rules</source>
<translation>Règles de renommage</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
<source>Delete partially transferred files</source>
<translation>Supprimer les transferts partiels</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
<source>Rename the original destination</source>
<translation>Renommer la destination originale</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation>Controle</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation>Somme de contrôle</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation>Seulement après erreur</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation>Ignorer si impossible</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation>Vérifier les sommes de contrôles</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
<source>Performance</source>
<translation>Performance</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation>Buffer paralléle</translation>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation>Threads d&apos;inodes</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation>Ko</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation>Taille de bloc</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation>Buffer séquentiel</translation>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation>Activer le tampon de l&apos;OS</translation>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation>Décochez ceci sous Windows créer un problème</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation>Tampon de l&apos;OS seulement si plus petit que</translation>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation>Algorithme de transfert</translation>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation>Parallèlise si plus petit que</translation>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
- <translation>Inode threads (non sécurisé&gt; 1)</translation>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
- <translation>Plus de cpu mais meilleur organisation sur le disque</translation>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
- <translation>Ordonner la liste</translation>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation>Divers</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
<translation>Vérifier l&apos;espace disque</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
<translation>Utiliser ce dossier quand la destination n&apos;est pas défini</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation>Parcourir</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation>Filtres</translation>
</message>
@@ -1139,6 +982,18 @@
<translation>Écraser si les dates différes</translation>
</message>
<message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation>Écraser si pas la même taille</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation>Remplacer si ce n&apos;est pas la même taille et la même date</translation>
+ </message>
+ <message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
<translation>&amp;Renommer</translation>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/hi/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/hi/translation.qm
new file mode 100755
index 0000000..3738845
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/hi/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/el/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/hi/translation.ts
index e17b3f2..ef5da14 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Languages/el/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/hi/translation.ts
@@ -2,143 +2,93 @@
<!DOCTYPE TS>
<TS version="2.1">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -146,85 +96,75 @@
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
+ <source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -260,12 +200,12 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
<translation type="unfinished"></translation>
</message>
@@ -273,22 +213,22 @@
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -296,22 +236,22 @@
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -402,55 +342,55 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation type="unfinished"></translation>
</message>
@@ -458,27 +398,27 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -486,49 +426,49 @@
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -536,33 +476,39 @@
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation type="unfinished"></translation>
</message>
@@ -570,24 +516,17 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
<translation type="unfinished"></translation>
</message>
@@ -623,193 +562,128 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -821,193 +695,163 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
<source>Performance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation type="unfinished"></translation>
</message>
@@ -1138,6 +982,18 @@
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
<translation type="unfinished"></translation>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/hu/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/hu/translation.qm
new file mode 100755
index 0000000..6b6a991
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/hu/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/hu/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/hu/translation.ts
index ca0151e..b7dde65 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Languages/hu/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/hu/translation.ts
@@ -2,143 +2,93 @@
<!DOCTYPE TS>
<TS version="2.1" language="hu">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation>Nem támogatott ezen a platformon</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation>A módosítás utolsó dátuma hibás</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation>A hozzáférés utolsó dátuma hibása</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation>Ismeretlen hiba: %1</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation>Útvonal konvertálási hiba</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation>Ismeretlen hiba</translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
<translation>A motort mozgatásra kényszerítik, nem másolhatsz vele</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
<translation>A motort másolásra kényszerítik, nem mozgathatsz vele</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
<translation>Cél</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
<translation>Használja a jelenlegi célt: &quot;%1&quot;?</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
<translation>Ezt a módot már korábban kényszerítették. Belső hiba történt, kérlek jelentsd be</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation>Kérdezzen rá</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation>Kihagy</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation>Összeolvaszt</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation>Nevezze át</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation>Helyezze a végére</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation>Felülír</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation>Felülír, ha különbözik</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation>Felülír, ha újabb</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation>Felülír, ha régebbi</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation>Automatikus</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation>Szekvenciális</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation>Párhuzamos</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
<translation>Beállítási hiba</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation>A beállítási motor nincs betöltve. A szűrők elérése nem lehetséges</translation>
</message>
@@ -146,85 +96,75 @@
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation>Kérdezzen rá</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation>Kihagy</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation>Összeolvaszt</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation>Nevezze át</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation>Helyezze a végére</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation>Felülír</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation>Felülír, ha különbözik</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation>Felülír, ha újabb</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
<source>Overwrite if older</source>
<translation>Felülír, ha régebbi</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation>Automatikus</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation>Szekvenciális</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation>Párhuzamos</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
<translation>Beállítási hiba</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation>A beállítási motor nincs betöltve. A szűrők elérése nem lehetséges</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
<translation>A beállítási motor nincs betöltve, a szűrők elérése nem lehetséges</translation>
</message>
@@ -260,12 +200,12 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
<translation>Hiba a mappával</translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
<translation>Mappa neve</translation>
</message>
@@ -273,22 +213,22 @@
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
<translation>Átnevezés speciális karakterek használatával</translation>
</message>
@@ -296,22 +236,22 @@
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - másolás</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - másolás (%number%)</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
<translation>Átnevezés speciális karakterek használatával</translation>
</message>
@@ -402,55 +342,55 @@
<translation>Szűrők</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation>Kizáró szűrők</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
<translation>Használt szűrők</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
<translation>Nincs = Mindet használ</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
<translation>Nyers szöveg</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
<translation>Egyszerűsített regex</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
<translation>Perl regex</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
<translation>Csak fájlon</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
<translation>Csak mappán</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation>Teljes egyezés</translation>
</message>
@@ -458,27 +398,27 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation>Mappa már létezik</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - másolás</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - másolás (%number%)</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation>Hiba</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
<translation>Átnevezés speciális karakterek használatával</translation>
</message>
@@ -486,49 +426,49 @@
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation>Elem másolása vagy mozgatás nem lehetséges a hibás kényszerített módban: %1</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
<translation>Átviteli lista mentése nem lehetséges: %1</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
<translation>Hiba a fájl olvasásánál vagy a fálméret 0</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
<translation>Hibás fejléc: &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
<translation>Az átviteli lista kevert módban van, de ez a példány nincs</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
<translation>Az átviteli lista másolás módban van, de ez a példány nincs</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
<translation>Az átviteli lista mozgatás módban van, de ez a példány nincs</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
<translation>Néhány hiba történt a sorelemzés során</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
<translation>Az átviteli lista megnyitása nem lehetséges: %1</translation>
</message>
@@ -536,33 +476,39 @@
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation>Mappa létrehozása nem lehetséges</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation>Eltávolítás nem lehetséges</translation>
</message>
@@ -570,26 +516,19 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
- <translation>Belső hiba, kérlek jelentsd!</translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation>Belső hiba történt a forrásfájl olvasásakor: a blokkméret tartományon kívüli</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
- <translation>A forrásfájl olvasása nem lehetséges:</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
- <translation>A fájl olvasás során megcsonkult, valószínűleg adatváltozás miatt</translation>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -628,189 +567,124 @@
<translation>Második átnevezés</translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation>%1 - másolás</translation>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation>%1 - másolás (%2)</translation>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation type="unfinished">%1 - másolás (%2) {1 ?} {2)%3?}</translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation>Feketelistás mappa</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
<translation>%1 - másolás</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
<translation>%1 - másolás (%2)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
<translation type="unfinished">%name% - másolás</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
<translation type="unfinished">%name% - másolás (%number%)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation>Ez nem mappa</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation>A mappa létezik</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation>A mappa nem olvasható</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation>Probléma a névkódolással</translation>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation>Fájl nem található</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished">%1 meghajtó</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished">Ismeretlen mappa</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished">gyökér</translation>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished">A forrás nem létezik</translation>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished">Mappaművelet nem lehetséges</translation>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation>Fájl nem található</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="228"/>
+ <location filename="../../TransferThread.cpp" line="179"/>
<source>Try rename with using special characters</source>
<translation>Átnevezés speciális karakterek használatával</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - másolás</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - másolás (%number%)</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished">A forrásfájl nem létezik</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished">Egy másik fájl létezik ugyanazon a helyen</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished">A checksumok nem egyeznek meg</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished">Belső hiba: a cél nincs bezárva</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished">Belső hiba: az átvitt méret nem egyezik meg</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished">Belső hiba: a puffer nem üres</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
- <translation>Útvonal feloldási hiba (Üres útvonal)</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation>Belső hiba, kérlek jelentsd!</translation>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation>A forrásfájl olvasása nem lehetséges:</translation>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation>Fájl megsérült az olvasás közben, valószínűleg adatváltozás</translation>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -821,193 +695,163 @@
<translation>Átvitel</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
<translation>Mozgassa át az egész mappát</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
<translation>Fájljogok átadása</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
<translation>Fájl dátumának megtartása</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation>Átvitel automatikus indítása</translation>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation>Kisebb teljesítmény, ha be van jelölve</translation>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation>Kövesse a szigorú sorrendet</translation>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation>Hiba és ütközés</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
<translation>Mappa hiba esetén</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
<translation>Fájl hiba esetén</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
<translation>Fájl ütközés esetén</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished">Felülír, ha a módosítás dátuma különbözik</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
<source>When folder collision</source>
<translation>Mappa ütközés esetén</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
<source>Check if destination folder exists</source>
<translation>Célmappa létezésének ellenőrzése</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
<source>Renaming rules</source>
<translation>Átnevezési szabályok</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
<source>Delete partially transferred files</source>
<translation>Részben átvitt fájlok törlése</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
<source>Rename the original destination</source>
<translation>Eredeti cél átnevezése</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation>Irányítás</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation>Checksum</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation>Csak hiba után</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation>Hagyja ki, ha nem lehetséges</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation>Checksumok ellenőrzése</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
<source>Performance</source>
<translation>Teljesítmény</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation>Párhuzamos puffer</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation>KB</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation>Blokkméret</translation>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation>Szekvenciális puffer</translation>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation>OS puffer engedélyezése</translation>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation>OS buffer csak akkor, ha kisebb mint</translation>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation>Átviteli algoritmus</translation>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation>Párhuzamosítás, ha kisebb mint</translation>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation>Egyéb</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
<translation>Lemezterület ellenőrzése</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation>Tallózás</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation>Szűrők</translation>
</message>
@@ -1144,6 +988,18 @@
<translation>Felülír, ha régebbi</translation>
</message>
<message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
<translation>&amp;Átnevez</translation>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/id/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/id/translation.qm
new file mode 100755
index 0000000..3738845
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/id/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/ar/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/id/translation.ts
index e17b3f2..ef5da14 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Languages/ar/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/id/translation.ts
@@ -2,143 +2,93 @@
<!DOCTYPE TS>
<TS version="2.1">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -146,85 +96,75 @@
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
+ <source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -260,12 +200,12 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
<translation type="unfinished"></translation>
</message>
@@ -273,22 +213,22 @@
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -296,22 +236,22 @@
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -402,55 +342,55 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation type="unfinished"></translation>
</message>
@@ -458,27 +398,27 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -486,49 +426,49 @@
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -536,33 +476,39 @@
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation type="unfinished"></translation>
</message>
@@ -570,24 +516,17 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
<translation type="unfinished"></translation>
</message>
@@ -623,193 +562,128 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -821,193 +695,163 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
<source>Performance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation type="unfinished"></translation>
</message>
@@ -1138,6 +982,18 @@
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
<translation type="unfinished"></translation>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/it/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/it/translation.qm
new file mode 100755
index 0000000..5090866
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/it/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/it/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/it/translation.ts
index cba024c..bedc49e 100644
--- a/plugins/CopyEngine/Ultracopier/Languages/it/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/it/translation.ts
@@ -2,231 +2,171 @@
<!DOCTYPE TS>
<TS version="2.1" language="it" sourcelanguage="en">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation>Non supportato su questa piattaforma</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation>La data dell&apos;ultima modifica è errata</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation>La data dell&apos;ultimo accesso è errata</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation>Percorso dell&apos;errore di conversione</translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
- <translation>Impossibile copiare, il motore per la copia forzerà lo spostamento</translation>
+ <translation>Impossibile copiare, il motore di copia forzerà lo spostamento</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
- <translation>Impossibile effettuare lo spostamento, il motore per la copia forzerà la copia</translation>
+ <translation>Impossibile effettuare lo spostamento, il motore di copia forzerà la copia</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
- <translation type="unfinished">Cartella di destinazione</translation>
+ <translation>Percorso di destinazione</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
- <translation type="unfinished"></translation>
+ <translation>Usare l&apos;attuale destinazione? &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
- <translation type="unfinished"></translation>
+ <translation>La modalità è stata forzata precedentemente. Questo è un errore interno, si prega di riportatelo</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation>Chiedi</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation>Salta</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation>Unisci</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation>Rinomina</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation>Metti in coda</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation>Sovrascrivi</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation>Sovrascrivi se differente</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation>Sovrascrivi se più recente</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation>Sovrascrivi se meno recente</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation>Automatico</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation>Sequenziale</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation>Parallelo</translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
- <translation>Opzioni di errore</translation>
+ <translation>Errore opzioni</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
+ <translation>Motore delle opzioni non caricato. Impossibile accedere ai filtri</translation>
</message>
</context>
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation>Chiedi</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation>Salta</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation>Unisci</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation>Rinomina</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation>Metti in coda</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation>Sovrascrivi</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation>Sovrascrivi se differente</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation>Sovrascrivi se più recente</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
<source>Overwrite if older</source>
<translation>Sovrascrivi se meno recente</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation>Automatico</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation>Sequenziale</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation>Parallelo</translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
- <translation>Opzioni di errore</translation>
+ <translation>Errore opzioni</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
+ <translation>Motore delle opzioni non caricato. Impossibile accedere ai filtri</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
- <translation>Le opzioni del motore per la copia non vengono caricate, impossibile accedere ai filtri</translation>
+ <translation>Le opzioni del motore di copia non sono state caricate. Impossibile accedere ai filtri</translation>
</message>
</context>
<context>
@@ -239,7 +179,7 @@
<message>
<location filename="../../DiskSpace.ui" line="24"/>
<source>You need more space on this drive to finish this transfer</source>
- <translation type="unfinished"></translation>
+ <translation>Hai bisogno di più spazio su questo disco per finire il trasferimento</translation>
</message>
<message>
<location filename="../../DiskSpace.ui" line="49"/>
@@ -260,60 +200,60 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
- <translation>Errore nella cartella</translation>
+ <translation>Errore con la cartella</translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
- <translation>Nome della cartella</translation>
+ <translation>Nome cartella</translation>
</message>
</context>
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
+ <translation>Copia di %name% %suffix%</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
+ <translation>Copia di %name% (%number%) %suffix%</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
+ <translation>Tenta ridenominazione usando caratteri speciali</translation>
</message>
</context>
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished">Copia di %name%</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>Copia di %name% %suffix%</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">Copia di %name% (%number%)</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>Copia di %name% (%number%) %suffix%</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
+ <translation>Tenta ridenominazione usando caratteri speciali</translation>
</message>
</context>
<context>
@@ -326,27 +266,27 @@
<message>
<location filename="../../FilterRules.ui" line="43"/>
<source>Search type:</source>
- <translation>Tipo di ricerca:</translation>
+ <translation>Cerca tipologia:</translation>
</message>
<message>
<location filename="../../FilterRules.ui" line="51"/>
<source>Raw text</source>
- <translation>Testo raw</translation>
+ <translation>Testo nudo</translation>
</message>
<message>
<location filename="../../FilterRules.ui" line="56"/>
<source>Simplified regex</source>
- <translation>Regex semplificato</translation>
+ <translation>Espressione regolare semplificata</translation>
</message>
<message>
<location filename="../../FilterRules.ui" line="61"/>
<source>Perl&apos;s regex</source>
- <translation>Regex in Perl</translation>
+ <translation>Espressione regolare in Perl</translation>
</message>
<message>
<location filename="../../FilterRules.ui" line="69"/>
<source>Apply on:</source>
- <translation>Applicare su:</translation>
+ <translation>Applicare a:</translation>
</message>
<message>
<location filename="../../FilterRules.ui" line="77"/>
@@ -356,7 +296,7 @@
<message>
<location filename="../../FilterRules.ui" line="82"/>
<source>Folder</source>
- <translation>Cartelle</translation>
+ <translation>Cartella</translation>
</message>
<message>
<location filename="../../FilterRules.ui" line="87"/>
@@ -366,7 +306,7 @@
<message>
<location filename="../../FilterRules.ui" line="125"/>
<source>The test string matches with the regex</source>
- <translation type="unfinished"></translation>
+ <translation>La stringa di prova combacia con l&apos;espressione regolare</translation>
</message>
<message>
<location filename="../../FilterRules.ui" line="102"/>
@@ -381,17 +321,17 @@
<message>
<location filename="../../FilterRules.ui" line="17"/>
<source>Filters dialog</source>
- <translation>Finestra dei filtri</translation>
+ <translation>Finestra dialogo dei filtri</translation>
</message>
<message>
<location filename="../../FilterRules.ui" line="95"/>
<source>Whole string must match</source>
- <translation type="unfinished"></translation>
+ <translation>L&apos;intera stringa deve combaciare</translation>
</message>
<message>
<location filename="../../FilterRules.ui" line="108"/>
<source>The regex is valid</source>
- <translation>La regex è valida</translation>
+ <translation>L&apos;espressione regolare è valida</translation>
</message>
</context>
<context>
@@ -402,58 +342,55 @@
<translation>Filtri</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation>Filtri di esclusione</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
- <translatorcomment>o filtri per l&apos;inserimento?</translatorcomment>
<translation>Filtri di inclusione</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
- <translatorcomment>o Nessuno = Includi tutti oppure Nessuno = Inserisci tutti oppure bisogna lasiare none?</translatorcomment>
- <translation>Nessuno = Tutti inclusi</translation>
+ <translation>Nessuno = Includi tutti</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
- <translation>Testo raw</translation>
+ <translation>Testo nudo</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
- <translation>Regex semplificato</translation>
+ <translation>Espressione regolare semplificata</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
- <translation>Regex in Perl</translation>
+ <translation>Espressione regolare in Perl</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
- <translation>Solo su file</translation>
+ <translation>Solamente su file</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
- <translatorcomment>o cartella al singolare?</translatorcomment>
- <translation>Solo su cartelle</translation>
+ <translation>Solamente su cartella</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation>Corrispondenza completa</translation>
</message>
@@ -461,112 +398,117 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation>Cartella già presente</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished">Copia di %name%</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>Copia di %name% %suffix%</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">Copia di %name% (%number%)</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>Copia di %name% (%number%) %suffix%</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation>Errore</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
+ <translation>Tenta ridenominazione usando caratteri speciali</translation>
</message>
</context>
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation>Impossibile spostare o copiare elementi in modalità forzata anomala: %1</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
- <translation>Impossibile salvare la lista dei trasferimenti: %1</translation>
+ <translation>Impossibile salvare la lista di trasferimento %1</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
- <translation type="unfinished"></translation>
+ <translation>Problema durante la lettura del file o dimensione file nulla</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
- <translatorcomment>Header si riferisce all&apos;intestazione?</translatorcomment>
- <translation>Intestazione sbagliata: &quot;%1&quot;</translation>
+ <translation>Intestazione errata: &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
- <translation>La lista dei trasferimenti è in modalità mista, ma questa istanza non è in questa modalità</translation>
+ <translation>La lista di trasferimento è in modalità mista ma questa istanza non lo è</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
- <translation>La lista dei trasferimenti è in modalità di copia, ma questa istanza non è in questa modalità</translation>
+ <translation>La lista di trasferimento è in modalità copia ma questa istanza non lo è</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
- <translation>La lista dei trasferimenti è in modalità di spostamento, ma questa istanza non è in questa modalità</translation>
+ <translation>La lista di trasferimento è in modalità spostamento ma questa istanza non lo è</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
- <translation type="unfinished"></translation>
+ <translation>Alcuni errori rilevati durante l&apos;analisi di linea</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
- <translation>Impossibile aprire la lista dei trasferimenti: %1</translation>
+ <translation>Impossibile aprire lista di trasferimento %1</translation>
</message>
</context>
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation>Impossibile creare la cartella</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
- <translation type="unfinished"></translation>
+ <translation>La cartella di origine non esiste</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
- <translation type="unfinished"></translation>
+ <translation>Impossibile ridenominare temporaneamente la cartella</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
- <translation type="unfinished"></translation>
+ <translation>Impossibile fare il vero spostamento finale della cartella</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
- <translation type="unfinished"></translation>
+ <translation>Impossibile spostare la cartella</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation>Impossibile spostare la cartella: errore %1</translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation>Impossibile eliminare</translation>
</message>
@@ -574,26 +516,19 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
- <translation>Errore interno, pregasi di segnalarlo!</translation>
+ <translation>Errore interno, si prega di riportarlo!</translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
- <translation>Impossibile leggere il file di origine: </translation>
+ <translation>Impossibile leggere file di origine: </translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
- <translation>File troncato durante la lettura, possibili variazioni di dati</translation>
+ <translation>File troncato durante la lettura. Possibile cambio dati</translation>
</message>
</context>
<context>
@@ -601,222 +536,158 @@
<message>
<location filename="../../RenamingRules.ui" line="35"/>
<source>First renaming</source>
- <translatorcomment>o Prima ridenominazione?</translatorcomment>
- <translation>Prima rinomina</translation>
+ <translation>Prima ridenominazione</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="41"/>
<source>%name% - copy%suffix%</source>
<extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translatorcomment>%name% non dovrà essere tradotto</translatorcomment>
+ <translation>Copia di %name% %suffix%</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="57"/>
<source>%name% - copy (%number%)%suffix%</source>
<extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translatorcomment>%name%, %number% non dovranno essere tradotti</translatorcomment>
+ <translation>Copia di %name% (%number%) %suffix%</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="67"/>
<source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
<extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
+ <translatorcomment>%name%, %number% non dovranno essere tradotti</translatorcomment>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variabili: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; per il nome file originale, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; per il numero extra, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; Suffisso file&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
</message>
<message>
<location filename="../../RenamingRules.ui" line="51"/>
<source>Second renaming</source>
- <translatorcomment>o Seconda ridenominazione?</translatorcomment>
- <translation>Seconda rinomina</translation>
+ <translation>Seconda ridenominazione</translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation>%1 - copia</translation>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>Regole di ridenominazione</translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation>%1 - copia (%2)</translation>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation>Copia di %1 %2</translation>
</message>
<message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation>Regole di rinomina</translation>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation>Copia di %1 (%2) %3</translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
- <translation>%1 - copia</translation>
+ <translation>Copia di %1</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
- <translation>%1 - copia (%2)</translation>
+ <translation>Copia di %1 (%2)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
- <translation type="unfinished">Copia di %name%</translation>
+ <translation>Copia di %name%</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
- <translation type="unfinished">Copia di %name% (%number%)</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation>Questa non è una cartella</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation>La cartella non è leggibile</translation>
+ <translation>Copia di %name% (%number%)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation>Problema con la codifica del nome</translation>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation>Problema con la lettura della cartella</translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation>File non trovato</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished">Unità %1</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished">root</translation>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation>Copia di %name% %suffix%</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation>Copia di %name% (%number%) %suffix%</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished">Impossibile creare la cartella</translation>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation>File non trovato</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="228"/>
+ <location filename="../../TransferThread.cpp" line="179"/>
<source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
+ <translation>Tenta ridenominazione usando caratteri speciali</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished">Copia di %name%</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">Copia di %name% (%number%)</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished">Nello stesso percorso è presente un altro file</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished">Errore interno: la cartella di destinazione non è chiusa</translation>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
+ <translation>Impossibile cambiare data</translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished"></translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation>Data di modifica sbagliata o impossibile ottenerla, potete disabilitare l&apos;orario di trasferimento per procedere</translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished">Errore interno: il buffer non è vuoto</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation>Impossibile creare cartella di destinazione: </translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
- <translation type="unfinished">Impossibile cambiare la data</translation>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation>Impossibile creare cartella di destinazione, error %1</translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
- <translation type="unfinished"></translation>
+ <translation>Errore di risoluzione percorso (vuoto)</translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation>Errore interno, pregasi di segnalarlo!</translation>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation>Impossibile creare cartella di destinazione: </translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation>Impossibile leggere il file di origine: </translation>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation>Impossibile creare cartella di destinazione, errore %1</translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation type="unfinished"></translation>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation>Errore interno, si prega di riportarlo!</translation>
</message>
</context>
<context>
@@ -824,196 +695,166 @@
<message>
<location filename="../../copyEngineOptions.ui" line="44"/>
<source>Transfer</source>
- <translation>Trasferisci</translation>
+ <translation>Trasferimento</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
- <translation>Spostare l&apos;intera cartella</translation>
+ <translation>Spostare intera cartella</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
- <translation>Trasferire le autorizzazioni dei file</translation>
+ <translation>Trasferire autorizzazioni dei file</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
- <translation>Mantenere la data del file</translation>
+ <translation>Mantenere date dei file</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation type="unfinished"></translation>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation>Creare percorso completo se non esistente</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation>Se selezionato si avranno prestazioni ridotte</translation>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation>Checksum</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation>Seguire rigorosamente l&apos;ordine</translation>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation>Avvio automatico</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation>Errori di coincidenze</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
- <translation>Quando si verifica un errore nelle cartelle</translation>
+ <translation>Quando si verifica errore nelle cartelle</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
- <translation>Quando si verifica un errore nei file</translation>
+ <translation>Quando si verifica errore nei file</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
<translation>Quando i file coincidono</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation>Sovrascrivere se dimensione differisce</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation>Sovrascrivere se data di modifica differisce</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
<source>When folder collision</source>
<translation>Quando le cartelle coincidono</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
<source>Check if destination folder exists</source>
- <translation>Controllare se la cartella di destinazione esiste</translation>
+ <translation>Controllare esistenza cartella di destinazione</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
<source>Renaming rules</source>
- <translation>Regole di rinomina</translation>
+ <translation>Regole di ridenominazione</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
<source>Delete partially transferred files</source>
<translation>Eliminare i file parzialmente trasferiti</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
<source>Rename the original destination</source>
- <translation>Rinominare la destinazione all&apos;origine</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation>Controllare</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation>Codice di controllo (Checksum)</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation>Solo dopo l&apos;errore</translation>
+ <translation>Ridenominare destinazione all&apos;origine</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation>Ignora se non corrisponde</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
<source>Performance</source>
<translation>Prestazioni</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation>Buffer parallelo</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation>KB</translation>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation>Numero thread inode</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation>Dimensione del blocco</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation>Buffer sequenziale</translation>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation>Attivare il buffer del sistema operativo</translation>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation>Deselezionare ciò su Windows causa problemi</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation>Buffer del sistema operativo solo se inferiore a</translation>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation>Algoritmo di trasferimento </translation>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation>Affiancare se inferiore a</translation>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation>Varie</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
- <translation>Controllare lo spazio su disco</translation>
+ <translation>Controllare spazio su disco</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
- <translation type="unfinished"></translation>
+ <translation>Usare questa cartella quando la destinazione non è impostata</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation>Sfoglia</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation>Filtri</translation>
</message>
@@ -1023,7 +864,7 @@
<message>
<location filename="../../fileErrorDialog.ui" line="14"/>
<source>Error with file</source>
- <translation type="unfinished"></translation>
+ <translation>Errore con file</translation>
</message>
<message>
<location filename="../../fileErrorDialog.ui" line="20"/>
@@ -1043,12 +884,12 @@
<message>
<location filename="../../fileErrorDialog.ui" line="93"/>
<source>File name</source>
- <translation>Nome del file</translation>
+ <translation>Nome file</translation>
</message>
<message>
<location filename="../../fileErrorDialog.ui" line="110"/>
<source>Destination</source>
- <translation>Cartella di destinazione</translation>
+ <translation>Destinazione</translation>
</message>
<message>
<location filename="../../fileErrorDialog.ui" line="127"/>
@@ -1058,17 +899,17 @@
<message>
<location filename="../../fileErrorDialog.ui" line="173"/>
<source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
+ <translation>Esegui sempre questa azione</translation>
</message>
<message>
<location filename="../../fileErrorDialog.ui" line="193"/>
<source>Try in with elevated privileges</source>
- <translation type="unfinished"></translation>
+ <translation>Tenta con privilegi superiori</translation>
</message>
<message>
<location filename="../../fileErrorDialog.ui" line="200"/>
<source>Put to bottom</source>
- <translation>Mettere in coda</translation>
+ <translation>Metti in coda</translation>
</message>
<message>
<location filename="../../fileErrorDialog.ui" line="207"/>
@@ -1078,12 +919,12 @@
<message>
<location filename="../../fileErrorDialog.ui" line="214"/>
<source>&amp;Skip</source>
- <translation>&amp;Salta</translation>
+ <translation>Salta</translation>
</message>
<message>
<location filename="../../fileErrorDialog.ui" line="221"/>
<source>&amp;Cancel</source>
- <translation>&amp;Annulla</translation>
+ <translation>Annulla</translation>
</message>
</context>
<context>
@@ -1091,17 +932,17 @@
<message>
<location filename="../../fileExistsDialog.ui" line="14"/>
<source>The file exists</source>
- <translation>Il file è già presente</translation>
+ <translation>File è già presente</translation>
</message>
<message>
<location filename="../../fileExistsDialog.ui" line="34"/>
<source>Source</source>
- <translation>Cartella di origine</translation>
+ <translation>Origine</translation>
</message>
<message>
<location filename="../../fileExistsDialog.ui" line="50"/>
<source>Destination</source>
- <translation>Cartella di destinazione</translation>
+ <translation>Destinazione</translation>
</message>
<message>
<location filename="../../fileExistsDialog.ui" line="82"/>
@@ -1119,7 +960,7 @@
<location filename="../../fileExistsDialog.ui" line="116"/>
<location filename="../../fileExistsDialog.ui" line="204"/>
<source>File name</source>
- <translation>Nome del file</translation>
+ <translation>Nome file</translation>
</message>
<message>
<location filename="../../fileExistsDialog.ui" line="133"/>
@@ -1130,38 +971,50 @@
<message>
<location filename="../../fileExistsDialog.ui" line="277"/>
<source>Suggest new &amp;name</source>
- <translation>Suggerisci un nuovo &amp;nome</translation>
+ <translation>Suggerisci nuovo nome</translation>
</message>
<message>
<location filename="../../fileExistsDialog.ui" line="288"/>
<source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
+ <translation>Esegui sempre questa azione</translation>
</message>
<message>
<location filename="../../fileExistsDialog.ui" line="346"/>
<location filename="../../fileExistsDialog.ui" line="349"/>
<source>Overwrite if modification date differs</source>
- <translation type="unfinished"></translation>
+ <translation>Sovrascrivere se data di modifica differisce</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation>Sovrascrivere se dimensione differisce</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation>Sovrascrivere se dimensione e data differiscono</translation>
</message>
<message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
- <translation>&amp;Rinomina</translation>
+ <translation>Rinomina</translation>
</message>
<message>
<location filename="../../fileExistsDialog.ui" line="315"/>
<source>&amp;Overwrite</source>
- <translation>&amp;Sovrascrivi</translation>
+ <translation>Sovrascrivi</translation>
</message>
<message>
<location filename="../../fileExistsDialog.ui" line="325"/>
<source>&amp;Skip</source>
- <translation>&amp;Salta</translation>
+ <translation>Salta</translation>
</message>
<message>
<location filename="../../fileExistsDialog.ui" line="332"/>
<source>&amp;Cancel</source>
- <translation>&amp;Annulla</translation>
+ <translation>Annulla</translation>
</message>
<message>
<location filename="../../fileExistsDialog.ui" line="341"/>
@@ -1190,12 +1043,12 @@
<message>
<location filename="../../fileIsSameDialog.ui" line="70"/>
<source>File name</source>
- <translation>Nome del file</translation>
+ <translation>Nome file</translation>
</message>
<message>
<location filename="../../fileIsSameDialog.ui" line="14"/>
<source>The source and destination are same</source>
- <translation type="unfinished"></translation>
+ <translation>Origine e destinazioni sono identiche</translation>
</message>
<message>
<location filename="../../fileIsSameDialog.ui" line="90"/>
@@ -1205,27 +1058,27 @@
<message>
<location filename="../../fileIsSameDialog.ui" line="159"/>
<source>Suggest new &amp;name</source>
- <translation>Suggerisci nuovo &amp;nome</translation>
+ <translation>Suggerisci nuovo nome</translation>
</message>
<message>
<location filename="../../fileIsSameDialog.ui" line="170"/>
<source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
+ <translation>Esegui sempre questa azione</translation>
</message>
<message>
<location filename="../../fileIsSameDialog.ui" line="190"/>
<source>&amp;Rename</source>
- <translation>&amp;Rinomina</translation>
+ <translation>Rinomina</translation>
</message>
<message>
<location filename="../../fileIsSameDialog.ui" line="197"/>
<source>&amp;Skip</source>
- <translation>&amp;Salta</translation>
+ <translation>Salta</translation>
</message>
<message>
<location filename="../../fileIsSameDialog.ui" line="204"/>
<source>&amp;Cancel</source>
- <translation>&amp;Annulla</translation>
+ <translation>Annulla</translation>
</message>
</context>
<context>
@@ -1233,17 +1086,17 @@
<message>
<location filename="../../folderExistsDialog.ui" line="34"/>
<source>Source</source>
- <translation>Cartella di origine</translation>
+ <translation>Origine</translation>
</message>
<message>
<location filename="../../folderExistsDialog.ui" line="50"/>
<source>Destination</source>
- <translation>Cartella di destinazione</translation>
+ <translation>Destinazione</translation>
</message>
<message>
<location filename="../../folderExistsDialog.ui" line="14"/>
<source>The source and destination is identical</source>
- <translation type="unfinished"></translation>
+ <translation>Origine e destinazioni sono identiche</translation>
</message>
<message>
<location filename="../../folderExistsDialog.ui" line="82"/>
@@ -1255,7 +1108,7 @@
<location filename="../../folderExistsDialog.ui" line="99"/>
<location filename="../../folderExistsDialog.ui" line="160"/>
<source>Folder name</source>
- <translation>Nome della cartella</translation>
+ <translation>Nome cartella</translation>
</message>
<message>
<location filename="../../folderExistsDialog.ui" line="116"/>
@@ -1266,17 +1119,17 @@
<message>
<location filename="../../folderExistsDialog.ui" line="227"/>
<source>Suggest new &amp;name</source>
- <translation>Suggerisci nuovo &amp;nome</translation>
+ <translation>Suggerisci nuovo nome</translation>
</message>
<message>
<location filename="../../folderExistsDialog.ui" line="238"/>
<source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
+ <translation>Esegui sempre questa azione</translation>
</message>
<message>
<location filename="../../folderExistsDialog.ui" line="245"/>
<source>&amp;Rename</source>
- <translation>&amp;Rinomina</translation>
+ <translation>Rinomina</translation>
</message>
<message>
<location filename="../../folderExistsDialog.ui" line="252"/>
@@ -1291,7 +1144,7 @@
<message>
<location filename="../../folderExistsDialog.ui" line="266"/>
<source>&amp;Cancel</source>
- <translation>&amp;Annulla</translation>
+ <translation>Annulla</translation>
</message>
</context>
</TS>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/ja/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/ja/translation.qm
new file mode 100755
index 0000000..3738845
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/ja/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/hi/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/ja/translation.ts
index e17b3f2..a771060 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Languages/hi/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/ja/translation.ts
@@ -2,143 +2,93 @@
<!DOCTYPE TS>
<TS version="2.1">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -146,85 +96,75 @@
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
+ <source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -260,12 +200,12 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
<translation type="unfinished"></translation>
</message>
@@ -273,22 +213,22 @@
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -296,22 +236,22 @@
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -319,6 +259,11 @@
<context>
<name>FilterRules</name>
<message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../FilterRules.ui" line="33"/>
<source>Search:</source>
<translation type="unfinished"></translation>
@@ -364,6 +309,11 @@
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../FilterRules.ui" line="125"/>
<source>The test string matches with the regex</source>
<translation type="unfinished"></translation>
@@ -374,23 +324,13 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FilterRules.ui" line="115"/>
- <source>Test string:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="17"/>
- <source>Filters dialog</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="95"/>
- <source>Whole string must match</source>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FilterRules.ui" line="108"/>
- <source>The regex is valid</source>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -402,55 +342,55 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation type="unfinished"></translation>
</message>
@@ -458,27 +398,27 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -486,49 +426,49 @@
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -536,33 +476,39 @@
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation type="unfinished"></translation>
</message>
@@ -570,24 +516,17 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
<translation type="unfinished"></translation>
</message>
@@ -595,6 +534,11 @@
<context>
<name>RenamingRules</name>
<message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../RenamingRules.ui" line="35"/>
<source>First renaming</source>
<translation type="unfinished"></translation>
@@ -623,193 +567,123 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -821,193 +695,163 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
<source>Performance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation type="unfinished"></translation>
</message>
@@ -1138,6 +982,18 @@
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
<translation type="unfinished"></translation>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/ko/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/ko/translation.qm
new file mode 100755
index 0000000..5bec6b9
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/ko/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/ko/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/ko/translation.ts
index 7698857..f8a23f8 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Languages/ko/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/ko/translation.ts
@@ -2,143 +2,93 @@
<!DOCTYPE TS>
<TS version="2.1" language="ko_KR">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation>이 플랫폼에서 지원되지 않습니다</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation>마지막 수정 날짜가 잘못되었습니다</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation>마지막 엑세스 날짜가 잘못되었습니다</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
<translation type="unfinished">대상</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation type="unfinished">확인</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation type="unfinished">건너뛰기</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation type="unfinished">합치기</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation type="unfinished">이름 바꾸기</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation type="unfinished">더 최신이면 덮어씌우기</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -146,85 +96,75 @@
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation type="unfinished">확인</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation type="unfinished">건너뛰기</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation type="unfinished">합치기</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation type="unfinished">이름 바꾸기</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation type="unfinished">더 최신이면 덮어씌우기</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
+ <source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -260,12 +200,12 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
<translation type="unfinished">폴더 이름</translation>
</message>
@@ -273,22 +213,22 @@
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation type="unfinished">오류</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -296,22 +236,22 @@
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation type="unfinished">오류</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -402,55 +342,55 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation type="unfinished"></translation>
</message>
@@ -458,27 +398,27 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation type="unfinished">오류</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -486,49 +426,49 @@
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
<translation type="unfinished"></translation>
</message>
@@ -536,33 +476,39 @@
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation>폴더를 생성할 수 없습니다</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation type="unfinished"></translation>
</message>
@@ -570,24 +516,17 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
- <translation>원본 파일 읽기 불가:</translation>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
<translation type="unfinished"></translation>
</message>
@@ -628,188 +567,123 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished">폴더를 읽을 수 없습니다</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished">원본 파일 읽기 불가:</translation>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -821,193 +695,163 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
<translation type="unfinished">파일 권한 전송</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
<translation type="unfinished">파일 날짜 보존</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
<translation type="unfinished">폴더 오류시</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
<source>When folder collision</source>
<translation type="unfinished">폴더 충돌시</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
<source>Check if destination folder exists</source>
<translation type="unfinished">대상 폴드 존재시 확인</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
<source>Renaming rules</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
<source>Delete partially transferred files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
<source>Rename the original destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
<source>Performance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished">KB</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation type="unfinished">블럭 크기</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation type="unfinished"></translation>
</message>
@@ -1138,6 +982,18 @@
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
<translation>&amp;이름 바꾸기</translation>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/nl/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/nl/translation.qm
new file mode 100755
index 0000000..3738845
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/nl/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/nl/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/nl/translation.ts
new file mode 100755
index 0000000..ef5da14
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/nl/translation.ts
@@ -0,0 +1,1147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="685"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="980"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="986"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="990"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="991"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="992"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="993"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="39"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="111"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="132"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="227"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="255"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="278"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="309"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="35"/>
+ <source>First renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="41"/>
+ <source>%name% - copy%suffix%</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="57"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="67"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="51"/>
+ <source>Second renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
+ <source>%name% - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
+ <source>%name% - copy (%number%)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/no/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/no/translation.qm
new file mode 100755
index 0000000..3738845
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/no/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/no/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/no/translation.ts
new file mode 100755
index 0000000..ef5da14
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/no/translation.ts
@@ -0,0 +1,1147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="685"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="980"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="986"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="990"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="991"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="992"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="993"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="39"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="111"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="132"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="227"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="255"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="278"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="309"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="35"/>
+ <source>First renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="41"/>
+ <source>%name% - copy%suffix%</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="57"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="67"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="51"/>
+ <source>Second renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
+ <source>%name% - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
+ <source>%name% - copy (%number%)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/pl/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/pl/translation.qm
new file mode 100755
index 0000000..3738845
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/pl/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/pl/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/pl/translation.ts
new file mode 100755
index 0000000..ef5da14
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/pl/translation.ts
@@ -0,0 +1,1147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="685"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="980"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="986"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="990"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="991"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="992"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="993"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="39"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="111"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="132"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="227"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="255"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="278"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="309"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="35"/>
+ <source>First renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="41"/>
+ <source>%name% - copy%suffix%</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="57"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="67"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="51"/>
+ <source>Second renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
+ <source>%name% - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
+ <source>%name% - copy (%number%)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/pt/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/pt/translation.qm
new file mode 100755
index 0000000..3738845
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/pt/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/pt/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/pt/translation.ts
new file mode 100755
index 0000000..ef5da14
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/pt/translation.ts
@@ -0,0 +1,1147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="685"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="980"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="986"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="990"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="991"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="992"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="993"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="39"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="111"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="132"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="227"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="255"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="278"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="309"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="35"/>
+ <source>First renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="41"/>
+ <source>%name% - copy%suffix%</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="57"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="67"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="51"/>
+ <source>Second renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
+ <source>%name% - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
+ <source>%name% - copy (%number%)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/ru/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/ru/translation.qm
new file mode 100755
index 0000000..a1f6180
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/ru/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/Languages/ru/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/ru/translation.ts
index 3b103c5..2115820 100644..100755
--- a/plugins/CopyEngine/Ultracopier/Languages/ru/translation.ts
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/ru/translation.ts
@@ -2,143 +2,93 @@
<!DOCTYPE TS>
<TS version="2.1" language="ru" sourcelanguage="en">
<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation>Не поддерживается на этой платформе</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation>Дата обновления неправильно</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation>Дата последнего доступа не так</translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
<name>CopyEngine</name>
<message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
<source>The engine is forced to move, you can&apos;t copy with it</source>
<translation type="unfinished">Двигатель вынуждены покинуть свои дома, вы не можете скопировать с ним</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
<source>The engine is forced to copy, you can&apos;t move with it</source>
<translation type="unfinished">Двигатель вынужден копии, вы не можете двигаться вместе с ним</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Destination</source>
<translation type="unfinished">назначение</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="508"/>
+ <location filename="../../CopyEngine.cpp" line="520"/>
<source>Use the actual destination &quot;%1&quot;?</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="732"/>
+ <location filename="../../CopyEngine.cpp" line="685"/>
<source>The mode has been forced previously. This is an internal error, please report it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
<source>Ask</source>
<translation type="unfinished">просить</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
<source>Skip</source>
<translation type="unfinished">пропускать</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
+ <location filename="../../CopyEngine.cpp" line="980"/>
<source>Merge</source>
<translation type="unfinished">слияние</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
<source>Rename</source>
<translation type="unfinished">переименовать</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
+ <location filename="../../CopyEngine.cpp" line="986"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
+ <location filename="../../CopyEngine.cpp" line="990"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
+ <location filename="../../CopyEngine.cpp" line="991"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
+ <location filename="../../CopyEngine.cpp" line="992"/>
<source>Overwrite if newer</source>
<translation type="unfinished">Заменить, если новее</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
+ <location filename="../../CopyEngine.cpp" line="993"/>
<source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options error</source>
<translation type="unfinished">Опции ошибке</translation>
</message>
<message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
@@ -146,85 +96,75 @@
<context>
<name>CopyEngineFactory</name>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
<source>Ask</source>
<translation type="unfinished">просить</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
<source>Skip</source>
<translation type="unfinished">пропускать</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
<source>Merge</source>
<translation type="unfinished">слияние</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
<source>Rename</source>
<translation type="unfinished">переименовать</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
<source>Put at the end</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
<source>Overwrite</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
<source>Overwrite if different</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
<source>Overwrite if newer</source>
<translation type="unfinished">Заменить, если новее</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
<location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
+ <source>Overwrite if older</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options error</source>
<translation type="unfinished">Опции ошибке</translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
<source>Options engine is not loaded. Unable to access the filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
<source>Options engine is not loaded, can&apos;t access to the filters</source>
<translation type="unfinished">Параметры двигателя не загружается, не может получить доступ к фильтрам</translation>
</message>
@@ -260,12 +200,12 @@
<context>
<name>FileErrorDialog</name>
<message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
<source>Error on folder</source>
<translation type="unfinished">Ошибка в папку</translation>
</message>
<message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
<source>Folder name</source>
<translation type="unfinished">имя папки</translation>
</message>
@@ -273,22 +213,22 @@
<context>
<name>FileExistsDialog</name>
<message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
<source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
<source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Error</source>
<translation type="unfinished">ошибка</translation>
</message>
<message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -296,22 +236,22 @@
<context>
<name>FileIsSameDialog</name>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - копия</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - копия (%number%)</translation>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Error</source>
<translation type="unfinished">ошибка</translation>
</message>
<message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -402,55 +342,55 @@
<translation>Фильтры</translation>
</message>
<message>
- <location filename="../../Filters.ui" line="30"/>
+ <location filename="../../Filters.ui" line="39"/>
<source>Exclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="93"/>
+ <location filename="../../Filters.ui" line="111"/>
<source>Inclusion filters</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../Filters.ui" line="105"/>
+ <location filename="../../Filters.ui" line="132"/>
<source>None = Include all</source>
<translation>Ни = Включить все</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
<source>Raw text</source>
<translation>Сырой текст</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
<source>Simplified regex</source>
<translation>Упрощенная регулярных выражений</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
<source>Perl&apos;s regex</source>
<translation>Perl&apos;s regex</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
<source>Only on file</source>
<translation>Только на файл</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
<source>Only on folder</source>
<translation>Только на папку</translation>
</message>
<message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
<source>Full match</source>
<translation>Полный матч</translation>
</message>
@@ -458,27 +398,27 @@
<context>
<name>FolderExistsDialog</name>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
<source>Folder already exists</source>
<translation type="unfinished">Папка уже существует</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - копия</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - копия (%number%)</translation>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Error</source>
<translation type="unfinished">ошибка</translation>
</message>
<message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
<source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
@@ -486,49 +426,49 @@
<context>
<name>ListThread</name>
<message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
<source>Unable do to move or copy item into wrong forced mode: %1</source>
<translation>Невозможно сделать, чтобы скопировать или переместить элемент в неправильном форсированном режиме: %1</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
<source>Unable to save the transfer list: %1</source>
<translation>Невозможно сохранить трансфер: %1</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1510"/>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
<source>Problem reading file, or file-size is 0</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1517"/>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
<source>Wrong header: &quot;%1&quot;</source>
<translation>Неправильный заголовок: &quot;%1&quot;</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1526"/>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
<source>The transfer list is in mixed mode, but this instance is not in this mode</source>
<translation>Трансфер в смешанном режиме, но этот экземпляр не в этом режиме</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1535"/>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
<source>The transfer list is in copy mode, but this instance is not in this mode</source>
<translation>Передача списка в режиме копирования, но этот экземпляр не в этом режиме</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1541"/>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
<source>The transfer list is in move mode, but this instance is not in this mode</source>
<translation>Трансфер в режим перемещения, но этот экземпляр не в этом режиме</translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1604"/>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
<source>Some errors have been found during the line parsing</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ListThread.cpp" line="1612"/>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
<source>Unable to open the transfer list: %1</source>
<translation>Не удается открыть трансфер: %1</translation>
</message>
@@ -536,33 +476,39 @@
<context>
<name>MkPath</name>
<message>
- <location filename="../../MkPath.cpp" line="142"/>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
<source>Unable to create the folder</source>
<translation>Невозможно создать папку</translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="155"/>
+ <location filename="../../MkPath.cpp" line="227"/>
<source>The source folder don&apos;t exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="183"/>
+ <location filename="../../MkPath.cpp" line="255"/>
<source>Unable to temporary rename the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="206"/>
+ <location filename="../../MkPath.cpp" line="278"/>
<source>Unable to do the final real move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="233"/>
+ <location filename="../../MkPath.cpp" line="309"/>
<source>Unable to move the folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
<source>Unable to remove</source>
<translation type="unfinished"></translation>
</message>
@@ -570,26 +516,19 @@
<context>
<name>ReadThread</name>
<message>
- <location filename="../../ReadThread.cpp" line="59"/>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
<source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
<source>Unable to read the source file: </source>
- <translation>Невозможно прочитать исходный файл: </translation>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
<source>File truncated during the read, possible data change</source>
- <translation>Файл усечены во время чтения, возможность изменения данных</translation>
+ <translation type="unfinished"></translation>
</message>
</context>
<context>
@@ -623,193 +562,128 @@
<translation>Второе переименование</translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation>%1 - копия</translation>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>Переименование правила</translation>
</message>
<message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation>%1 - копия (%2)</translation>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation>Переименование правила</translation>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation type="unfinished">%1 - копия (%2) {1 ?} {2)%3?}</translation>
</message>
</context>
<context>
<name>ScanFileOrFolder</name>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
<source>%1 - copy</source>
<translation type="unfinished">%1 - копия</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
<source>%1 - copy (%2)</source>
<translation type="unfinished">%1 - копия (%2)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
<source>%name% - copy</source>
<translation type="unfinished">%name% - копия</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
<source>%name% - copy (%number%)</source>
<translation type="unfinished">%name% - копия (%number%)</translation>
</message>
<message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished">Папки не читается</translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>TransferThread</name>
<message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished">%name% - копия</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished">%name% - копия (%number%)</translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
<translation type="unfinished"></translation>
</message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
<message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
<translation type="unfinished"></translation>
</message>
</context>
<context>
<name>WriteThread</name>
<message>
- <location filename="../../WriteThread.cpp" line="83"/>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
<source>Path resolution error (Empty path)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation>Невозможно прочитать исходный файл: </translation>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
<translation type="unfinished"></translation>
</message>
</context>
@@ -821,193 +695,163 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
<source>Move the whole folder</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
<source>Transfer the file rights</source>
<translation type="unfinished">Передача файлов прав</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
<source>Keep the file date</source>
<translation type="unfinished">Держите дату файла</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
<source>Error and collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
<source>When folder error</source>
<translation type="unfinished">Когда папка ошибка</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
<source>When file error</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
<source>When file collision</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
<source>When folder collision</source>
<translation type="unfinished">Когда папка столкновения</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
<source>Check if destination folder exists</source>
<translation type="unfinished">Убедитесь, что папка существует</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
<source>Renaming rules</source>
<translation type="unfinished">Переименование правила</translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
<source>Delete partially transferred files</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
<source>Rename the original destination</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
+ <source>Performance</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation type="unfinished">Контрольная</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation type="unfinished">Только после того, как ошибка</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation type="unfinished">Игнорировать, если невозможно</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
- <source>Performance</source>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished">KB</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation type="unfinished">размер блока</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation type="unfinished">Включить OS буфер</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation type="unfinished">ОС буфер, только если меньше</translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
<source>Misc</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
<source>Check the disk space</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
<source>Use this folder when destination is not set</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
<source>Browse</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
<source>Filters</source>
<translation type="unfinished">Фильтры</translation>
</message>
@@ -1138,6 +982,18 @@
<translation type="unfinished"></translation>
</message>
<message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
<location filename="../../fileExistsDialog.ui" line="308"/>
<source>&amp;Rename</source>
<translation>переименовать</translation>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/th/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/th/translation.qm
new file mode 100755
index 0000000..3738845
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/th/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/th/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/th/translation.ts
new file mode 100755
index 0000000..ef5da14
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/th/translation.ts
@@ -0,0 +1,1147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="685"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="980"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="986"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="990"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="991"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="992"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="993"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="39"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="111"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="132"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="227"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="255"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="278"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="309"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="35"/>
+ <source>First renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="41"/>
+ <source>%name% - copy%suffix%</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="57"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="67"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="51"/>
+ <source>Second renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
+ <source>%name% - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
+ <source>%name% - copy (%number%)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/tr/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/tr/translation.qm
new file mode 100755
index 0000000..3738845
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/tr/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/tr/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/tr/translation.ts
new file mode 100755
index 0000000..ef5da14
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/tr/translation.ts
@@ -0,0 +1,1147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="685"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="980"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="986"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="990"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="991"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="992"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="993"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="39"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="111"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="132"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="227"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="255"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="278"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="309"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="35"/>
+ <source>First renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="41"/>
+ <source>%name% - copy%suffix%</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="57"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="67"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="51"/>
+ <source>Second renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
+ <source>%name% - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
+ <source>%name% - copy (%number%)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/zh/translation.qm b/plugins/CopyEngine/Ultracopier-Spec/Languages/zh/translation.qm
new file mode 100755
index 0000000..3738845
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/zh/translation.qm
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier-Spec/Languages/zh/translation.ts b/plugins/CopyEngine/Ultracopier-Spec/Languages/zh/translation.ts
new file mode 100755
index 0000000..a771060
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/Languages/zh/translation.ts
@@ -0,0 +1,1147 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.1">
+<context>
+ <name>CopyEngine</name>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="438"/>
+ <location filename="../../CopyEngine.cpp" line="461"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="473"/>
+ <location filename="../../CopyEngine.cpp" line="496"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="520"/>
+ <source>Use the actual destination &quot;%1&quot;?</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="685"/>
+ <source>The mode has been forced previously. This is an internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="976"/>
+ <location filename="../../CopyEngine.cpp" line="979"/>
+ <location filename="../../CopyEngine.cpp" line="984"/>
+ <location filename="../../CopyEngine.cpp" line="988"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="977"/>
+ <location filename="../../CopyEngine.cpp" line="981"/>
+ <location filename="../../CopyEngine.cpp" line="985"/>
+ <location filename="../../CopyEngine.cpp" line="989"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="980"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="982"/>
+ <location filename="../../CopyEngine.cpp" line="994"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="986"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="990"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="991"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="992"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="993"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngine.cpp" line="1064"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>CopyEngineFactory</name>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="303"/>
+ <source>Supported only on Windows</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="430"/>
+ <location filename="../../CopyEngineFactory.cpp" line="433"/>
+ <location filename="../../CopyEngineFactory.cpp" line="438"/>
+ <location filename="../../CopyEngineFactory.cpp" line="442"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="431"/>
+ <location filename="../../CopyEngineFactory.cpp" line="435"/>
+ <location filename="../../CopyEngineFactory.cpp" line="439"/>
+ <location filename="../../CopyEngineFactory.cpp" line="443"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="434"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="436"/>
+ <location filename="../../CopyEngineFactory.cpp" line="448"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="440"/>
+ <source>Put at the end</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="444"/>
+ <source>Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="445"/>
+ <source>Overwrite if different</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="446"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="447"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="463"/>
+ <source>Options engine is not loaded. Unable to access the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../CopyEngineFactory.cpp" line="502"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>DiskSpace</name>
+ <message>
+ <location filename="../../DiskSpace.ui" line="14"/>
+ <source>Disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="24"/>
+ <source>You need more space on this drive to finish this transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="49"/>
+ <source>Continue</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.ui" line="56"/>
+ <source>Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../DiskSpace.cpp" line="23"/>
+ <source>Drives %1 have %2 available but need %3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileErrorDialog</name>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="87"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileErrorDialog.cpp" line="90"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileExistsDialog</name>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="191"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="198"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileExistsDialog.cpp" line="289"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FileIsSameDialog</name>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="140"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="147"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FileIsSameDialog.cpp" line="220"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>Whole string must match</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string matches with the regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="39"/>
+ <source>Exclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="111"/>
+ <source>Inclusion filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="132"/>
+ <source>None = Include all</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="94"/>
+ <location filename="../../Filters.cpp" line="132"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="97"/>
+ <location filename="../../Filters.cpp" line="135"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="100"/>
+ <location filename="../../Filters.cpp" line="138"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="108"/>
+ <location filename="../../Filters.cpp" line="146"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="111"/>
+ <location filename="../../Filters.cpp" line="149"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="117"/>
+ <location filename="../../Filters.cpp" line="155"/>
+ <location filename="../../Filters.cpp" line="217"/>
+ <location filename="../../Filters.cpp" line="256"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>FolderExistsDialog</name>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="84"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="164"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="173"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FolderExistsDialog.cpp" line="240"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="242"/>
+ <location filename="../../ListThreadListChange.cpp" line="413"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="249"/>
+ <location filename="../../ListThreadListChange.cpp" line="420"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="270"/>
+ <source>Problem reading file, or file-size is 0</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="277"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="286"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="295"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="301"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="365"/>
+ <source>Some errors have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThreadListChange.cpp" line="373"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="187"/>
+ <location filename="../../MkPath.cpp" line="210"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="227"/>
+ <source>The source folder don&apos;t exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="255"/>
+ <source>Unable to temporary rename the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="278"/>
+ <source>Unable to do the final real move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="309"/>
+ <source>Unable to move the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="315"/>
+ <source>Unable to move the folder: errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../MkPath.cpp" line="124"/>
+ <location filename="../../MkPath.cpp" line="394"/>
+ <source>Unable to remove</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="78"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="541"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/ReadThread.cpp" line="595"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="35"/>
+ <source>First renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="41"/>
+ <source>%name% - copy%suffix%</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="57"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="67"/>
+ <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="51"/>
+ <source>Second renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="46"/>
+ <location filename="../../RenamingRules.cpp" line="71"/>
+ <source>%1 - copy%2</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="50"/>
+ <location filename="../../RenamingRules.cpp" line="84"/>
+ <source>%1 - copy (%2)%3</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ScanFileOrFolder</name>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="442"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="444"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="453"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="455"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="566"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="568"/>
+ <source>%name% - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="577"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="579"/>
+ <source>%name% - copy (%number%)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ScanFileOrFolder.cpp" line="663"/>
+ <location filename="../../ScanFileOrFolder.cpp" line="667"/>
+ <source>Problem with folder read</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="613"/>
+ <source>%name% - copy%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="620"/>
+ <source>%name% - copy (%number%)%suffix%</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="648"/>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <source>File not found</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="891"/>
+ <location filename="../../TransferThread.cpp" line="927"/>
+ <source>Unable to change the date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="179"/>
+ <source>Try rename with using special characters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThreadAsync</name>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="340"/>
+ <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="428"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="446"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/TransferThreadAsync.cpp" line="431"/>
+ <location filename="../../async/TransferThreadAsync.cpp" line="448"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="135"/>
+ <source>Path resolution error (Empty path)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="164"/>
+ <location filename="../../async/WriteThread.cpp" line="197"/>
+ <source>Unable to create the destination folder: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="175"/>
+ <location filename="../../async/WriteThread.cpp" line="199"/>
+ <source>Unable to create the destination folder, errno: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../async/WriteThread.cpp" line="456"/>
+ <source>Internal error, please report it!</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngineOptions</name>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="44"/>
+ <source>Transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="63"/>
+ <source>Move the whole folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="97"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="76"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="114"/>
+ <source>Create full path if not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="138"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="83"/>
+ <source>Auto start</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="154"/>
+ <source>Error and collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="160"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="170"/>
+ <source>When file error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="196"/>
+ <source>When file collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="239"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="244"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="266"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="297"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="304"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="324"/>
+ <source>Delete partially transferred files</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="337"/>
+ <source>Rename the original destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="368"/>
+ <source>Performance</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="387"/>
+ <source>Inode threads</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="397"/>
+ <location filename="../../copyEngineOptions.ui" line="413"/>
+ <source>MB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="429"/>
+ <source>Uncheck this under Windows create problem</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="436"/>
+ <source>OS Buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="456"/>
+ <source>Disable parallel transfer when are different devices</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="463"/>
+ <source>Buffer for different device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="470"/>
+ <source>OS FLags</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="477"/>
+ <source>Buffer for same device</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="484"/>
+ <source>OS native copy (disable speed limitation)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="514"/>
+ <source>Misc</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="520"/>
+ <source>Check the disk space</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="530"/>
+ <source>Use this folder when destination is not set</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="542"/>
+ <source>Browse</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngineOptions.ui" line="564"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error with file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="59"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="76"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="93"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="110"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="127"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="173"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="193"/>
+ <source>Try in with elevated privileges</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="200"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="207"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="214"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="221"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="204"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="133"/>
+ <location filename="../../fileExistsDialog.ui" line="221"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="277"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="288"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="346"/>
+ <location filename="../../fileExistsDialog.ui" line="349"/>
+ <source>Overwrite if modification date differs</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="362"/>
+ <location filename="../../fileExistsDialog.ui" line="365"/>
+ <source>Overwrite if not same size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="370"/>
+ <location filename="../../fileExistsDialog.ui" line="373"/>
+ <source>Overwrite if not same size and date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="308"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="315"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="325"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="332"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="341"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="354"/>
+ <location filename="../../fileExistsDialog.ui" line="357"/>
+ <source>Overwrite if older</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="40"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="110"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="70"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>The source and destination are same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="90"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="159"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="170"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="190"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="197"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="204"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>The source and destination is identical</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="82"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="99"/>
+ <location filename="../../folderExistsDialog.ui" line="160"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="116"/>
+ <location filename="../../folderExistsDialog.ui" line="184"/>
+ <source>Folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="227"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="238"/>
+ <source>&amp;Always perform this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="245"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="252"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="259"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="266"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ListThread.cpp b/plugins/CopyEngine/Ultracopier-Spec/ListThread.cpp
new file mode 100755
index 0000000..9c5e8f8
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/ListThread.cpp
@@ -0,0 +1,1235 @@
+#include "ListThread.h"
+#include <QStorageInfo>
+#include <QtGlobal>
+#include "../../../cpp11addition.h"
+
+#include "async/TransferThreadAsync.h"
+#ifdef Q_OS_LINUX
+#include <sys/sysinfo.h>
+#endif
+#ifdef Q_OS_WIN32
+#include <sysinfoapi.h>
+#endif
+
+ListThread::ListThread(FacilityInterface * facilityInterface) :
+ numberOfInodeOperation(0),
+ sourceDriveMultiple(false),
+ destinationDriveMultiple(false),
+ destinationFolderMultiple(false),
+ stopIt(false),
+ numberOfTransferIntoToDoList(0),
+ bytesToTransfer(0),
+ bytesTransfered(0),
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ rsync(false),
+ #endif
+ idIncrementNumber(1),
+ actualRealByteTransfered(0),
+ checkDestinationFolderExists(false),
+ parallelizeIfSmallerThan(1024),
+ moveTheWholeFolder(false),
+ deletePartiallyTransferredFiles(true),
+ inodeThreads(1),
+ renameTheOriginalDestination(false),
+ checkDiskSpace(true),
+ buffer(false),
+ followTheStrictOrder(true),
+ mode(Ultracopier::CopyMode::Copy),
+ forcedMode(false),
+ actionToDoListTransfer_count(0),
+ actionToDoListInode_count(0),
+ doTransfer(false),
+ doInode(false),
+ oversize(0),
+ currentProgression(0),
+ copiedSize(0),
+ totalSize(0),
+ localOverSize(0),
+ doRightTransfer(false),
+ keepDate(false),
+ os_spec_flags(true),
+ native_copy(false),
+ mkFullPath(false),
+ alwaysDoThisActionForFileExists(FileExists_NotSet),
+ speedLimitation(0),
+ returnBoolToCopyEngine(true)
+{
+ moveToThread(this);
+ start(HighPriority);
+ this->facilityInterface=facilityInterface;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ clockForTheCopySpeed = NULL;
+ multiForBigSpeed = 0;
+ blockSize = 65536;
+ blockSizeAfterSpeedLimitation = blockSize;
+ #endif
+ putInPause = false;
+ autoStart=true;
+
+ //can't be static into WriteThread, linked by instance then by ListThread
+ writeFileList=new QMultiHash<QString,WriteThread *>();
+ writeFileListMutex=new QMutex();
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+ if(!connect(&timerUpdateDebugDialog,&QTimer::timeout,this,&ListThread::timedUpdateDebugDialog))
+ abort();
+ timerUpdateDebugDialog.start(ULTRACOPIER_PLUGIN_DEBUG_WINDOW_TIMER);
+ #endif
+ if(!connect(this, &ListThread::tryCancel, this,&ListThread::cancel, Qt::QueuedConnection))
+ abort();
+ if(!connect(this, &ListThread::askNewTransferThread, this,&ListThread::createTransferThread, Qt::QueuedConnection))
+ abort();
+ if(!connect(&mkPathQueue, &MkPath::firstFolderFinish, this,&ListThread::mkPathFirstFolderFinish, Qt::QueuedConnection))
+ abort();
+ if(!connect(&mkPathQueue, &MkPath::errorOnFolder, this,&ListThread::mkPathErrorOnFolder, Qt::QueuedConnection))
+ abort();
+ if(!connect(this, &ListThread::send_syncTransferList, this,&ListThread::syncTransferList_internal, Qt::QueuedConnection))
+ abort();
+ if(!connect(this, &ListThread::exportTransferListSend, this,&ListThread::exportTransferListInternal, Qt::QueuedConnection))
+ abort();
+ if(!connect(this, &ListThread::importTransferListSend, this,&ListThread::importTransferListInternal, Qt::QueuedConnection))
+ abort();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(!connect(&mkPathQueue, &MkPath::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection))
+ abort();
+ if(!connect(&driveManagement,&DriveManagement::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection))
+ abort();
+ #endif // ULTRACOPIER_PLUGIN_DEBUG
+
+ emit askNewTransferThread();
+ mkpathTransfer.release();
+
+ int64_t MBMem=100;
+ #ifdef Q_OS_WIN32
+ MEMORYSTATUSEX memoryStatus;
+ if(GlobalMemoryStatusEx(&memoryStatus))
+ MBMem=memoryStatus.ullTotalPhys/1024;
+ #endif
+ #ifdef Q_OS_LINUX
+ struct sysinfo info;
+ if(sysinfo(&info)==0)
+ MBMem=info.totalhigh*info.mem_unit/1024/1024;
+ #endif
+ if(MBMem<1024)
+ WriteThread::numberOfBlock=4+MBMem*0.12;
+ else
+ WriteThread::numberOfBlock=ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
+}
+
+ListThread::~ListThread()
+{
+ emit tryCancel();
+ waitCancel.acquire();
+ quit();
+ wait();
+}
+
+//transfer is finished
+void ListThread::transferInodeIsClosed()
+{
+ if(stopIt)
+ {
+ checkIfReadyToCancel();
+ return;
+ }
+ numberOfInodeOperation--;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
+ #endif
+ TransferThreadAsync *temp_transfer_thread=qobject_cast<TransferThreadAsync *>(QObject::sender());
+ if(temp_transfer_thread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not located!");
+ return;
+ }
+ if(overCheckUsedThread.find(temp_transfer_thread)==overCheckUsedThread.cend())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not located in overcheck");
+ else
+ overCheckUsedThread.erase(temp_transfer_thread);
+ if(putAtBottomAfterError.find(temp_transfer_thread)!=putAtBottomAfterError.cend())
+ {
+ doNewActions_inode_manipulation();
+ doNewActions_start_transfer();
+ return;
+ }
+ bool isFound=false;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ int countLocalParse=0;
+ #endif
+ if(temp_transfer_thread->getStat()!=TransferStat_Idle)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not idle!");
+ return;
+ }
+ unsigned int int_for_internal_loop=0;
+ while(int_for_internal_loop<actionToDoListTransfer.size())
+ {
+ if(actionToDoListTransfer.at(int_for_internal_loop).id==temp_transfer_thread->transferId)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[%1] have finish, put at idle; for id: %2").arg(int_for_internal_loop).arg(temp_transfer_thread->transferId).toStdString());
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::RemoveItem;
+ newAction.userAction.moveAt=0;
+ newAction.addAction=actionToDoTransferToItemOfCopyList(actionToDoListTransfer.at(int_for_internal_loop));
+ newAction.userAction.position=int_for_internal_loop;
+ actionDone.push_back(newAction);
+ /// \todo check if item is at the right thread
+ const int64_t transferTime=temp_transfer_thread->transferTime();
+ if(transferTime>=0 && temp_transfer_thread->haveStartTime)
+ {
+ timeToTransfer.push_back(std::pair<uint64_t,uint32_t>(temp_transfer_thread->transferSize,transferTime));
+ temp_transfer_thread->haveStartTime=false;
+ }
+ actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+int_for_internal_loop);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
+ if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
+ updateTheStatus();
+
+ //add the current size of file, to general size because it's finish
+ copiedSize=temp_transfer_thread->copiedSize();
+ if(copiedSize>(qint64)temp_transfer_thread->transferSize)
+ {
+ oversize=copiedSize-temp_transfer_thread->transferSize;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"add oversize of: "+std::to_string(oversize));
+ bytesToTransfer+=oversize;
+ bytesTransfered+=oversize;
+ }
+ bytesTransfered+=temp_transfer_thread->transferSize;
+
+ temp_transfer_thread->transferId=0;
+ temp_transfer_thread->transferSize=0;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ countLocalParse++;
+ #endif
+ isFound=true;
+ if(actionToDoListTransfer.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionToDoListTransfer==0");
+ actionToDoListInode.insert(actionToDoListInode.cbegin(),actionToDoListInode_afterTheTransfer.cbegin(),actionToDoListInode_afterTheTransfer.cend());
+ actionToDoListInode_afterTheTransfer.clear();
+ doNewActions_inode_manipulation();
+ doNewActions_start_transfer();
+ }
+ break;
+ }
+ int_for_internal_loop++;
+ }
+ if(isFound)
+ deleteTransferThread();
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,QStringLiteral("unable to found item into the todo list, id: %1, index: %2").arg(temp_transfer_thread->transferId).arg(int_for_internal_loop).toStdString());
+ temp_transfer_thread->transferId=0;
+ temp_transfer_thread->transferSize=0;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("countLocalParse: %1, actionToDoList.size(): %2").arg(countLocalParse).arg(actionToDoListTransfer.size()).toStdString());
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(countLocalParse!=1)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"countLocalParse != 1");
+ #endif
+ doNewActions_inode_manipulation();
+ doNewActions_start_transfer();
+}
+
+/** \brief put the current file at bottom in case of error
+\note ONLY IN CASE OF ERROR
+
+transferInodeIsClosed() will be call after, then will do:
+
+BUT
+
+this function call transfer->skip();
+not put at bottom, remove from to do list
+*/
+void ListThread::transferPutAtBottom()
+{
+ TransferThreadAsync *transfer=qobject_cast<TransferThreadAsync *>(QObject::sender());
+ if(transfer==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not located!");
+ return;
+ }
+ bool isFound=false;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ int countLocalParse=0;
+ #endif
+ unsigned int indexAction=0;
+ while(indexAction<actionToDoListTransfer.size())
+ {
+ if(actionToDoListTransfer.at(indexAction).id==transfer->transferId)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Put at the end: "+std::to_string(transfer->transferId));
+ //push for interface at the end
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::MoveItem;
+ newAction.addAction.id=transfer->transferId;
+ newAction.userAction.position=0;
+ newAction.userAction.moveAt=actionToDoListTransfer.size()-1;
+ actionDone.push_back(newAction);
+ //do the wait stat
+ actionToDoListTransfer[indexAction].isRunning=false;
+ //move at the end
+ actionToDoListTransfer.push_back(actionToDoListTransfer.at(indexAction));
+ actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+indexAction);
+ transfer->transferId=0;
+ transfer->transferSize=0;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ countLocalParse++;
+ #endif
+ isFound=true;
+ putAtBottomAfterError.insert(transfer);
+ break;
+ }
+ indexAction++;
+ }
+ if(!isFound)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,QStringLiteral("unable to found item into the todo list, id: %1, index: %2").arg(transfer->transferId).toStdString());
+ transfer->transferId=0;
+ transfer->transferSize=0;
+ putAtBottomAfterError.insert(transfer);
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"countLocalParse: "+std::to_string(countLocalParse));
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(countLocalParse!=1)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"countLocalParse != 1");
+ #endif
+ transfer->skip();
+}
+
+void ListThread::fileTransfer(const INTERNALTYPEPATH &sourceFileInfo,const INTERNALTYPEPATH &destinationFileInfo,const Ultracopier::CopyMode &mode)
+{
+ if(stopIt)
+ return;
+ addToTransfer(sourceFileInfo,destinationFileInfo,mode);
+}
+
+void ListThread::fileTransferWithInode(const INTERNALTYPEPATH &sourceFileInfo,const INTERNALTYPEPATH &destinationFileInfo,
+ const Ultracopier::CopyMode &mode,const TransferThread::dirent_uc &inode)
+{
+ if(stopIt)
+ return;
+ #ifdef Q_OS_WIN32
+ addToTransfer(sourceFileInfo,destinationFileInfo,mode,inode.size);
+ #else
+ (void)inode;
+ addToTransfer(sourceFileInfo,destinationFileInfo,mode);
+ #endif
+}
+
+void ListThread::autoStartAndCheckSpace()
+{
+ if(needMoreSpace())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Need more space");
+ return;
+ }
+ autoStartIfNeeded();
+}
+
+void ListThread::autoStartIfNeeded()
+{
+ if(autoStart)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Auto start the copy");
+ startGeneralTransfer();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Put the copy engine in pause");
+ putInPause=true;
+ emit isInPause(true);
+ }
+}
+
+//set auto start
+void ListThread::setAutoStart(const bool autoStart)
+{
+ this->autoStart=autoStart;
+}
+
+void ListThread::startGeneralTransfer()
+{
+ doNewActions_inode_manipulation();
+}
+
+/** \brief to sync the transfer list
+ * Used when the interface is changed, useful to minimize the memory size */
+void ListThread::syncTransferList()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit send_syncTransferList();
+}
+
+bool ListThread::getReturnBoolToCopyEngine() const
+{
+ return returnBoolToCopyEngine;
+}
+
+std::pair<quint64, quint64> ListThread::getReturnPairQuint64ToCopyEngine() const
+{
+ return returnPairQuint64ToCopyEngine;
+}
+
+Ultracopier::ItemOfCopyList ListThread::getReturnItemOfCopyListToCopyEngine() const
+{
+ return returnItemOfCopyListToCopyEngine;
+}
+
+void ListThread::realByteTransfered()
+{
+ quint64 totalRealByteTransfered=0;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ const TransferThreadAsync * thread=transferThreadList.at(index);
+ totalRealByteTransfered+=thread->realByteTransfered();
+ index++;
+ }
+ emit send_realBytesTransfered(totalRealByteTransfered);
+}
+
+void ListThread::checkIfReadyToCancel()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(!stopIt)
+ return;
+ int index=0;
+ int loop_size=transferThreadList.size();
+ while(index<loop_size)
+ {
+ if(transferThreadList.at(index)!=NULL)
+ {
+ if(transferThreadList.at(index)->transferId!=0)
+ return;
+ //need wait a clean stop (and then destination remove)
+ if(transferThreadList.at(index)->getStat()!=TransferStat_Idle)
+ return;
+ delete transferThreadList.at(index);//->deleteLayer();
+ transferThreadList[index]=NULL;
+ transferThreadList.erase(transferThreadList.cbegin()+index);
+ loop_size=transferThreadList.size();
+ index--;
+ }
+ index++;
+ }
+ actionToDoListTransfer.clear();
+ actionToDoListInode.clear();
+ actionToDoListInode_afterTheTransfer.clear();
+ actionDone.clear();
+ progressionList.clear();
+ returnListItemOfCopyListToCopyEngine.clear();
+ quit();
+ waitCancel.release();
+ emit canBeDeleted();
+}
+
+void ListThread::updateTheStatus()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ sendActionDone();
+ bool updateTheStatus_listing=scanFileOrFolderThreadsPool.size()>0;
+ bool updateTheStatus_copying=actionToDoListTransfer.size()>0 || actionToDoListInode.size()>0 || actionToDoListInode_afterTheTransfer.size()>0;
+ Ultracopier::EngineActionInProgress updateTheStatus_action_in_progress;
+ if(updateTheStatus_copying && updateTheStatus_listing)
+ updateTheStatus_action_in_progress=Ultracopier::CopyingAndListing;
+ else if(updateTheStatus_listing)
+ updateTheStatus_action_in_progress=Ultracopier::Listing;
+ else if(updateTheStatus_copying)
+ updateTheStatus_action_in_progress=Ultracopier::Copying;
+ else
+ updateTheStatus_action_in_progress=Ultracopier::Idle;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit actionInProgess("+std::to_string(updateTheStatus_action_in_progress)+")");
+ emit actionInProgess(updateTheStatus_action_in_progress);
+}
+
+//mk path to do
+uint64_t ListThread::addToMkPath(const INTERNALTYPEPATH& source,const INTERNALTYPEPATH& destination, const int& inode)
+{
+ if(stopIt)
+ return 0;
+ if(inode!=0 && (!keepDate && !doRightTransfer))
+ return 0;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(source)+
+ ", destination: "+TransferThread::internalStringTostring(destination));
+ ActionToDoInode temp;
+ temp.type = ActionType_MkPath;
+ temp.id = generateIdNumber();
+ temp.source = source;
+ temp.destination= destination;
+ temp.isRunning = false;
+ actionToDoListInode.push_back(temp);
+ return temp.id;
+}
+
+//add path to do
+void ListThread::addToMovePath(const INTERNALTYPEPATH &source, const INTERNALTYPEPATH &destination, const int& inodeToRemove)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(source)+
+ ", destination: "+TransferThread::internalStringTostring(destination)+", inodeToRemove: "+std::to_string(inodeToRemove));
+ ActionToDoInode temp;
+ temp.type = ActionType_MovePath;
+ temp.id = generateIdNumber();
+ temp.size = inodeToRemove;
+ temp.source = source;
+ temp.destination= destination;
+ temp.isRunning = false;
+ actionToDoListInode.push_back(temp);
+}
+
+void ListThread::addToKeepAttributePath(const INTERNALTYPEPATH &source, const INTERNALTYPEPATH &destination, const int& inodeToRemove)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(source)+
+ ", destination: "+TransferThread::internalStringTostring(destination)+", inodeToRemove: "+std::to_string(inodeToRemove));
+ ActionToDoInode temp;
+ temp.type = ActionType_SyncDate;
+ temp.id = generateIdNumber();
+ temp.size = inodeToRemove;
+ temp.source = source;
+ temp.destination= destination;
+ temp.isRunning = false;
+ actionToDoListInode.push_back(temp);
+}
+
+void ListThread::addToRealMove(const INTERNALTYPEPATH& source,const INTERNALTYPEPATH& destination)
+{
+ if(stopIt)
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(source)+
+ ", destination: "+TransferThread::internalStringTostring(destination));
+ ActionToDoInode temp;
+ temp.type = ActionType_RealMove;
+ temp.id = generateIdNumber();
+ temp.size = 0;
+ temp.source = source;
+ temp.destination= destination;
+ temp.isRunning = false;
+ actionToDoListInode.push_back(temp);
+}
+
+#ifdef ULTRACOPIER_PLUGIN_RSYNC
+//rsync rm
+void ListThread::addToRmForRsync(const std::string& destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"inode: "+destination);
+ ActionToDoInode temp;
+ temp.type = ActionType_RmSync;
+ temp.id = generateIdNumber();
+ temp.destination= destination;
+ temp.isRunning = false;
+ actionToDoListInode.push_back(temp);
+}
+#endif
+
+//send the progression, after full reset of the interface (then all is empty)
+void ListThread::syncTransferList_internal()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit syncReady();
+ actionDone.clear();
+ //do list operation
+ TransferThreadAsync *transferThread;
+ const int &loop_size=actionToDoListTransfer.size();
+ int loop_sub_size=transferThreadList.size();
+ //this loop to have at max inodeThreads*inodeThreads, not inodeThreads*transferThreadList.size()
+ int int_for_internal_loop;
+ for(int int_for_loop=0; int_for_loop<loop_size; ++int_for_loop) {
+ const ActionToDoTransfer &item=actionToDoListTransfer.at(int_for_loop);
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type = Ultracopier::PreOperation;
+ newAction.addAction.id = item.id;
+ const size_t sourceIndex=item.source.rfind('/');
+ if(sourceIndex == std::string::npos)
+ {
+ newAction.addAction.sourceFullPath = '/';
+ newAction.addAction.sourceFileName = TransferThread::internalStringTostring(item.source);
+ }
+ else
+ {
+ newAction.addAction.sourceFullPath = TransferThread::internalStringTostring(item.source);
+ newAction.addAction.sourceFileName = TransferThread::internalStringTostring(item.source.substr(sourceIndex+1));
+ }
+ const size_t destinationIndex=item.destination.rfind('/');
+ if(destinationIndex == std::string::npos)
+ {
+ newAction.addAction.destinationFullPath = '/';
+ newAction.addAction.destinationFileName = TransferThread::internalStringTostring(item.destination);
+ }
+ else
+ {
+ newAction.addAction.destinationFullPath = TransferThread::internalStringTostring(item.destination);
+ newAction.addAction.destinationFileName = TransferThread::internalStringTostring(item.destination.substr(destinationIndex+1));
+ }
+ newAction.addAction.size = item.size;
+ newAction.addAction.mode = item.mode;
+ actionDone.push_back(newAction);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"id: "+std::to_string(item.id)+", size: "+std::to_string(item.size)+
+ ", name: "+TransferThread::internalStringTostring(item.source)+", size2: "+std::to_string(newAction.addAction.size));
+ 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);
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type = Ultracopier::PreOperation;
+ newAction.addAction.id = item.id;
+ const size_t sourceIndex=item.source.rfind('/');
+ if(sourceIndex == std::string::npos)
+ {
+ newAction.addAction.sourceFullPath = TransferThread::internalStringTostring(item.source);
+ newAction.addAction.sourceFileName = TransferThread::internalStringTostring(item.source);
+ }
+ else
+ {
+ newAction.addAction.sourceFullPath = TransferThread::internalStringTostring(item.source);
+ newAction.addAction.sourceFileName = TransferThread::internalStringTostring(item.source.substr(sourceIndex+1));
+ }
+ const size_t destinationIndex=item.destination.rfind('/');
+ if(destinationIndex == std::string::npos)
+ {
+ newAction.addAction.destinationFullPath = TransferThread::internalStringTostring(item.destination);
+ newAction.addAction.destinationFileName = TransferThread::internalStringTostring(item.destination);
+ }
+ else
+ {
+ newAction.addAction.destinationFullPath = TransferThread::internalStringTostring(item.destination);
+ newAction.addAction.destinationFileName = TransferThread::internalStringTostring(item.destination.substr(destinationIndex+1));
+ }
+ newAction.addAction.size = item.size;
+ newAction.addAction.mode = item.mode;
+ actionDone.push_back(newAction);
+ if(transferThread->getStat()!=TransferStat_PreOperation)
+ {
+ Ultracopier::ReturnActionOnCopyList newAction;
+ switch(transferThread->getStat())
+ {
+ case TransferStat_Transfer:
+ newAction.type=Ultracopier::Transfer;
+ break;
+ /*case TransferStat_PostTransfer:
+ newAction.type=Ultracopier::PostOperation;
+ break;*/
+ case TransferStat_PostOperation:
+ newAction.type=Ultracopier::PostOperation;
+ break;
+ default:
+ break;
+ }
+ newAction.addAction.id = item.id;
+ actionDone.push_back(newAction);
+ }
+ }
+ }
+ }
+}
+
+//add file transfer to do
+uint64_t ListThread::addToTransfer(const INTERNALTYPEPATH &source, const INTERNALTYPEPATH &destination, const Ultracopier::CopyMode& mode, const int64_t sendedsize)
+{
+ if(stopIt)
+ return 0;
+ //add to transfer list
+ numberOfTransferIntoToDoList++;
+ uint64_t size=0;
+ if(sendedsize>=0)
+ size=sendedsize;
+ else
+ {
+ const int64_t tempSize=TransferThread::file_stat_size(source);
+ if(tempSize>=0)
+ size=tempSize;
+ }
+ const std::string &drive=driveManagement.getDrive(TransferThread::internalStringTostring(destination));
+ if(!drive.empty())//can be a network drive
+ if(mode!=Ultracopier::Move || drive!=driveManagement.getDrive(TransferThread::internalStringTostring(source)))
+ {
+ if(requiredSpace.find(drive)!=requiredSpace.cend())
+ {
+ requiredSpace[drive]+=size;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("space needed add: %1, space needed: %2, on: %3").arg(size).arg(requiredSpace.at(drive)).arg(QString::fromStdString(drive)).toStdString());
+ }
+ else
+ {
+ requiredSpace[drive]=size;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("set space %1 needed, on: %2").arg(size).arg(QString::fromStdString(drive)).toStdString());
+ }
+ }
+ bytesToTransfer+= size;
+ ActionToDoTransfer temp;
+ temp.id = generateIdNumber();
+ temp.size = size;
+ temp.source = source;
+ temp.destination= destination;
+ temp.mode = mode;
+ temp.isRunning = false;
+ actionToDoListTransfer.push_back(temp);
+ //push the new transfer to interface
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type = Ultracopier::AddingItem;
+ newAction.addAction=actionToDoTransferToItemOfCopyList(temp);
+ actionDone.push_back(newAction);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(source)+
+ ", destination: "+TransferThread::internalStringTostring(destination)+", add entry: "+std::to_string(temp.id)+", size: "+
+ std::to_string(temp.size)+", size2: "+std::to_string(size)+", isSymLink: "+std::to_string(TransferThread::is_symlink(source)));
+ return temp.id;
+}
+
+Ultracopier::ItemOfCopyList ListThread::actionToDoTransferToItemOfCopyList(const ListThread::ActionToDoTransfer &actionToDoTransfer)
+{
+ Ultracopier::ItemOfCopyList itemOfCopyList;
+ itemOfCopyList.id = actionToDoTransfer.id;
+ const size_t sourceIndex=actionToDoTransfer.source.rfind('/');
+ if(sourceIndex == std::string::npos)
+ {
+ itemOfCopyList.sourceFullPath = TransferThread::internalStringTostring(actionToDoTransfer.source);
+ itemOfCopyList.sourceFileName = TransferThread::internalStringTostring(actionToDoTransfer.source);
+ }
+ else
+ {
+ itemOfCopyList.sourceFullPath = TransferThread::internalStringTostring(actionToDoTransfer.source);
+ itemOfCopyList.sourceFileName = TransferThread::internalStringTostring(actionToDoTransfer.source.substr(sourceIndex+1));
+ }
+ const size_t destinationIndex=actionToDoTransfer.destination.rfind('/');
+ if(destinationIndex == std::string::npos)
+ {
+ itemOfCopyList.destinationFullPath = TransferThread::internalStringTostring(actionToDoTransfer.destination);
+ itemOfCopyList.destinationFileName = TransferThread::internalStringTostring(actionToDoTransfer.destination);
+ }
+ else
+ {
+ itemOfCopyList.destinationFullPath = TransferThread::internalStringTostring(actionToDoTransfer.destination);
+ itemOfCopyList.destinationFileName = TransferThread::internalStringTostring(actionToDoTransfer.destination.substr(destinationIndex+1));
+ }
+ itemOfCopyList.size = actionToDoTransfer.size;
+ itemOfCopyList.mode = actionToDoTransfer.mode;
+ return itemOfCopyList;
+}
+
+//generate id number
+uint64_t ListThread::generateIdNumber()
+{
+ idIncrementNumber++;
+ if(idIncrementNumber>(((quint64)1024*1024)*1024*1024*2))
+ idIncrementNumber=0;
+ return idIncrementNumber;
+}
+
+//do new actions
+void ListThread::doNewActions_start_transfer()
+{
+ /*ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, numberOfTranferRuning: %2")
+ .arg(actionToDoListTransfer.size()).arg(getNumberOfTranferRuning()).toStdString());*/
+ if(stopIt || putInPause)
+ return;
+ int numberOfTranferRuning=getNumberOfTranferRuning();
+ const int &loop_size=transferThreadList.size();
+ //lunch the transfer in WaitForTheTransfer
+ //high priority
+ int int_for_loop=0;
+ while(int_for_loop<loop_size)
+ {
+ TransferThreadAsync *transferThread=transferThreadList.at(int_for_loop);
+ if(transferThread->getStat()==TransferStat_WaitForTheTransfer/*ready to start the transfer*/ && transferThread->transferId!=0)
+ {
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(numberOfTranferRuning));
+ if(transferThread->transferSize>=parallelizeIfSmallerThan)
+ {
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(numberOfTranferRuning));
+ if(numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(numberOfTranferRuning));
+ transferThread->startTheTransfer();
+ numberOfTranferRuning++;
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(numberOfTranferRuning)+
+ ", start in parallele beacuase size is "+std::to_string(transferThread->transferSize));
+ transferThread->startTheTransfer();
+ numberOfTranferRuning++;
+ }
+ }
+ int_for_loop++;
+ }
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(numberOfTranferRuning));
+
+ //low priority
+ int_for_loop=0;
+ while(int_for_loop<loop_size)
+ {
+ TransferThreadAsync *transferThread=transferThreadList.at(int_for_loop);
+ if(transferThread->getStat()==TransferStat_PreOperation/*wait user dialog action*/)
+ {
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(numberOfTranferRuning));
+ if(transferThread->transferSize>=parallelizeIfSmallerThan)
+ {
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(numberOfTranferRuning));
+ if(numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(numberOfTranferRuning));
+ transferThread->startTheTransfer();
+ numberOfTranferRuning++;
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(numberOfTranferRuning));
+ transferThread->startTheTransfer();
+ numberOfTranferRuning++;
+ }
+ }
+ int_for_loop++;
+ }
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(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()
+{
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionToDoList.size(): "+std::to_string(actionToDoListTransfer.size()));
+ #endif
+ if(stopIt)
+ checkIfReadyToCancel();
+ if(stopIt || putInPause)
+ return;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ #endif
+ //lunch the pre-op or inode op
+ TransferThreadAsync *currentTransferThread;
+ int int_for_loop=0;
+ int int_for_internal_loop=0;
+ int int_for_transfer_thread_search=0;
+ actionToDoListTransfer_count=actionToDoListTransfer.size();
+ actionToDoListInode_count=actionToDoListInode.size();
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ //search the next transfer action to do
+ while(int_for_loop<actionToDoListTransfer_count)
+ {
+ ActionToDoTransfer& currentActionToDoTransfer=actionToDoListTransfer[int_for_loop];
+ if(!currentActionToDoTransfer.isRunning)
+ {
+ //search the next inode action to do
+ while(int_for_internal_loop<actionToDoListInode_count)
+ {
+ if(!actionToDoListInode.at(int_for_internal_loop).isRunning)
+ {
+ if(currentActionToDoTransfer.id<actionToDoListInode.at(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++;
+ }
+ //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.at(int_for_transfer_thread_search);
+ if(currentTransferThread->getStat()==TransferStat_Idle && currentTransferThread->transferId==0 &&
+ overCheckUsedThread.find(currentTransferThread)==overCheckUsedThread.cend()) // /!\ important!
+ {
+ overCheckUsedThread.insert(currentTransferThread);
+
+ std::string drive=driveManagement.getDrive(TransferThread::internalStringTostring(currentActionToDoTransfer.destination));
+ if(requiredSpace.find(drive)!=requiredSpace.cend() &&
+ (currentActionToDoTransfer.mode!=Ultracopier::Move ||
+ drive!=driveManagement.getDrive(TransferThread::internalStringTostring(currentActionToDoTransfer.source))))
+ {
+ requiredSpace[drive]-=currentActionToDoTransfer.size;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("space needed removed: %1, space needed: %2, on: %3").arg(
+ currentActionToDoTransfer.size).arg(requiredSpace.at(drive)).arg(QString::fromStdString(drive)).toStdString());
+ }
+ currentTransferThread->transferId=currentActionToDoTransfer.id;
+ currentTransferThread->transferSize=currentActionToDoTransfer.size;
+ putAtBottomAfterError.erase(currentTransferThread);
+ if(!currentTransferThread->setFiles(
+ currentActionToDoTransfer.source,
+ currentActionToDoTransfer.size,
+ currentActionToDoTransfer.destination,
+ currentActionToDoTransfer.mode
+ ))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(int_for_loop)+"] id: "+
+ std::to_string(currentTransferThread->transferId)+
+ " is idle, but seam busy at set name: "+TransferThread::internalStringTostring(currentActionToDoTransfer.destination)
+ );
+ break;
+ }
+ currentActionToDoTransfer.isRunning=true;
+
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(int_for_loop)+"] id: "+
+ std::to_string(currentTransferThread->transferId)+
+ " is idle, use it for "+TransferThread::internalStringTostring(currentActionToDoTransfer.destination)
+ );
+
+ /// \note wrong position? Else write why it's here
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type = Ultracopier::PreOperation;
+ newAction.addAction.id = currentActionToDoTransfer.id;
+ const size_t sourceIndex=currentActionToDoTransfer.source.rfind('/');
+ if(sourceIndex == std::string::npos)
+ {
+ newAction.addAction.sourceFullPath = '/';
+ newAction.addAction.sourceFileName = TransferThread::internalStringTostring(currentActionToDoTransfer.source);
+ }
+ else
+ {
+ newAction.addAction.sourceFullPath = TransferThread::internalStringTostring(currentActionToDoTransfer.source);
+ newAction.addAction.sourceFileName = TransferThread::internalStringTostring(currentActionToDoTransfer.source.substr(sourceIndex+1));
+ }
+ const size_t destinationIndex=currentActionToDoTransfer.destination.rfind('/');
+ if(destinationIndex == std::string::npos)
+ {
+ newAction.addAction.destinationFullPath = '/';
+ newAction.addAction.destinationFileName = TransferThread::internalStringTostring(currentActionToDoTransfer.destination);
+ }
+ else
+ {
+ newAction.addAction.destinationFullPath = TransferThread::internalStringTostring(currentActionToDoTransfer.destination);
+ newAction.addAction.destinationFileName = TransferThread::internalStringTostring(currentActionToDoTransfer.destination.substr(destinationIndex+1));
+ }
+ newAction.addAction.size = currentActionToDoTransfer.size;
+ newAction.addAction.mode = currentActionToDoTransfer.mode;
+ actionDone.push_back(newAction);
+ int_for_transfer_thread_search++;
+ numberOfInodeOperation++;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
+ #endif
+ 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
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"unable to found free thread to do the transfer");
+ #endif
+ break;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
+ #endif
+ if(numberOfInodeOperation>=inodeThreads)
+ break;
+ if(followTheStrictOrder)
+ break;
+ }
+ int_for_loop++;
+ }
+ //search the next inode action to do
+ int_for_internal_loop=0;
+ while(int_for_internal_loop<actionToDoListInode_count)
+ {
+ if(!actionToDoListInode.at(int_for_internal_loop).isRunning)
+ {
+ //do the inode action
+ #include "ListThread_InodeAction.cpp"
+ }
+ int_for_internal_loop++;
+ }
+ //error checking
+ if(actionToDoListInode_count>inodeThreads)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("The index have been detected as out of max range: %1>%2").arg(actionToDoListInode_count).arg(inodeThreads).toStdString());
+ return;
+ }
+}
+
+//restart transfer if it can
+void ListThread::restartTransferIfItCan()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ TransferThreadAsync *transfer=qobject_cast<TransferThreadAsync *>(QObject::sender());
+ if(transfer==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not located!");
+ return;
+ }
+ int numberOfTranferRuning=getNumberOfTranferRuning();
+ if(numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER && transfer->getStat()==TransferStat_WaitForTheTransfer)
+ transfer->startTheTransfer();
+ doNewActions_start_transfer();
+}
+
+
+void ListThread::set_setFilters(const std::vector<Filters_rules> &include,const std::vector<Filters_rules> &exclude)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("include.size(): %1, exclude.size(): %2").arg(include.size()).arg(exclude.size()).toStdString());
+ this->include=include;
+ this->exclude=exclude;
+ unsigned int index=0;
+ while(index<scanFileOrFolderThreadsPool.size())
+ {
+ scanFileOrFolderThreadsPool.at(index)->setFilters(include,exclude);
+ index++;
+ }
+}
+
+void ListThread::set_sendNewRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule)
+{
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+ emit send_sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
+}
+
+void ListThread::set_updateMount()
+{
+ driveManagement.tryUpdate();
+ emit send_updateMount();
+}
+
+void ListThread::mkPathFirstFolderFinish()
+{
+ int int_for_loop=0;
+ const int &loop_size=actionToDoListInode.size();
+ while(int_for_loop<loop_size)
+ {
+ const ActionToDoInode &actionToDoInode=actionToDoListInode.at(int_for_loop);
+ if(actionToDoInode.isRunning)
+ {
+ if(actionToDoInode.type==ActionType_MkPath || actionToDoInode.type==ActionType_SyncDate)
+ {
+ //to send to the log
+ emit mkPath(TransferThread::internalStringTostring(actionToDoInode.destination));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop mkpath: "+TransferThread::internalStringTostring(actionToDoInode.destination));
+ actionToDoListInode.erase(actionToDoListInode.cbegin()+int_for_loop);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
+ if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
+ updateTheStatus();
+ numberOfInodeOperation--;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
+ #endif
+ doNewActions_inode_manipulation();
+ return;
+ }
+ if(actionToDoInode.type==ActionType_MovePath || actionToDoInode.type==ActionType_RealMove
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ || actionToDoInode.type==ActionType_RmSync
+ #endif
+ )
+ {
+ //to send to the log
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(actionToDoInode.type!=ActionType_RmSync)
+ emit mkPath(actionToDoInode.destination);
+ #else
+ emit mkPath(TransferThread::internalStringTostring(actionToDoInode.destination));
+ #endif
+ emit rmPath(TransferThread::internalStringTostring(actionToDoInode.source));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop mkpath: "+TransferThread::internalStringTostring(actionToDoInode.destination));
+ actionToDoListInode.erase(actionToDoListInode.cbegin()+int_for_loop);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
+ if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
+ updateTheStatus();
+ numberOfInodeOperation--;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
+ #endif
+ doNewActions_inode_manipulation();
+ return;
+ }
+
+ }
+ int_for_loop++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to found item into the todo list");
+}
+
+/// \note Can be call without queue because all call will be serialized
+void ListThread::fileAlreadyExists(const INTERNALTYPEPATH &source,const INTERNALTYPEPATH &destination,const bool &isSame)
+{
+ emit send_fileAlreadyExists(source,destination,isSame,qobject_cast<TransferThreadAsync *>(sender()));
+}
+
+/// \note Can be call without queue because all call will be serialized
+void ListThread::errorOnFile(const INTERNALTYPEPATH &fileInfo, const std::string &errorString, const ErrorType &errorType)
+{
+ TransferThreadAsync * transferThread=qobject_cast<TransferThreadAsync *>(sender());
+ if(transferThread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Thread locating error");
+ return;
+ }
+ ErrorLogEntry errorLogEntry;
+ errorLogEntry.source=TransferThread::internalStringTostring(transferThread->getSourcePath());
+ errorLogEntry.destination=TransferThread::internalStringTostring(transferThread->getDestinationPath());
+ errorLogEntry.mode=transferThread->getMode();
+ errorLogEntry.error=errorString;
+ errorLog.push_back(errorLogEntry);
+ emit errorToRetry(TransferThread::internalStringTostring(transferThread->getSourcePath()),
+ TransferThread::internalStringTostring(transferThread->getDestinationPath()),
+ errorString);
+ emit send_errorOnFile(fileInfo,errorString,transferThread,errorType);
+}
+
+/// \note Can be call without queue because all call will be serialized
+void ListThread::folderAlreadyExists(const INTERNALTYPEPATH &source,const INTERNALTYPEPATH &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 INTERNALTYPEPATH &fileInfo,const std::string &errorString,const ErrorType &errorType)
+{
+ emit send_errorOnFolder(fileInfo,errorString,qobject_cast<ScanFileOrFolder *>(sender()),errorType);
+}
+
+//to run the thread
+void ListThread::run()
+{
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ clockForTheCopySpeed=new QTimer();
+ #endif
+ exec();
+}
+
+void ListThread::getNeedPutAtBottom(const INTERNALTYPEPATH &fileInfo, const std::string &errorString, TransferThreadAsync *thread,
+ const ErrorType &errorType)
+{
+ (void)fileInfo;
+ (void)errorString;
+ (void)errorType;
+ thread->putAtBottom();
+}
+
+/// \to create transfer thread
+void ListThread::createTransferThread()
+{
+ if(stopIt)
+ return;
+ if(transferThreadList.size()>=(unsigned int)inodeThreads)
+ return;
+ transferThreadList.push_back(new TransferThreadAsync());
+ TransferThreadAsync * last=transferThreadList.back();
+ last->transferId=0;
+ last->transferSize=0;
+ last->setRightTransfer(doRightTransfer);
+ last->setKeepDate(keepDate);
+ last->setOsSpecFlags(os_spec_flags);
+ last->setNativeCopy(native_copy);
+ last->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ if(!last->setBlockSize(blockSizeAfterSpeedLimitation))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the block size: "+std::to_string(blockSizeAfterSpeedLimitation));
+ #endif
+ last->setDeletePartiallyTransferredFiles(deletePartiallyTransferredFiles);
+ last->setBuffer(buffer);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ last->setRsync(rsync);
+ #endif
+
+ last->writeThread.writeFileList=new QMultiHash<QString,WriteThread *>();
+ last->writeThread.writeFileListMutex=new QMutex();
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(!connect(last,&TransferThread::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection))
+ abort();
+ #endif // ULTRACOPIER_PLUGIN_DEBUG
+ if(!connect(last,&TransferThread::errorOnFile, this,&ListThread::errorOnFile, Qt::QueuedConnection))
+ abort();
+ if(!connect(last,&TransferThread::fileAlreadyExists, this,&ListThread::fileAlreadyExists, Qt::QueuedConnection))
+ abort();
+ if(!connect(last,&TransferThread::tryPutAtBottom, this,&ListThread::transferPutAtBottom, Qt::QueuedConnection))
+ abort();
+ if(!connect(last,&TransferThread::readStopped, this,&ListThread::doNewActions_start_transfer, Qt::QueuedConnection))
+ abort();
+ if(!connect(last,&TransferThread::preOperationStopped, this,&ListThread::doNewActions_start_transfer, Qt::QueuedConnection))
+ abort();
+ if(!connect(last,&TransferThread::postOperationStopped, this,&ListThread::transferInodeIsClosed, Qt::QueuedConnection))
+ abort();
+ if(!connect(last,&TransferThread::checkIfItCanBeResumed, this,&ListThread::restartTransferIfItCan, Qt::QueuedConnection))
+ abort();
+ if(!connect(last,&TransferThread::pushStat, this,&ListThread::newTransferStat, Qt::QueuedConnection))
+ abort();
+
+ if(!connect(this,&ListThread::send_sendNewRenamingRules, last,&TransferThread::setRenamingRules, Qt::QueuedConnection))
+ abort();
+
+ if(!connect(this,&ListThread::send_updateMount, last,&TransferThread::set_updateMount, Qt::QueuedConnection))
+ abort();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ last->setMultiForBigSpeed(multiForBigSpeed);
+ //speed limitation
+ connect(clockForTheCopySpeed, &QTimer::timeout, last, &TransferThreadAsync::timeOfTheBlockCopyFinished, Qt::QueuedConnection);
+ #endif
+
+ last->setObjectName(QStringLiteral("transfer %1").arg(transferThreadList.size()-1));
+ last->readThread.setObjectName(QStringLiteral("read %1").arg(transferThreadList.size()-1));
+ last->writeThread.setObjectName(QStringLiteral("write %1").arg(transferThreadList.size()-1));
+ last->setRenamingRules(firstRenamingRule,otherRenamingRule);
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ last->setId(transferThreadList.size()-1);
+ #endif
+ if(transferThreadList.size()>=(unsigned int)inodeThreads)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"create the last of the "+std::to_string(inodeThreads)+" transferThread");
+ return;
+ }
+ if(stopIt)
+ return;
+ doNewActions_inode_manipulation();
+ emit askNewTransferThread();
+}
+
+void ListThread::deleteTransferThread()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ int loop_size=transferThreadList.size();
+ if(loop_size>inodeThreads)
+ {
+ int index=0;
+ while(index<loop_size && loop_size>inodeThreads)
+ {
+ if(transferThreadList.at(index)->getStat()==TransferStat_Idle && transferThreadList.at(index)->transferId==0)
+ {
+ transferThreadList.at(index)->stop();
+ delete transferThreadList.at(index);//->deleteLayer();
+ transferThreadList[index]=NULL;
+ transferThreadList.erase(transferThreadList.cbegin()+index);
+ loop_size--;
+ }
+ else
+ index++;
+ }
+ if(loop_size==inodeThreads)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"inodeThreads is lowered to the right value: "+std::to_string(inodeThreads));
+ }
+}
+
+void ListThread::setMkFullPath(const bool mkFullPath)
+{
+ this->mkFullPath=mkFullPath;
+ mkPathQueue.setMkFullPath(mkFullPath);
+ unsigned int index=0;
+ while(index<transferThreadList.size())
+ {
+ transferThreadList.at(index)->setMkFullPath(mkFullPath);
+ index++;
+ }
+}
diff --git a/plugins/CopyEngine/Ultracopier/ListThread.h b/plugins/CopyEngine/Ultracopier-Spec/ListThread.h
index 48e7142..361f65c 100644..100755
--- a/plugins/CopyEngine/Ultracopier/ListThread.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/ListThread.h
@@ -10,8 +10,9 @@
#include <QObject>
#include <string>
#include <vector>
+#include <unordered_set>
#include <unordered_map>
-#include <QFileInfo>
+#include <string>
#include <QSemaphore>
#include <QTextStream>
#include <QFile>
@@ -19,10 +20,10 @@
#include "../../../interface/PluginInterface_CopyEngine.h"
#include "ScanFileOrFolder.h"
-#include "TransferThread.h"
#include "MkPath.h"
#include "Environment.h"
#include "DriveManagement.h"
+#include "async/TransferThreadAsync.h"
/// \brief Define the list thread, and management to the action to do
class ListThread : public QThread
@@ -66,11 +67,16 @@ public:
{
uint64_t id;
uint64_t 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;
+ #ifdef WIDESTRING
+ std::wstring source;///< Used to set: source for transfer, folder to create, folder to drop
+ std::wstring destination;
+ #else
+ std::string source;///< Used to set: source for transfer, folder to create, folder to drop
+ std::string destination;
+ #endif
Ultracopier::CopyMode mode;
bool isRunning;///< store if the action si running
- //TransferThread * transfer; // -> see transferThreadList
+ //TTHREAD * transfer; // -> see transferThreadList
};
std::vector<ActionToDoTransfer> actionToDoListTransfer;
/// \brief to store one action to do
@@ -79,8 +85,13 @@ public:
ActionType type;///< \see ActionType
uint64_t id;
int64_t size;///< Used to set: used in case of transfer or remainingInode for drop folder
- QFileInfo source;///< Keep to copy the right/date, to remove (for move)
- QFileInfo destination;///< Used to set: folder to create, folder to drop
+ #ifdef WIDESTRING
+ std::wstring source;///< Keep to copy the right/date, to remove (for move)
+ std::wstring destination;///< Used to set: folder to create, folder to drop
+ #else
+ std::string source;///< Keep to copy the right/date, to remove (for move)
+ std::string destination;///< Used to set: folder to create, folder to drop
+ #endif
bool isRunning;///< store if the action si running
};
std::vector<ActionToDoInode> actionToDoListInode;
@@ -88,8 +99,8 @@ public:
int numberOfInodeOperation;
struct ErrorLogEntry
{
- QFileInfo source;
- QFileInfo destination;
+ std::string source;
+ std::string destination;
std::string error;
Ultracopier::CopyMode mode;
};
@@ -100,13 +111,12 @@ public:
bool getReturnBoolToCopyEngine() const;
std::pair<quint64,quint64> getReturnPairQuint64ToCopyEngine() const;
Ultracopier::ItemOfCopyList getReturnItemOfCopyListToCopyEngine() const;
+ void setMkFullPath(const bool mkFullPath);
+ std::unordered_set<void *> overCheckUsedThread;
- void set_doChecksum(bool doChecksum);
- void set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible);
- void set_checksumOnlyOnError(bool checksumOnlyOnError);
- void set_osBuffer(bool osBuffer);
- void set_osBufferLimited(bool osBufferLimited);
void autoStartIfNeeded();
+ /// \brief set auto start
+ void setAutoStart(const bool autoStart);
public slots:
//action on the copy
/// \brief put the transfer in pause
@@ -154,10 +164,8 @@ public slots:
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);
+ void setOsSpecFlags(bool os_spec_flags);
+ void setNativeCopy(bool native_copy);
#ifdef ULTRACOPIER_PLUGIN_RSYNC
/// \brief set rsync
void setRsync(const bool rsync);
@@ -177,12 +185,11 @@ public slots:
void doNewActions_inode_manipulation();
/// \brief restart transfer if it can
void restartTransferIfItCan();
- void getNeedPutAtBottom(const QFileInfo &fileInfo, const std::string &errorString, TransferThread *thread,const ErrorType &errorType);
+ void getNeedPutAtBottom(const INTERNALTYPEPATH &fileInfo, const std::string &errorString, TransferThreadAsync *thread, const ErrorType &errorType);
/// \brief update the transfer stat
void newTransferStat(const TransferStat &stat,const quint64 &id);
- void set_osBufferLimit(const unsigned int &osBufferLimit);
void set_setFilters(const std::vector<Filters_rules> &include,const std::vector<Filters_rules> &exclude);
void set_sendNewRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule);
void set_updateMount();
@@ -192,24 +199,24 @@ public slots:
//send progression
void sendProgression();
- void setTransferAlgorithm(const TransferAlgorithm &transferAlgorithm);
- void setParallelBuffer(int parallelBuffer);
- void setSequentialBuffer(int sequentialBuffer);
- void setParallelizeIfSmallerThan(const unsigned int &parallelizeIfSmallerThan);
void setMoveTheWholeFolder(const bool &moveTheWholeFolder);
void setFollowTheStrictOrder(const bool &followTheStrictOrder);
void setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles);
void setInodeThreads(const int &inodeThreads);
void setRenameTheOriginalDestination(const bool &renameTheOriginalDestination);
void setCheckDiskSpace(const bool &checkDiskSpace);
- void setCopyListOrder(const bool &order);
+ void setBuffer(const bool &buffer);
void exportErrorIntoTransferList(const std::string &fileName);
private:
+ //can't be static into WriteThread, linked by instance then by ListThread
+ QMultiHash<QString,WriteThread *> *writeFileList;
+ QMutex *writeFileListMutex;
+
QSemaphore mkpathTransfer;
std::string sourceDrive;
bool sourceDriveMultiple;
std::string destinationDrive;
- std::string destinationFolder;
+ INTERNALTYPEPATH destinationFolder;
bool destinationDriveMultiple;
bool destinationFolderMultiple;
DriveManagement driveManagement;
@@ -217,7 +224,7 @@ private:
bool stopIt;
std::vector<ScanFileOrFolder *> scanFileOrFolderThreadsPool;
int numberOfTransferIntoToDoList;
- std::vector<TransferThread *> transferThreadList;
+ std::vector<TransferThreadAsync *> transferThreadList;
ScanFileOrFolder * newScanThread(Ultracopier::CopyMode mode);
uint64_t bytesToTransfer;
uint64_t bytesTransfered;
@@ -225,50 +232,35 @@ private:
#ifdef ULTRACOPIER_PLUGIN_RSYNC
bool rsync;
#endif
- bool putInPause;
std::vector<Ultracopier::ReturnActionOnCopyList> actionDone;///< to action to send to the interface
uint64_t idIncrementNumber;///< to store the last id returned
int64_t actualRealByteTransfered;
- int maxSpeed;///< in KB/s, assume as 0KB/s as default like every where
FolderExistsAction alwaysDoThisActionForFolderExists;
bool checkDestinationFolderExists;
- bool doChecksum;
- bool checksumIgnoreIfImpossible;
- bool checksumOnlyOnError;
- bool osBuffer;
- bool osBufferLimited;
unsigned int parallelizeIfSmallerThan;
bool moveTheWholeFolder;
- bool followTheStrictOrder;
bool deletePartiallyTransferredFiles;
- int sequentialBuffer;
- int parallelBuffer;
int inodeThreads;
bool renameTheOriginalDestination;
bool checkDiskSpace;
- bool copyListOrder;
+ bool buffer;
+ bool followTheStrictOrder;
+ std::unordered_set<TransferThreadAsync *> putAtBottomAfterError;
std::unordered_map<std::string,uint64_t> requiredSpace;
std::vector<std::pair<uint64_t,uint32_t> > timeToTransfer;
- unsigned int putAtBottom;
- unsigned int osBufferLimit;
+ //unsigned int putAtBottom;//why here? more correct into CopyEngine(), then translated to CopyEngine
std::vector<Filters_rules> include,exclude;
Ultracopier::CopyMode mode;
bool forcedMode;
std::string firstRenamingRule;
std::string otherRenamingRule;
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- int multiForBigSpeed;
- #endif
/* here to prevent:
QObject::killTimer: timers cannot be stopped from another thread
QObject::startTimer: timers cannot be started from another thread */
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- QTimer *clockForTheCopySpeed; ///< For the speed throttling
- #endif
- inline static Ultracopier::ItemOfCopyList actionToDoTransferToItemOfCopyList(const ActionToDoTransfer &actionToDoTransfer);
+ static Ultracopier::ItemOfCopyList actionToDoTransferToItemOfCopyList(const ActionToDoTransfer &actionToDoTransfer);
//add file transfer to do
- uint64_t addToTransfer(const QFileInfo& source,const QFileInfo& destination,const Ultracopier::CopyMode& mode);
+ uint64_t addToTransfer(const INTERNALTYPEPATH& source, const INTERNALTYPEPATH& destination, const Ultracopier::CopyMode& mode, const int64_t sendedsize=-1);
//generate id number
uint64_t generateIdNumber();
//warning the first entry is accessible will copy
@@ -287,7 +279,7 @@ private:
#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
QTimer timerUpdateDebugDialog;
#endif
- void detectDrivesOfCurrentTransfer(const std::vector<std::string> &sources,const std::string &destination);
+ void detectDrivesOfCurrentTransfer(const std::vector<INTERNALTYPEPATH> &sources, const INTERNALTYPEPATH &destination);
FacilityInterface * facilityInterface;
QSemaphore waitConstructor,waitCancel;
int actionToDoListTransfer_count,actionToDoListInode_count;
@@ -299,28 +291,40 @@ private:
//memory variable for transfer thread creation
bool doRightTransfer;
bool keepDate;
- int blockSize;//in Bytes
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- int blockSizeAfterSpeedLimitation;//in Bytes
- #endif
+ bool os_spec_flags;
+ bool native_copy;
+ bool mkFullPath;
std::vector<std::string> drives;
FileExistsAction alwaysDoThisActionForFileExists;
+ int speedLimitation;
//to return value to the copyEngine
bool returnBoolToCopyEngine;
std::pair<quint64,quint64> returnPairQuint64ToCopyEngine;
std::vector<Ultracopier::ItemOfCopyList> returnListItemOfCopyListToCopyEngine;
Ultracopier::ItemOfCopyList returnItemOfCopyListToCopyEngine;
- Ultracopier::ProgressionItem tempItem;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ QTimer *clockForTheCopySpeed;
+ int blockSizeAfterSpeedLimitation;//in Bytes
+ int multiForBigSpeed;
+ int blockSize;
+ #endif
+ bool putInPause;
void realByteTransfered();
int getNumberOfTranferRuning() const;
bool needMoreSpace() const;
private slots:
+ void exportTransferListInternal(const std::string &fileName);
+ void importTransferListInternal(const std::string &fileName);
+
void scanThreadHaveFinishSlot();
void scanThreadHaveFinish(bool skipFirstRemove=false);
void autoStartAndCheckSpace();
void updateTheStatus();
- void fileTransfer(const QFileInfo &sourceFileInfo,const QFileInfo &destinationFileInfo,const Ultracopier::CopyMode &mode);
+ void fileTransfer(const INTERNALTYPEPATH &sourceFileInfo, const INTERNALTYPEPATH &destinationFileInfo,
+ const Ultracopier::CopyMode &mode);
+ void fileTransferWithInode(const INTERNALTYPEPATH &sourceFileInfo, const INTERNALTYPEPATH &destinationFileInfo,
+ const Ultracopier::CopyMode &mode, const TransferThread::dirent_uc &inode);
//mkpath event
void mkPathFirstFolderFinish();
/** \brief put the current file at bottom in case of error
@@ -334,27 +338,28 @@ private slots:
#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);
+ void fileAlreadyExists(const INTERNALTYPEPATH &source,const INTERNALTYPEPATH &destination,const bool &isSame);
/// \note Can be call without queue because all call will be serialized
- void errorOnFile(const QFileInfo &fileInfo,const std::string &errorString, const ErrorType &errorType);
+ void errorOnFile(const INTERNALTYPEPATH &fileInfo,const std::string &errorString, const ErrorType &errorType);
/// \note Can be call without queue because all call will be serialized
- void folderAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame);
+ void folderAlreadyExists(const INTERNALTYPEPATH &source,const INTERNALTYPEPATH &destination,const bool &isSame);
/// \note Can be call without queue because all call will be serialized
- void errorOnFolder(const QFileInfo &fileInfo, const std::string &errorString, const ErrorType &errorType);
+ void errorOnFolder(const INTERNALTYPEPATH &fileInfo, const std::string &errorString, const ErrorType &errorType);
//to run the thread
void run();
/// \to create transfer thread
void createTransferThread();
void deleteTransferThread();
//mk path to do
- uint64_t addToMkPath(const QFileInfo& source, const QFileInfo& destination, const int &inode);
- //add rm path to do
- void addToMovePath(const QFileInfo& source,const QFileInfo& destination, const int& inodeToRemove);
+ uint64_t addToMkPath(const INTERNALTYPEPATH &source, const INTERNALTYPEPATH &destination, const int &inode);
+ //add path to do
+ void addToMovePath(const INTERNALTYPEPATH& source,const INTERNALTYPEPATH& destination, const int& inodeToRemove);
+ void addToKeepAttributePath(const INTERNALTYPEPATH& source,const INTERNALTYPEPATH& destination, const int& inodeToRemove);
//add to real move
- void addToRealMove(const QFileInfo& source,const QFileInfo& destination);
+ void addToRealMove(const INTERNALTYPEPATH& source,const INTERNALTYPEPATH& destination);
#ifdef ULTRACOPIER_PLUGIN_RSYNC
//rsync rm
- void addToRmForRsync(const QFileInfo& destination);
+ void addToRmForRsync(const std::string& destination);
#endif
//send the progression, after full reset of the interface (then all is empty)
void syncTransferList_internal();
@@ -378,11 +383,10 @@ signals:
void pushGeneralProgression(const uint64_t &,const uint64_t &) const;
void newFolderListing(const std::string &path) const;
- void isInPause(const bool &) const;
//when can be deleted
void canBeDeleted() const;
- void haveNeedPutAtBottom(bool needPutAtBottom,const QFileInfo &fileInfo,const std::string &errorString,TransferThread * thread,const ErrorType &errorType) const;
+ void haveNeedPutAtBottom(bool needPutAtBottom,const INTERNALTYPEPATH &fileInfo,const std::string &errorString,TransferThreadAsync * thread,const ErrorType &errorType) const;
//send error occurred
void error(const std::string &path,const uint64_t &size,const uint64_t &mtime,const std::string &error) const;
@@ -400,17 +404,17 @@ signals:
//other signal
/// \note Can be call without queue because all call will be serialized
- void send_fileAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame,TransferThread * thread) const;
+ void send_fileAlreadyExists(const INTERNALTYPEPATH &source,const INTERNALTYPEPATH &destination,const bool &isSame,TransferThreadAsync * thread) const;
/// \note Can be call without queue because all call will be serialized
- void send_errorOnFile(const QFileInfo &fileInfo,const std::string &errorString,TransferThread * thread, const ErrorType &errorType) const;
+ void send_errorOnFile(const INTERNALTYPEPATH &fileInfo,const std::string &errorString,TransferThreadAsync * thread, const ErrorType &errorType) const;
/// \note Can be call without queue because all call will be serialized
- void send_folderAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame,ScanFileOrFolder * thread) const;
+ void send_folderAlreadyExists(const INTERNALTYPEPATH &source,const INTERNALTYPEPATH &destination,const bool &isSame,ScanFileOrFolder * thread) const;
/// \note Can be call without queue because all call will be serialized
- void send_errorOnFolder(const QFileInfo &fileInfo,const std::string &errorString,ScanFileOrFolder * thread, const ErrorType &errorType) const;
+ void send_errorOnFolder(const INTERNALTYPEPATH &fileInfo,const std::string &errorString,ScanFileOrFolder * thread, const ErrorType &errorType) const;
//send the progression
void send_syncTransferList() const;
//mkpath error event
- void mkPathErrorOnFolder(const QFileInfo &fileInfo,const std::string &errorString,const ErrorType &errorType) const;
+ void mkPathErrorOnFolder(const INTERNALTYPEPATH &fileInfo,const std::string &errorString,const ErrorType &errorType) const;
//to close
void tryCancel() const;
//to ask new transfer thread
@@ -421,12 +425,13 @@ signals:
void send_sendNewRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule) const;
void send_realBytesTransfered(const uint64_t &) const;
- void send_setTransferAlgorithm(TransferAlgorithm transferAlgorithm) const;
- void send_parallelBuffer(const int &parallelBuffer) const;
- void send_sequentialBuffer(const int &sequentialBuffer) const;
void send_parallelizeIfSmallerThan(const int &parallelizeIfSmallerThan) const;
void send_updateMount();
void missingDiskSpace(std::vector<Diskspace> list) const;
+ void isInPause(const bool &) const;
+
+ void exportTransferListSend(const std::string &fileName);
+ void importTransferListSend(const std::string &fileName);
};
#endif // LISTTHREAD_H
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ListThreadActions.cpp b/plugins/CopyEngine/Ultracopier-Spec/ListThreadActions.cpp
new file mode 100755
index 0000000..85b3113
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/ListThreadActions.cpp
@@ -0,0 +1,129 @@
+#include "ListThread.h"
+#include <QStorageInfo>
+#include <QtGlobal>
+#include "../../../cpp11addition.h"
+
+#include "async/TransferThreadAsync.h"
+
+void ListThread::pause()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Seam already in pause!");
+ return;
+ }
+ putInPause=true;
+ int index=0;
+ int 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(Ultracopier::DebugLevel_Notice,"start");
+ if(!putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Seam already resumed!");
+ return;
+ }
+ putInPause=false;
+ startGeneralTransfer();
+ doNewActions_start_transfer();
+ int index=0;
+ int 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 uint64_t &id)
+{
+ skipInternal(id);
+}
+
+bool ListThread::skipInternal(const uint64_t &id)
+{
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ if(transferThreadList.at(index)->transferId==id)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"skip one transfer: "+std::to_string(id));
+ transferThreadList.at(index)->skip();
+ return true;
+ }
+ index++;
+ }
+ int int_for_internal_loop=0;
+ const int &loop_size=actionToDoListTransfer.size();
+ while(int_for_internal_loop<loop_size)
+ {
+ if(actionToDoListTransfer.at(int_for_internal_loop).id==id)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[%1] remove at not running, for id: %2").arg(int_for_internal_loop).arg(id).toStdString());
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::RemoveItem;
+ newAction.userAction.moveAt=1;
+ newAction.addAction=actionToDoTransferToItemOfCopyList(actionToDoListTransfer.at(int_for_internal_loop));
+ newAction.userAction.position=int_for_internal_loop;
+ actionDone.push_back(newAction);
+ actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+int_for_internal_loop);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
+ if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
+ updateTheStatus();
+ return true;
+ }
+ int_for_internal_loop++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"skip transfer not found: "+std::to_string(id));
+ return false;
+}
+
+//executed in this thread
+void ListThread::cancel()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ if(stopIt)
+ {
+ waitCancel.release();
+ return;
+ }
+ stopIt=true;
+ int index=0;
+ int loop_size=transferThreadList.size();
+ while(index<loop_size)
+ {
+ transferThreadList.at(index)->stop();
+ transferThreadList.at(index)->transferId=0;
+ index++;
+ }
+ index=0;
+ loop_size=scanFileOrFolderThreadsPool.size();
+ while(index<loop_size)
+ {
+ scanFileOrFolderThreadsPool.at(index)->stop();
+ delete scanFileOrFolderThreadsPool.at(index);//->deleteLayer();
+ scanFileOrFolderThreadsPool[index]=NULL;
+ index++;
+ }
+ scanFileOrFolderThreadsPool.clear();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ if(clockForTheCopySpeed!=NULL)
+ {
+ clockForTheCopySpeed->stop();
+ delete clockForTheCopySpeed;
+ clockForTheCopySpeed=NULL;
+ }
+ #endif
+ checkIfReadyToCancel();
+}
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ListThreadListChange.cpp b/plugins/CopyEngine/Ultracopier-Spec/ListThreadListChange.cpp
new file mode 100755
index 0000000..6927caa
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/ListThreadListChange.cpp
@@ -0,0 +1,423 @@
+#include "ListThread.h"
+#include <QStorageInfo>
+#include <QtGlobal>
+#include "../../../cpp11addition.h"
+
+#include "async/TransferThreadAsync.h"
+
+//warning the first entry is accessible will copy
+void ListThread::removeItems(const std::vector<uint64_t> &ids)
+{
+ for(unsigned int i=0;i<ids.size();i++)
+ skipInternal(ids.at(i));
+}
+
+//put on top
+void ListThread::moveItemsOnTop(std::vector<uint64_t> ids)
+{
+ if(actionToDoListTransfer.size()<=1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //do list operation
+ int indexToMove=0;
+ for (unsigned int i=0; i<actionToDoListTransfer.size(); ++i) {
+ if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
+ {
+ vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(indexToMove));
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=indexToMove;
+ newAction.userAction.position=i;
+ actionDone.push_back(newAction);
+ ActionToDoTransfer temp=actionToDoListTransfer.at(i);
+ actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+i);
+ actionToDoListTransfer.insert(actionToDoListTransfer.cbegin()+indexToMove,temp);
+ indexToMove++;
+ if(ids.empty())
+ return;
+ }
+ }
+ sendActionDone();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+//move up
+void ListThread::moveItemsUp(std::vector<uint64_t> ids)
+{
+ if(actionToDoListTransfer.size()<=1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //do list operation
+ int lastGoodPositionReal=0;
+ bool haveGoodPosition=false;
+ for (unsigned int i=0; i<actionToDoListTransfer.size(); ++i) {
+ if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
+ {
+ if(haveGoodPosition)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(i-1));
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=lastGoodPositionReal;
+ newAction.userAction.position=i;
+ actionDone.push_back(newAction);
+ ActionToDoTransfer temp1=actionToDoListTransfer.at(i);
+ ActionToDoTransfer temp2=actionToDoListTransfer.at(lastGoodPositionReal);
+ actionToDoListTransfer[i]=temp2;
+ actionToDoListTransfer[lastGoodPositionReal]=temp1;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Try move up false, item "+std::to_string(i));
+ vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
+ if(ids.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop with return");
+ return;
+ }
+ }
+ else
+ {
+ lastGoodPositionReal=i;
+ haveGoodPosition=true;
+ }
+ }
+ sendActionDone();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+//move down
+void ListThread::moveItemsDown(std::vector<uint64_t> ids)
+{
+ if(actionToDoListTransfer.size()<=1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //do list operation
+ int lastGoodPositionReal=0;
+ bool haveGoodPosition=false;
+ for (int i=actionToDoListTransfer.size()-1; i>=0; --i) {
+ if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
+ {
+ if(haveGoodPosition)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(i+1));
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=lastGoodPositionReal;
+ newAction.userAction.position=i;
+ actionDone.push_back(newAction);
+ ActionToDoTransfer temp1=actionToDoListTransfer.at(i);
+ ActionToDoTransfer temp2=actionToDoListTransfer.at(lastGoodPositionReal);
+ actionToDoListTransfer[i]=temp2;
+ actionToDoListTransfer[lastGoodPositionReal]=temp1;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Try move up false, item "+std::to_string(i));
+ }
+ vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
+ if(ids.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop with return");
+ return;
+ }
+ }
+ else
+ {
+ lastGoodPositionReal=i;
+ haveGoodPosition=true;
+ }
+ }
+ sendActionDone();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+//put on bottom
+void ListThread::moveItemsOnBottom(std::vector<uint64_t> ids)
+{
+ if(actionToDoListTransfer.size()<=1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ //do list operation
+ int lastGoodPositionReal=actionToDoListTransfer.size()-1;
+ for (int i=lastGoodPositionReal; i>=0; --i) {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Check action on item "+std::to_string(i));
+ if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(lastGoodPositionReal));
+ vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
+ Ultracopier::ReturnActionOnCopyList newAction;
+ newAction.type=Ultracopier::MoveItem;
+ newAction.addAction.id=actionToDoListTransfer.at(i).id;
+ newAction.userAction.moveAt=lastGoodPositionReal;
+ newAction.userAction.position=i;
+ actionDone.push_back(newAction);
+ ActionToDoTransfer temp=actionToDoListTransfer.at(i);
+ actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+i);
+ actionToDoListTransfer.insert(actionToDoListTransfer.cbegin()+lastGoodPositionReal,temp);
+ lastGoodPositionReal--;
+ if(ids.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop with return");
+ return;
+ }
+ }
+ }
+ sendActionDone();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
+}
+
+void ListThread::exportTransferList(const std::string &fileName)
+{
+ emit exportTransferListSend(fileName);
+}
+
+void ListThread::exportTransferListInternal(const std::string &fileName)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QFile transferFile(QString::fromStdString(fileName));
+ if(transferFile.open(QIODevice::WriteOnly|QIODevice::Truncate))
+ {
+ transferFile.write(QStringLiteral("Ultracopier;Transfer-list;").toUtf8());
+ if(!forcedMode)
+ transferFile.write(QStringLiteral("Transfer;").toUtf8());
+ else
+ {
+ if(mode==Ultracopier::Copy)
+ transferFile.write(QStringLiteral("Copy;").toUtf8());
+ else
+ transferFile.write(QStringLiteral("Move;").toUtf8());
+ }
+ transferFile.write(QStringLiteral("Ultracopier\n").toUtf8());
+ bool haveError=false;
+ int size=actionToDoListTransfer.size();
+ for (int index=0;index<size;++index) {
+ if(actionToDoListTransfer.at(index).mode==Ultracopier::Copy)
+ {
+ if(!forcedMode || mode==Ultracopier::Copy)
+ {
+ if(forcedMode)
+ transferFile.write((TransferThread::internalStringTostring(actionToDoListTransfer.at(index).source)+
+ ";"+TransferThread::internalStringTostring(actionToDoListTransfer.at(index).destination)+"\n").c_str());
+ else
+ transferFile.write(("Copy;"+TransferThread::internalStringTostring(actionToDoListTransfer.at(index).source)+
+ ";"+TransferThread::internalStringTostring(actionToDoListTransfer.at(index).destination)+"\n").c_str());
+ }
+ else
+ haveError=true;
+ }
+ else if(actionToDoListTransfer.at(index).mode==Ultracopier::Move)
+ {
+ if(!forcedMode || mode==Ultracopier::Move)
+ {
+ if(forcedMode)
+ transferFile.write((TransferThread::internalStringTostring(actionToDoListTransfer.at(index).source)+
+ ";"+TransferThread::internalStringTostring(actionToDoListTransfer.at(index).destination)+"\n").c_str());
+ else
+ transferFile.write(("Move;"+TransferThread::internalStringTostring(actionToDoListTransfer.at(index).source)+
+ ";"+TransferThread::internalStringTostring(actionToDoListTransfer.at(index).destination)+"\n").c_str());
+ }
+ else
+ haveError=true;
+ }
+ }
+ if(haveError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("Unable do to move or copy item into wrong forced mode: %1").arg(transferFile.errorString()).toStdString());
+ emit errorTransferList(tr("Unable do to move or copy item into wrong forced mode: %1").arg(transferFile.errorString()).toStdString());
+ }
+ transferFile.close();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("Unable to save the transfer list: %1").arg(transferFile.errorString()).toStdString());
+ emit errorTransferList(tr("Unable to save the transfer list: %1").arg(transferFile.errorString()).toStdString());
+ return;
+ }
+}
+
+void ListThread::importTransferList(const std::string &fileName)
+{
+ emit importTransferListSend(fileName);
+}
+
+void ListThread::importTransferListInternal(const std::string &fileName)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QFile transferFile(QString::fromStdString(fileName));
+ if(transferFile.open(QIODevice::ReadOnly))
+ {
+ std::string content;
+ QByteArray data=transferFile.readLine(64);
+ if(data.size()<=0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Problem reading file, or file-size is 0");
+ emit errorTransferList(tr("Problem reading file, or file-size is 0").toStdString());
+ return;
+ }
+ content=QString::fromUtf8(data).toStdString();
+ if(content!="Ultracopier;Transfer-list;Transfer;Ultracopier\n" && content!="Ultracopier;Transfer-list;Copy;Ultracopier\n" && content!="Ultracopier;Transfer-list;Move;Ultracopier\n")
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Wrong header: "+content);
+ emit errorTransferList(tr("Wrong header: \"%1\"").arg(QString::fromStdString(content)).toStdString());
+ return;
+ }
+ bool transferListMixedMode=false;
+ if(content=="Ultracopier;Transfer-list;Transfer;Ultracopier\n")
+ {
+ if(forcedMode)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The transfer list is in mixed mode, but this instance is not");
+ emit errorTransferList(tr("The transfer list is in mixed mode, but this instance is not in this mode").toStdString());
+ return;
+ }
+ else
+ transferListMixedMode=true;
+ }
+ if(content=="Ultracopier;Transfer-list;Copy;Ultracopier\n" && (forcedMode && mode==Ultracopier::Move))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("The transfer list is in copy mode, but this instance is not: forcedMode: %1, mode: %2").arg(forcedMode).arg(mode).toStdString());
+ emit errorTransferList(tr("The transfer list is in copy mode, but this instance is not in this mode").toStdString());
+ return;
+ }
+ if(content=="Ultracopier;Transfer-list;Move;Ultracopier\n" && (forcedMode && mode==Ultracopier::Copy))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("The transfer list is in move mode, but this instance is not: forcedMode: %1, mode: %2").arg(forcedMode).arg(mode).toStdString());
+ emit errorTransferList(tr("The transfer list is in move mode, but this instance is not in this mode").toStdString());
+ return;
+ }
+
+ bool updateTheStatus_copying=actionToDoListTransfer.size()>0 || actionToDoListInode.size()>0 || actionToDoListInode_afterTheTransfer.size()>0;
+ Ultracopier::EngineActionInProgress updateTheStatus_action_in_progress;
+ if(updateTheStatus_copying)
+ updateTheStatus_action_in_progress=Ultracopier::CopyingAndListing;
+ else
+ updateTheStatus_action_in_progress=Ultracopier::Listing;
+ emit actionInProgess(updateTheStatus_action_in_progress);
+
+ bool errorFound=false;
+ std::regex correctLine;
+ if(transferListMixedMode)
+ correctLine=std::regex("^(Copy|Move);[^;]+;[^;]+[\n\r]*$");
+ else
+ correctLine=std::regex("^[^;]+;[^;]+[\n\r]*$");
+ std::vector<std::string> args;
+ Ultracopier::CopyMode tempMode;
+ do
+ {
+ data=transferFile.readLine(65535*2);
+ if(data.size()>0)
+ {
+ content=std::string(data.constData(),data.size());
+ //do the import here
+ if(std::regex_match(content,correctLine))
+ {
+ stringreplaceAll(content,"\n","");
+ args=stringsplit(content,';');
+ if(forcedMode)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("New data to import in forced mode: %2,%3")
+ .arg(QString::fromStdString(args.at(0)))
+ .arg(QString::fromStdString(args.at(1)))
+ .toStdString());
+ addToTransfer(TransferThread::stringToInternalString(args.at(0)),
+ TransferThread::stringToInternalString(args.at(1)),mode);
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("New data to import: %1,%2,%3")
+ .arg(QString::fromStdString(args.at(0)))
+ .arg(QString::fromStdString(args.at(1)))
+ .arg(QString::fromStdString(args.at(2)))
+ .toStdString());
+ if(args.at(0)=="Copy")
+ tempMode=Ultracopier::Copy;
+ else
+ tempMode=Ultracopier::Move;
+ addToTransfer(TransferThread::stringToInternalString(args.at(1)),TransferThread::stringToInternalString(args.at(2)),tempMode);
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Wrong line syntax: "+content);
+ errorFound=true;
+ }
+ }
+ }
+ while(data.size()>0);
+ transferFile.close();
+ if(errorFound)
+ emit warningTransferList(tr("Some errors have been found during the line parsing").toStdString());
+
+ updateTheStatus();//->sendActionDone(); into this
+ autoStartAndCheckSpace();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("Unable to open the transfer list: %1").arg(transferFile.errorString()).toStdString());
+ emit errorTransferList(tr("Unable to open the transfer list: %1").arg(transferFile.errorString()).toStdString());
+ return;
+ }
+}
+
+void ListThread::exportErrorIntoTransferList(const std::string &fileName)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QFile transferFile(QString::fromStdString(fileName));
+ if(transferFile.open(QIODevice::WriteOnly|QIODevice::Truncate))
+ {
+ transferFile.write(QStringLiteral("Ultracopier;Transfer-list;").toUtf8());
+ if(!forcedMode)
+ transferFile.write(QStringLiteral("Transfer;").toUtf8());
+ else
+ {
+ if(mode==Ultracopier::Copy)
+ transferFile.write(QStringLiteral("Copy;").toUtf8());
+ else
+ transferFile.write(QStringLiteral("Move;").toUtf8());
+ }
+ transferFile.write(QStringLiteral("Ultracopier\n").toUtf8());
+ bool haveError=false;
+ int size=errorLog.size();
+ for (int index=0;index<size;++index) {
+ if(forcedMode)
+ transferFile.write((errorLog.at(index).source+";"+errorLog.at(index).destination+"\n").c_str());
+ else
+ {
+ if(errorLog.at(index).mode==Ultracopier::Copy)
+ transferFile.write(("Copy;"+errorLog.at(index).source+";"+errorLog.at(index).destination+"\n").c_str());
+ else if(errorLog.at(index).mode==Ultracopier::Move)
+ transferFile.write(("Move;"+errorLog.at(index).source+";"+errorLog.at(index).destination+"\n").c_str());
+ else
+ haveError=true;
+ }
+ }
+ if(haveError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable do to move or copy item into wrong forced mode: "+transferFile.errorString().toStdString());
+ emit errorTransferList(tr("Unable do to move or copy item into wrong forced mode: %1").arg(transferFile.errorString()).toStdString());
+ }
+ transferFile.close();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to save the transfer list: "+transferFile.errorString().toStdString());
+ emit errorTransferList(tr("Unable to save the transfer list: %1").arg(transferFile.errorString()).toStdString());
+ return;
+ }
+}
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ListThreadMedia.cpp b/plugins/CopyEngine/Ultracopier-Spec/ListThreadMedia.cpp
new file mode 100755
index 0000000..4eba9a0
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/ListThreadMedia.cpp
@@ -0,0 +1,169 @@
+#include "ListThread.h"
+#include <QStorageInfo>
+#include <QtGlobal>
+#include "../../../cpp11addition.h"
+#include "async/TransferThreadAsync.h"
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::haveSameSource(const std::vector<std::string> &sources)
+{
+ if(stopIt)
+ return false;
+ if(sourceDriveMultiple)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sourceDriveMultiple");
+ return false;
+ }
+ if(sourceDrive.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sourceDrive.isEmpty()");
+ return true;
+ }
+ unsigned int index=0;
+ while(index<sources.size())
+ {
+ if(driveManagement.getDrive(sources.at(index))!=sourceDrive)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sources.at(index))!=sourceDrive");
+ return false;
+ }
+ index++;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"seam have same source");
+ return true;
+}
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::haveSameDestination(const std::string &destination)
+{
+ if(stopIt)
+ return false;
+ if(destinationDriveMultiple)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destinationDriveMultiple");
+ return false;
+ }
+ if(destinationDrive.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destinationDrive.isEmpty()");
+ return true;
+ }
+ if(driveManagement.getDrive(destination)!=destinationDrive)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination!=destinationDrive");
+ return false;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"seam have same destination");
+ return true;
+}
+
+/// \return empty if multiple or no destination
+std::string ListThread::getUniqueDestinationFolder() const
+{
+ if(stopIt)
+ return std::string();
+ if(destinationFolderMultiple)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destinationDriveMultiple");
+ return std::string();
+ }
+ return TransferThread::internalStringTostring(destinationFolder);
+}
+
+void ListThread::detectDrivesOfCurrentTransfer(const std::vector<INTERNALTYPEPATH> &sources,const INTERNALTYPEPATH &destination)
+{
+ /* code to detect volume/mount point to group by windows */
+ if(!sourceDriveMultiple)
+ {
+ unsigned int index=0;
+ while(index<sources.size())
+ {
+ const std::string &tempDrive=driveManagement.getDrive(TransferThread::internalStringTostring(sources.at(index)));
+ //if have not already source, set the source
+ if(sourceDrive.empty())
+ sourceDrive=tempDrive;
+ //if have previous source and the news source is not the same
+ if(sourceDrive!=tempDrive)
+ {
+ sourceDriveMultiple=true;
+ break;
+ }
+ index++;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source informations, sourceDrive: %1, sourceDriveMultiple: %2").arg(QString::fromStdString(sourceDrive)).arg(sourceDriveMultiple).toStdString());
+ if(!destinationDriveMultiple)
+ {
+ const std::string &tempDrive=driveManagement.getDrive(TransferThread::internalStringTostring(destination));
+ //if have not already destination, set the destination
+ if(destinationDrive.empty())
+ destinationDrive=tempDrive;
+ //if have previous destination and the news destination is not the same
+ if(destinationDrive!=tempDrive)
+ destinationDriveMultiple=true;
+ }
+ if(!destinationFolderMultiple)
+ {
+ //if have not already destination, set the destination
+ if(destinationFolder.empty())
+ destinationFolder=destination;
+ //if have previous destination and the news destination is not the same
+ if(destinationFolder!=destination)
+ destinationFolderMultiple=true;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("destination informations, destinationDrive: %1, destinationDriveMultiple: %2").arg(QString::fromStdString(destinationDrive)).arg(destinationDriveMultiple).toStdString());
+}
+
+//return
+bool ListThread::needMoreSpace() const
+{
+ if(!checkDiskSpace)
+ return false;
+ std::vector<Diskspace> diskspace_list;
+ for( auto& spaceDrive : requiredSpace ) {
+ const QString &drive=QString::fromStdString(spaceDrive.first);
+ #ifdef Q_OS_WIN32
+ if(spaceDrive.first!="A:\\" && spaceDrive.first!="A:/" && spaceDrive.first!="A:" && spaceDrive.first!="A" && spaceDrive.first!="a:\\" && spaceDrive.first!="a:/" && spaceDrive.first!="a:" && spaceDrive.first!="a")
+ {
+ #endif
+ QStorageInfo storageInfo(drive);
+ storageInfo.refresh();
+ const qint64 &availableSpace=storageInfo.bytesAvailable();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ const qint64 &bytesFree=storageInfo.bytesFree();
+ #endif
+
+ if(availableSpace<0 ||
+ //workaround for all 0 value in case of bug from Qt
+ (availableSpace==0 && storageInfo.bytesTotal()==0)
+ )
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("availableSpace: %1, space needed: %2, on: %3, bytesFree: %4").arg(availableSpace).arg(spaceDrive.second).arg(drive).arg(bytesFree).toStdString());
+ }
+ else if(spaceDrive.second>(quint64)availableSpace)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("availableSpace: %1, space needed: %2, on: %3, bytesFree: %4").arg(availableSpace).arg(spaceDrive.second).arg(drive).arg(bytesFree).toStdString());
+ #ifdef Q_OS_WIN32
+ //if(drive.contains(QRegularExpression("^[a-zA-Z]:[\\\\/]")))
+ if(drive.contains(QRegularExpression("^[a-zA-Z]:")))
+ #endif
+ {
+ Diskspace diskspace;
+ diskspace.drive=spaceDrive.first;
+ diskspace.freeSpace=availableSpace;
+ diskspace.requiredSpace=spaceDrive.second;
+ diskspace_list.push_back(diskspace);
+ }
+ #ifdef Q_OS_WIN32
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"not local drive");
+ #endif
+ }
+ #ifdef Q_OS_WIN32
+ }
+ #endif
+ }
+ if(!diskspace_list.empty())
+ emit missingDiskSpace(diskspace_list);
+ return ! diskspace_list.empty();
+}
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ListThreadNew.cpp b/plugins/CopyEngine/Ultracopier-Spec/ListThreadNew.cpp
new file mode 100755
index 0000000..f4a1857
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/ListThreadNew.cpp
@@ -0,0 +1,104 @@
+#include "ListThread.h"
+#include <QStorageInfo>
+#include <QtGlobal>
+#include "../../../cpp11addition.h"
+
+#include "async/TransferThreadAsync.h"
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::newCopy(const std::vector<std::string> &sources,const std::string &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+stringimplode(sources,";")+", destination: "+destination);
+ ScanFileOrFolder * scanFileOrFolderThread=newScanThread(Ultracopier::Copy);
+ if(scanFileOrFolderThread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to get new thread");
+ return false;
+ }
+ std::regex base_regex("^[a-z][a-z][a-z]*:/.*");
+ std::smatch base_match;
+ std::vector<INTERNALTYPEPATH> sourcesClean;
+ unsigned int index=0;
+ while(index<sources.size())
+ {
+ std::string source=sources.at(index);
+ //can be: file://192.168.0.99/share/file.txt
+ //can be: file:///C:/file.txt
+ //can be: file:///home/user/fileatrootunderunix
+ #ifndef Q_OS_WIN
+ if(stringStartWith(source,"file:///"))
+ source.replace(0,7,"");
+ #else
+ if(stringStartWith(source,"file:///"))
+ source.replace(0,8,"");
+ else if(stringStartWith(source,"file://"))
+ source.replace(0,5,"");
+ else if(stringStartWith(source,"file:/"))
+ source.replace(0,6,"");
+ #endif
+ else if (std::regex_match(source, base_match, base_regex))
+ return false;
+ if(index<99)
+ {
+ if(sources.at(index)!=source)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,sources.at(index)+" -> "+source);
+ }
+ index++;
+ sourcesClean.push_back(TransferThread::stringToInternalString(source));
+ }
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sourcesClean: "+stringimplode(sourcesClean,";"));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination: "+destination);
+ const INTERNALTYPEPATH &Wdest=TransferThread::stringToInternalString(destination);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination: "+TransferThread::internalStringTostring(Wdest));
+ scanFileOrFolderThread->addToList(sourcesClean,Wdest);
+ scanThreadHaveFinish(true);
+ detectDrivesOfCurrentTransfer(sourcesClean,TransferThread::stringToInternalString(destination));
+ return true;
+}
+
+// -> add thread safe, by Qt::BlockingQueuedConnection
+bool ListThread::newMove(const std::vector<std::string> &sources,const std::string &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ ScanFileOrFolder * scanFileOrFolderThread = newScanThread(Ultracopier::Move);
+ if(scanFileOrFolderThread==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to get new thread");
+ return false;
+ }
+ std::regex base_regex("^[a-z][a-z][a-z]*:/.*");
+ std::smatch base_match;
+ std::vector<INTERNALTYPEPATH> sourcesClean;
+ unsigned int index=0;
+ while(index<sources.size())
+ {
+ std::string source=sources.at(index);
+ //can be: file://192.168.0.99/share/file.txt
+ //can be: file:///C:/file.txt
+ //can be: file:///home/user/fileatrootunderunix
+ #ifndef Q_OS_WIN
+ if(stringStartWith(source,"file:///"))
+ source.replace(0,7,"");
+ #else
+ if(stringStartWith(source,"file:///"))
+ source.replace(0,8,"");
+ else if(stringStartWith(source,"file://"))
+ source.replace(0,5,"");
+ else if(stringStartWith(source,"file:/"))
+ source.replace(0,6,"");
+ #endif
+ else if (std::regex_match(source, base_match, base_regex))
+ return false;
+ if(index<99)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,sources.at(index)+" -> "+source);
+ index++;
+ sourcesClean.push_back(TransferThread::stringToInternalString(source));
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination: "+destination);
+ const INTERNALTYPEPATH &Wdest=TransferThread::stringToInternalString(destination);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination: "+TransferThread::internalStringTostring(Wdest));
+ scanFileOrFolderThread->addToList(sourcesClean,Wdest);
+ scanThreadHaveFinish(true);
+ detectDrivesOfCurrentTransfer(sourcesClean,TransferThread::stringToInternalString(destination));
+ return true;
+}
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ListThreadOptions.cpp b/plugins/CopyEngine/Ultracopier-Spec/ListThreadOptions.cpp
new file mode 100755
index 0000000..25d710f
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/ListThreadOptions.cpp
@@ -0,0 +1,296 @@
+#include "ListThread.h"
+#include <QStorageInfo>
+#include <QtGlobal>
+#include "../../../cpp11addition.h"
+#include "async/TransferThreadAsync.h"
+
+//set the copy info and options before runing
+void ListThread::setRightTransfer(const bool doRightTransfer)
+{
+ mkPathQueue.setRightTransfer(doRightTransfer);
+ this->doRightTransfer=doRightTransfer;
+ unsigned int index=0;
+ while(index<transferThreadList.size())
+ {
+ transferThreadList.at(index)->setRightTransfer(doRightTransfer);
+ index++;
+ }
+}
+
+//set keep date
+void ListThread::setKeepDate(const bool keepDate)
+{
+ mkPathQueue.setKeepDate(keepDate);
+ this->keepDate=keepDate;
+ unsigned int index=0;
+ while(index<transferThreadList.size())
+ {
+ transferThreadList.at(index)->setKeepDate(keepDate);
+ index++;
+ }
+}
+
+void ListThread::setOsSpecFlags(bool os_spec_flags)
+{
+ this->os_spec_flags=os_spec_flags;
+ unsigned int index=0;
+ while(index<transferThreadList.size())
+ {
+ transferThreadList.at(index)->setOsSpecFlags(os_spec_flags);
+ index++;
+ }
+}
+
+void ListThread::setNativeCopy(bool native_copy)
+{
+ this->native_copy=native_copy;
+ unsigned int index=0;
+ while(index<transferThreadList.size())
+ {
+ transferThreadList.at(index)->setNativeCopy(native_copy);
+ index++;
+ }
+}
+
+#ifdef ULTRACOPIER_PLUGIN_RSYNC
+/// \brief set rsync
+void ListThread::setRsync(const bool rsync)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"set rsync: "+std::to_string(rsync));
+ this->rsync=rsync;
+ unsigned int index=0;
+ while(index<transferThreadList.size())
+ {
+ transferThreadList.at(index)->setRsync(rsync);
+ index++;
+ }
+ for(unsigned int i=0;i<scanFileOrFolderThreadsPool.size();i++)
+ scanFileOrFolderThreadsPool.at(i)->setRsync(rsync);
+}
+#endif
+
+//set check destination folder
+void ListThread::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+{
+ this->checkDestinationFolderExists=checkDestinationFolderExists;
+ for(unsigned int i=0;i<scanFileOrFolderThreadsPool.size();i++)
+ scanFileOrFolderThreadsPool.at(i)->setCheckDestinationFolderExists(checkDestinationFolderExists && alwaysDoThisActionForFolderExists!=FolderExists_Merge);
+}
+
+void ListThread::setCollisionAction(const FileExistsAction &alwaysDoThisActionForFileExists)
+{
+ this->alwaysDoThisActionForFileExists=alwaysDoThisActionForFileExists;
+ unsigned int index=0;
+ while(index<transferThreadList.size())
+ {
+ transferThreadList.at(index)->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ index++;
+ }
+}
+
+//set the folder local collision
+void ListThread::setFolderCollision(const FolderExistsAction &alwaysDoThisActionForFolderExists)
+{
+ this->alwaysDoThisActionForFolderExists=alwaysDoThisActionForFolderExists;
+}
+
+//speedLimitation in KB/s
+bool ListThread::setSpeedLimitation(const int64_t &speedLimitation)
+{
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"maxSpeed in KB/s: "+std::to_string(speedLimitation));
+
+ if(speedLimitation>1024*1024)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"speedLimitation out of range");
+ return false;
+ }
+ this->speedLimitation=speedLimitation;
+
+ multiForBigSpeed=0;
+ if(speedLimitation>0)
+ {
+ blockSizeAfterSpeedLimitation=blockSize;
+
+ //try resolv the interval
+ int newInterval;//in ms
+ do
+ {
+ multiForBigSpeed++;
+ //at max speed, is out of range for int, it's why quint64 is used
+ newInterval=(((quint64)blockSize*(quint64)multiForBigSpeed*1000/* *1000 because interval is into ms, not s*/)/((quint64)speedLimitation*(quint64)1024));
+ if(newInterval<0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"calculated newInterval wrong");
+ return false;
+ }
+ }
+ while(newInterval<ULTRACOPIER_PLUGIN_MINTIMERINTERVAL);
+
+ if(newInterval<=0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"calculated newInterval wrong");
+ return false;
+ }
+ //wait time too big, then shrink the block size and set interval to max size
+ if(newInterval>ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"wait time too big, then shrink the block size and set interval to max size");
+ newInterval=ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL;
+ multiForBigSpeed=1;
+ blockSizeAfterSpeedLimitation=(this->speedLimitation*1024*newInterval)/1000;
+
+ if(blockSizeAfterSpeedLimitation<10)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"calculated block size wrong");
+ return false;
+ }
+
+ //set the new block size into the thread
+ const int &loop_size=transferThreadList.size();
+ int int_for_loop=0;
+ while(int_for_loop<loop_size)
+ {
+ if(!transferThreadList.at(int_for_loop)->setBlockSize(blockSizeAfterSpeedLimitation))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the block size");
+ int_for_loop++;
+ }
+ }
+
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("fixed speed with new block size and new interval in BlockSize: %1, multiForBigSpeed: %2, newInterval: %3, maxSpeed: %4")
+ .arg(blockSizeAfterSpeedLimitation)
+ .arg(multiForBigSpeed)
+ .arg(newInterval)
+ .arg(speedLimitation)
+ .toStdString()
+ );
+
+ clockForTheCopySpeed->setInterval(newInterval);
+ if(clockForTheCopySpeed!=NULL)
+ clockForTheCopySpeed->start();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"clockForTheCopySpeed == NULL at this point");
+ }
+ else
+ {
+ if(clockForTheCopySpeed!=NULL)
+ clockForTheCopySpeed->stop();
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"clockForTheCopySpeed == NULL at this point");
+ int int_for_loop=0;
+ const int &loop_size=transferThreadList.size();
+ while(int_for_loop<loop_size)
+ {
+ transferThreadList.at(int_for_loop)->setBlockSize(blockSize);
+ int_for_loop++;
+ }
+ }
+ int int_for_loop=0;
+ const int &loop_size=transferThreadList.size();
+ while(int_for_loop<loop_size)
+ {
+ transferThreadList.at(int_for_loop)->setMultiForBigSpeed(multiForBigSpeed);
+ int_for_loop++;
+ }
+
+ return true;
+ #else
+ Q_UNUSED(speedLimitation);
+ return false;
+ #endif
+}
+
+//set data local to the thread
+void ListThread::setAlwaysFileExistsAction(const FileExistsAction &alwaysDoThisActionForFileExists)
+{
+ this->alwaysDoThisActionForFileExists=alwaysDoThisActionForFileExists;
+ unsigned int int_for_loop=0;
+ while(int_for_loop<transferThreadList.size())
+ {
+ transferThreadList.at(int_for_loop)->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
+ int_for_loop++;
+ }
+}
+
+/** \brief give the forced mode, to export/import transfer list */
+void ListThread::forceMode(const Ultracopier::CopyMode &mode)
+{
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(mode==Ultracopier::Move)
+ setRsync(false);
+ #endif
+ if(mode==Ultracopier::Copy)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Force mode to copy");
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Force mode to move");
+ this->mode=mode;
+ forcedMode=true;
+}
+
+void ListThread::setMoveTheWholeFolder(const bool &moveTheWholeFolder)
+{
+ for(unsigned int i=0;i<scanFileOrFolderThreadsPool.size();i++)
+ scanFileOrFolderThreadsPool.at(i)->setMoveTheWholeFolder(moveTheWholeFolder);
+ this->moveTheWholeFolder=moveTheWholeFolder;
+}
+
+void ListThread::setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles)
+{
+ this->deletePartiallyTransferredFiles=deletePartiallyTransferredFiles;
+ unsigned int index=0;
+ while(index<transferThreadList.size())
+ {
+ transferThreadList.at(index)->setDeletePartiallyTransferredFiles(deletePartiallyTransferredFiles);
+ index++;
+ }
+}
+
+void ListThread::setInodeThreads(const int &inodeThreads)
+{
+ if(inodeThreads<1 || inodeThreads>32)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"inodeThreads is out of ranges: "+std::to_string(inodeThreads));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"inodeThreads: "+std::to_string(inodeThreads));
+ this->inodeThreads=inodeThreads;
+ createTransferThread();
+ deleteTransferThread();
+}
+
+void ListThread::setRenameTheOriginalDestination(const bool &renameTheOriginalDestination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"renameTheOriginalDestination: "+std::to_string(renameTheOriginalDestination));
+ this->renameTheOriginalDestination=renameTheOriginalDestination;
+ unsigned int index=0;
+ while(index<transferThreadList.size())
+ {
+ transferThreadList.at(index)->setRenameTheOriginalDestination(renameTheOriginalDestination);
+ index++;
+ }
+}
+
+void ListThread::setCheckDiskSpace(const bool &checkDiskSpace)
+{
+ this->checkDiskSpace=checkDiskSpace;
+}
+
+void ListThread::setBuffer(const bool &buffer)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"setBuffer: "+std::to_string(buffer));
+ this->buffer=buffer;
+ unsigned int index=0;
+ while(index<transferThreadList.size())
+ {
+ transferThreadList.at(index)->setBuffer(buffer);
+ index++;
+ }
+}
+
+void ListThread::setFollowTheStrictOrder(const bool &order)
+{
+ this->followTheStrictOrder=order;
+ for(unsigned int i=0;i<scanFileOrFolderThreadsPool.size();i++)
+ scanFileOrFolderThreadsPool.at(i)->setFollowTheStrictOrder(this->followTheStrictOrder);
+}
+
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ListThreadScan.cpp b/plugins/CopyEngine/Ultracopier-Spec/ListThreadScan.cpp
new file mode 100755
index 0000000..48cc444
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/ListThreadScan.cpp
@@ -0,0 +1,97 @@
+#include "ListThread.h"
+#include <QStorageInfo>
+#include <QtGlobal>
+#include "../../../cpp11addition.h"
+
+#include "async/TransferThreadAsync.h"
+
+ScanFileOrFolder * ListThread::newScanThread(Ultracopier::CopyMode mode)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start with: "+std::to_string(mode));
+
+ //create new thread because is auto-detroyed
+ scanFileOrFolderThreadsPool.push_back(new ScanFileOrFolder(mode));
+ ScanFileOrFolder * scanFileOrFolderThreads=scanFileOrFolderThreadsPool.back();
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::finishedTheListing, this,&ListThread::scanThreadHaveFinishSlot, Qt::QueuedConnection))
+ abort();
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::fileTransfer, this,&ListThread::fileTransfer, Qt::QueuedConnection))
+ abort();
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::fileTransferWithInode, this,&ListThread::fileTransferWithInode, Qt::QueuedConnection))
+ abort();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection))
+ abort();
+ #endif
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::newFolderListing, this,&ListThread::newFolderListing))
+ abort();
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::addToMovePath, this,&ListThread::addToMovePath, Qt::QueuedConnection))
+ abort();
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::addToKeepAttributePath, this,&ListThread::addToKeepAttributePath, Qt::QueuedConnection))
+ abort();
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::addToRealMove, this,&ListThread::addToRealMove, Qt::QueuedConnection))
+ abort();
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::addToMkPath, this,&ListThread::addToMkPath, Qt::QueuedConnection))
+ abort();
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::addToRmForRsync, this,&ListThread::addToRmForRsync, Qt::QueuedConnection))
+ abort();
+ #endif
+
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::errorOnFolder, this,&ListThread::errorOnFolder, Qt::QueuedConnection))
+ abort();
+ if(!connect(scanFileOrFolderThreads,&ScanFileOrFolder::folderAlreadyExists, this,&ListThread::folderAlreadyExists, Qt::QueuedConnection))
+ abort();
+
+ if(!connect(this,&ListThread::send_updateMount, scanFileOrFolderThreads,&ScanFileOrFolder::set_updateMount, Qt::QueuedConnection))
+ abort();
+
+ scanFileOrFolderThreads->setFilters(include,exclude);
+ scanFileOrFolderThreads->setCheckDestinationFolderExists(checkDestinationFolderExists && alwaysDoThisActionForFolderExists!=FolderExists_Merge);
+ scanFileOrFolderThreads->setMoveTheWholeFolder(moveTheWholeFolder);
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ scanFileOrFolderThreads->setRsync(rsync);
+ #endif
+ if(scanFileOrFolderThreadsPool.size()==1)
+ updateTheStatus();
+ scanFileOrFolderThreads->setRenamingRules(firstRenamingRule,otherRenamingRule);
+ scanFileOrFolderThreads->setFollowTheStrictOrder(followTheStrictOrder);
+ return scanFileOrFolderThreads;
+}
+
+void ListThread::scanThreadHaveFinishSlot()
+{
+ scanThreadHaveFinish();
+}
+
+void ListThread::scanThreadHaveFinish(bool skipFirstRemove)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"listing thread have finish, skipFirstRemove: "+std::to_string(skipFirstRemove));
+ if(!skipFirstRemove)
+ {
+ ScanFileOrFolder * senderThread = qobject_cast<ScanFileOrFolder *>(QObject::sender());
+ if(senderThread==NULL)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"sender pointer null (plugin copy engine)");
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start the next thread, scanFileOrFolderThreadsPool.size(): "+std::to_string(scanFileOrFolderThreadsPool.size()));
+ delete senderThread;
+ vectorremoveOne(scanFileOrFolderThreadsPool,senderThread);
+ if(scanFileOrFolderThreadsPool.empty())
+ updateTheStatus();
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start the next thread, scanFileOrFolderThreadsPool.size(): "+std::to_string(scanFileOrFolderThreadsPool.size()));
+ if(scanFileOrFolderThreadsPool.size()>0)
+ {
+ //then start the next listing threads
+ if(scanFileOrFolderThreadsPool.front()->isFinished())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Start listing thread");
+ scanFileOrFolderThreadsPool.front()->start();
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"The listing thread is already running");
+ }
+ else
+ autoStartAndCheckSpace();
+}
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ListThreadStat.cpp b/plugins/CopyEngine/Ultracopier-Spec/ListThreadStat.cpp
new file mode 100755
index 0000000..bbba3ee
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/ListThreadStat.cpp
@@ -0,0 +1,184 @@
+#include "ListThread.h"
+#include <QStorageInfo>
+#include <QtGlobal>
+#include "../../../cpp11addition.h"
+
+#include "async/TransferThreadAsync.h"
+
+/// \brief update the transfer stat
+void ListThread::newTransferStat(const TransferStat &stat,const quint64 &id)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"TransferStat: "+std::to_string(stat));
+ Ultracopier::ReturnActionOnCopyList newAction;
+ switch(stat)
+ {
+ case TransferStat_Idle:
+ return;
+ break;
+ case TransferStat_PreOperation:
+ return;
+ break;
+ case TransferStat_WaitForTheTransfer:
+ return;
+ break;
+ case TransferStat_Transfer:
+ newAction.type=Ultracopier::Transfer;
+ break;
+ case TransferStat_PostTransfer:
+ case TransferStat_PostOperation:
+ newAction.type=Ultracopier::PostOperation;
+ break;
+ default:
+ return;
+ break;
+ }
+ newAction.addAction.id = id;
+ actionDone.push_back(newAction);
+}
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
+void ListThread::timedUpdateDebugDialog()
+{
+ std::vector<std::string> newList;
+ int index=0;
+ int loop_sub_size_transfer_thread_search=transferThreadList.size();
+ while(index<loop_sub_size_transfer_thread_search)
+ {
+ QString stat;
+ switch(transferThreadList.at(index)->getStat())
+ {
+ case TransferStat_Idle:
+ stat="Idle";
+ break;
+ case TransferStat_PreOperation:
+ stat="PreOperation";
+ break;
+ case TransferStat_WaitForTheTransfer:
+ stat="WaitForTheTransfer";
+ break;
+ case TransferStat_Transfer:
+ stat="Transfer";
+ break;
+ case TransferStat_PostOperation:
+ stat="PostOperation";
+ break;
+ case TransferStat_PostTransfer:
+ stat="PostTransfer";
+ break;
+ default:
+ stat=QStringLiteral("??? (%1)").arg(transferThreadList.at(index)->getStat());
+ break;
+ }
+ newList.push_back(QStringLiteral("%1) (%3,%4) %2")
+ .arg(index)
+ .arg(stat)
+ .arg(transferThreadList.at(index)->readingLetter())
+ .arg(transferThreadList.at(index)->writingLetter())
+ .toStdString()
+ );
+ index++;
+ }
+ std::vector<std::string> newList2;
+ index=0;
+ const int &loop_size=actionToDoListTransfer.size();
+ while(index<loop_size)
+ {
+ newList2.push_back(
+ TransferThread::internalStringTostring(actionToDoListTransfer.at(index).source)+
+ " "+std::to_string(actionToDoListTransfer.at(index).size)+" "+
+ TransferThread::internalStringTostring(actionToDoListTransfer.at(index).destination)
+ );
+ if(index>((inodeThreads+ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER)*2+1))
+ {
+ newList2.push_back("...");
+ break;
+ }
+ index++;
+ }
+ emit updateTheDebugInfo(newList,newList2,numberOfInodeOperation);
+}
+#endif
+
+int ListThread::getNumberOfTranferRuning() const
+{
+ int numberOfTranferRuning=0;
+ const int &loop_size=transferThreadList.size();
+ //lunch the transfer in WaitForTheTransfer
+ int int_for_loop=0;
+ while(int_for_loop<loop_size)
+ {
+ if(transferThreadList.at(int_for_loop)->getStat()==TransferStat_Transfer && transferThreadList.at(int_for_loop)->transferId!=0 && transferThreadList.at(int_for_loop)->transferSize>=parallelizeIfSmallerThan)
+ numberOfTranferRuning++;
+ int_for_loop++;
+ }
+ return numberOfTranferRuning;
+}
+
+//send action done
+void ListThread::sendActionDone()
+{
+ if(!actionDone.empty())
+ {
+ emit newActionOnList(actionDone);
+ actionDone.clear();
+ }
+ if(!timeToTransfer.empty())
+ {
+ emit doneTime(timeToTransfer);
+ timeToTransfer.clear();
+ }
+}
+
+//send progression
+void ListThread::sendProgression()
+{
+ if(actionToDoListTransfer.empty())
+ return;
+ oversize=0;
+ currentProgression=0;
+ int int_for_loop=0;
+ const int &loop_size=transferThreadList.size();
+ while(int_for_loop<loop_size)
+ {
+ TransferThreadAsync * temp_transfer_thread=transferThreadList.at(int_for_loop);
+ switch(temp_transfer_thread->getStat())
+ {
+ case TransferStat_Transfer:
+ case TransferStat_PostTransfer:
+ case TransferStat_PostOperation:
+ {
+ copiedSize=temp_transfer_thread->copiedSize();
+
+ //for the general progression
+ currentProgression+=copiedSize;
+
+ //the oversize (when the file is bigger after/during the copy then what was during the listing)
+ if(copiedSize>(qint64)temp_transfer_thread->transferSize)
+ localOverSize=copiedSize-temp_transfer_thread->transferSize;
+ else
+ localOverSize=0;
+
+ //the current size copied
+ totalSize=temp_transfer_thread->transferSize+localOverSize;
+ std::pair<uint64_t,uint64_t> progression=temp_transfer_thread->progression();
+ Ultracopier::ProgressionItem tempItem;
+ tempItem.currentRead=progression.first;
+ tempItem.currentWrite=progression.second;
+ tempItem.id=temp_transfer_thread->transferId;
+ tempItem.total=totalSize;
+ progressionList.push_back(tempItem);
+
+ //add the oversize to the general progression
+ oversize+=localOverSize;
+ }
+ break;
+ default:
+ break;
+ }
+ int_for_loop++;
+ }
+ emit pushFileProgression(progressionList);
+ progressionList.clear();
+ emit pushGeneralProgression(bytesTransfered+currentProgression,bytesToTransfer+oversize);
+ realByteTransfered();
+}
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ListThread_InodeAction.cpp b/plugins/CopyEngine/Ultracopier-Spec/ListThread_InodeAction.cpp
new file mode 100755
index 0000000..b26cb35
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/ListThread_InodeAction.cpp
@@ -0,0 +1,91 @@
+/** \file ListThread_InodeAction.cpp
+\brief To be included into ListThread.cpp, to optimize and prevent code duplication
+\see ListThread.cpp */
+
+#ifdef LISTTHREAD_H
+
+//do the inode action
+ActionToDoInode& currentActionToDoInode=actionToDoListInode[int_for_internal_loop];
+switch(currentActionToDoInode.type)
+{
+ case ActionType_RealMove:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"launch real move, source: "+TransferThread::internalStringTostring(currentActionToDoInode.source)+
+ ", destination: "+TransferThread::internalStringTostring(currentActionToDoInode.destination));
+ mkPathQueue.addPath(currentActionToDoInode.source,currentActionToDoInode.destination,currentActionToDoInode.type);
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ break;
+ case ActionType_MkPath:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"launch mkpath, source: "+TransferThread::internalStringTostring(currentActionToDoInode.source)+
+ ", destination: "+TransferThread::internalStringTostring(currentActionToDoInode.destination));
+ mkPathQueue.addPath(currentActionToDoInode.source,currentActionToDoInode.destination,currentActionToDoInode.type);
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ break;
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ case ActionType_RmSync:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"launch rmsync, source: "+TransferThread::internalStringTostring(currentActionToDoInode.source)+
+ ", destination: "+TransferThread::internalStringTostring(currentActionToDoInode.destination));
+ mkPathQueue.addPath(currentActionToDoInode.destination,currentActionToDoInode.destination,currentActionToDoInode.type);
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ break;
+ #endif
+ case ActionType_MovePath:
+ //then empty (no file), can try remove it
+ if(currentActionToDoInode.size==0 || actionToDoListTransfer.empty())//don't put afterTheTransfer because actionToDoListInode_afterTheTransfer -> already afterTheTransfer
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"launch rmpath: source: "+TransferThread::internalStringTostring(currentActionToDoInode.source)+
+ ", destination: "+TransferThread::internalStringTostring(currentActionToDoInode.destination));
+ mkPathQueue.addPath(currentActionToDoInode.source,currentActionToDoInode.destination,currentActionToDoInode.type);
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ }
+ else //have do the destination, put the remove to after
+ {
+ currentActionToDoInode.size=0;//why just not do .size--?
+ actionToDoListInode_afterTheTransfer.push_back(currentActionToDoInode);
+ actionToDoListInode.erase(actionToDoListInode.cbegin()+int_for_internal_loop);
+ int_for_internal_loop--;
+ actionToDoListInode_count--;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ }
+ break;
+ case ActionType_SyncDate:
+ //then empty (no file), can try remove it
+ if(currentActionToDoInode.size==0 || actionToDoListTransfer.empty())//don't put afterTheTransfer because actionToDoListInode_afterTheTransfer -> already afterTheTransfer
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"launch rmpath: source: "+TransferThread::internalStringTostring(currentActionToDoInode.source)+
+ ", destination: "+TransferThread::internalStringTostring(currentActionToDoInode.destination));
+ mkPathQueue.addPath(currentActionToDoInode.source,currentActionToDoInode.destination,currentActionToDoInode.type);
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ }
+ else //have do the destination, put the remove to after
+ {
+ currentActionToDoInode.size=0;//why just not do .size--?
+ actionToDoListInode_afterTheTransfer.push_back(currentActionToDoInode);
+ actionToDoListInode.erase(actionToDoListInode.cbegin()+int_for_internal_loop);
+ int_for_internal_loop--;
+ actionToDoListInode_count--;
+ if(numberOfInodeOperation>=inodeThreads)
+ return;
+ }
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Wrong type at inode action");
+ return;
+}
+
+#endif
diff --git a/plugins/CopyEngine/Ultracopier-Spec/MkPath.cpp b/plugins/CopyEngine/Ultracopier-Spec/MkPath.cpp
new file mode 100755
index 0000000..3d6729c
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/MkPath.cpp
@@ -0,0 +1,676 @@
+#include "MkPath.h"
+#include "TransferThread.h"
+#include "../../../cpp11addition.h"
+
+#ifdef Q_OS_WIN32
+#include <accctrl.h>
+#include <aclapi.h>
+#endif
+
+#ifdef Q_OS_WIN32
+ #ifndef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+ #endif
+#endif
+
+#ifdef WIDESTRING
+INTERNALTYPEPATH MkPath::text_slash=L"/";
+#else
+INTERNALTYPEPATH MkPath::text_slash="/";
+#endif
+
+MkPath::MkPath() :
+ waitAction(false),
+ stopIt(false),
+ doRightTransfer(false),
+ keepDate(false),
+ mkFullPath(false),
+ doTheDateTransfer(false)
+{
+ setObjectName("MkPath");
+ moveToThread(this);
+ start();
+}
+
+MkPath::~MkPath()
+{
+ stopIt=true;
+ quit();
+ wait();
+}
+
+void MkPath::addPath(const INTERNALTYPEPATH& source, const INTERNALTYPEPATH& destination, const ActionType &actionType)
+{
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ #ifdef WIDESTRING
+ if(destination.find(L"//") != std::wstring::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path destination contains error");
+ if(source.find(L"//") != std::wstring::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path source contains error");
+ #else
+ if(destination.find("//") != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path destination contains error");
+ if(source.find("//") != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path source contains error");
+ #endif
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(source)+
+ ", destination: "+TransferThread::internalStringTostring(destination));
+ if(stopIt)
+ return;
+ emit internalStartAddPath(source,destination,actionType);
+}
+
+void MkPath::skip()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit internalStartSkip();
+}
+
+void MkPath::retry()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ emit internalStartRetry();
+}
+
+void MkPath::run()
+{
+ connect(this,&MkPath::internalStartAddPath, this,&MkPath::internalAddPath,Qt::QueuedConnection);
+ connect(this,&MkPath::internalStartDoThisPath, this,&MkPath::internalDoThisPath,Qt::QueuedConnection);
+ connect(this,&MkPath::internalStartSkip, this,&MkPath::internalSkip,Qt::QueuedConnection);
+ connect(this,&MkPath::internalStartRetry, this,&MkPath::internalRetry,Qt::QueuedConnection);
+ exec();
+}
+
+void MkPath::internalDoThisPath()
+{
+ if(waitAction || pathList.empty())
+ return;
+ const Item &item=pathList.front();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(item.destination.find(TransferThread::stringToInternalString("//")) != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path destination contains error");
+ if(item.source.find(TransferThread::stringToInternalString("//")) != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path source contains error");
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(item.source)+
+ ", destination: "+TransferThread::internalStringTostring(item.destination)+
+ ", move: "+std::to_string(item.actionType));
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(item.actionType==ActionType_RmSync)
+ {
+ if(item.destination.isFile())
+ {
+ QFile removedFile(item.destination.absoluteFilePath());
+ if(!removedFile.remove())
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to remove the inode: "+item.destination+", error: "+removedFile.errorString().toStdString());
+ emit errorOnFolder(item.destination,removedFile.errorString().toStdString());
+ return;
+ }
+ }
+ else if(!rmpath(item.destination.absoluteFilePath()))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to remove the inode: "+item.destination);
+ emit errorOnFolder(item.destination,tr("Unable to remove").toStdString());
+ return;
+ }
+ pathList.removeFirst();
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+ return;
+ }
+ #endif
+ doTheDateTransfer=false;
+ if(keepDate)
+ {
+ const int64_t &sourceLastModified=TransferThread::readFileMDateTime(item.source);
+ if(!TransferThread::exists(item.source))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"the sources not exists: "+TransferThread::internalStringTostring(item.source));
+ doTheDateTransfer=false;
+ }
+ else if(ULTRACOPIER_PLUGIN_MINIMALYEAR_TIMESTAMPS>=sourceLastModified)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"the sources is older to copy the time: "+TransferThread::internalStringTostring(item.source)+
+ ": "+QDateTime::fromMSecsSinceEpoch((uint64_t)ULTRACOPIER_PLUGIN_MINIMALYEAR_TIMESTAMPS*(uint64_t)1000).toString("dd.MM.yyyy hh:mm:ss.zzz").toStdString()+
+ ">="+QDateTime::fromMSecsSinceEpoch((uint64_t)sourceLastModified*(uint64_t)1000).toString("dd.MM.yyyy hh:mm:ss.zzz").toStdString());
+ doTheDateTransfer=false;
+ }
+ else
+ {
+ doTheDateTransfer=readFileDateTime(item.source);
+ /*if(!doTheDateTransfer)
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to get source folder time: "+item.source.absoluteFilePath());
+ emit errorOnFolder(item.source,tr("Unable to get time"));
+ return;
+ }*/
+ }
+ }
+ if(TransferThread::is_dir(item.destination) && item.actionType==ActionType_RealMove)
+ pathList.front().actionType=ActionType_MovePath;
+ if(item.actionType!=ActionType_RealMove)
+ {
+ if(!TransferThread::is_dir(item.destination))
+ {
+ if(mkFullPath)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"TransferThread::mkpath: "+TransferThread::internalStringTostring(item.destination));
+ if(!TransferThread::mkpath(item.destination))
+ {
+ if(!TransferThread::is_dir(item.destination))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: "+
+ TransferThread::internalStringTostring(item.destination)+
+ #ifdef Q_OS_WIN32
+ ", LastError: "+TransferThread::GetLastErrorStdStr()
+ #else
+ ", errno: "+std::to_string(errno)
+ #endif
+ );
+ emit errorOnFolder(item.destination,tr("Unable to create the folder").toStdString());
+ return;
+ }
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"TransferThread::mkdir: "+TransferThread::internalStringTostring(item.destination));
+ if(!TransferThread::mkdir(item.destination))
+ {
+ if(!TransferThread::is_dir(item.destination))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: "+
+ TransferThread::internalStringTostring(item.destination)+
+ #ifdef Q_OS_WIN32
+ ", LastError: "+TransferThread::GetLastErrorStdStr()
+ #else
+ ", errno: "+std::to_string(errno)
+ #endif
+ );
+ emit errorOnFolder(item.destination,tr("Unable to create the folder").toStdString());
+ return;
+ }
+ }
+ }
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"TransferThread::mkpath ignore exists: "+TransferThread::internalStringTostring(item.destination));
+ }
+ else
+ {
+ if(!TransferThread::is_dir(item.source))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The source folder don't exists: "+TransferThread::internalStringTostring(item.source));
+ emit errorOnFolder(item.destination,tr("The source folder don't exists").toStdString());
+ return;
+ }
+ if(!TransferThread::is_dir(item.source))//it's really an error?
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The source is not a folder: "+TransferThread::internalStringTostring(item.source));
+ /*if(stopIt)
+ return;
+ waitAction=true;
+ emit errorOnFolder(item.destination,tr("The source is not a folder"));
+ return;*/
+ }
+ if(stringStartWith(item.destination,(item.source+text_slash)))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"move into it self: "+TransferThread::internalStringTostring(item.destination));
+ int random=rand();
+ INTERNALTYPEPATH tempFolder=FSabsolutePath(item.source)+text_slash+TransferThread::stringToInternalString(std::to_string(random));
+ while(TransferThread::is_dir(tempFolder))
+ {
+ random=rand();
+ tempFolder=FSabsolutePath(item.source)+text_slash+TransferThread::stringToInternalString(std::to_string(random));
+ }
+ if(!TransferThread::rename(item.source,tempFolder))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to temporary rename the folder: "+TransferThread::internalStringTostring(item.destination));
+ emit errorOnFolder(item.destination,tr("Unable to temporary rename the folder").toStdString());
+ return;
+ }
+ /* http://doc.qt.io/qt-5/qdir.html#rename
+ * On most file systems, rename() fails only if oldName does not exist, or if a file with the new name already exists.
+ if(!dir.mkpath(FSabsolutePath(item.destination)))
+ {
+ if(!dir.exists(FSabsolutePath(item.destination)))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: "+item.destination.absoluteFilePath());
+ emit errorOnFolder(item.destination,tr("Unable to create the folder"));
+ return;
+ }
+ }*/
+ if(!TransferThread::rename(tempFolder,item.destination))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to do the final real move the folder: "+TransferThread::internalStringTostring(item.destination));
+ emit errorOnFolder(item.destination,tr("Unable to do the final real move the folder").toStdString());
+ return;
+ }
+ }
+ else
+ {
+ /* http://doc.qt.io/qt-5/qdir.html#rename
+ * On most file systems, rename() fails only if oldName does not exist, or if a file with the new name already exists.
+ if(!dir.mkpath(FSabsolutePath(item.destination)))
+ {
+ if(!dir.exists(FSabsolutePath(item.destination)))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: "+item.destination.absoluteFilePath());
+ emit errorOnFolder(item.destination,tr("Unable to create the folder"));
+ return;
+ }
+ }*/
+ if(!TransferThread::rename(item.source,item.destination)!=0)
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ #ifdef Q_OS_WIN32
+ const std::string &strError=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: from: "+TransferThread::internalStringTostring(item.source)+", soruce exists: "+
+ std::to_string(TransferThread::is_dir(item.source))+", to: "+TransferThread::internalStringTostring(item.destination)
+ +", destination exist: "+std::to_string(TransferThread::is_dir(item.destination))+": "+strError
+ );
+ emit errorOnFolder(item.destination,tr("Unable to move the folder").toStdString()+": "+strError);
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: from: "+TransferThread::internalStringTostring(item.source)+", soruce exists: "+
+ std::to_string(TransferThread::is_dir(item.source))+", to: "+TransferThread::internalStringTostring(item.destination)
+ +", destination exist: "+std::to_string(TransferThread::is_dir(item.destination))+": "+std::to_string(errno)
+ );
+ emit errorOnFolder(item.destination,tr("Unable to move the folder: errno: %1").arg(errno).toStdString());
+ #endif
+ return;
+ }
+ }
+ }
+ if(doTheDateTransfer)
+ if(!writeFileDateTime(item.destination))
+ {
+ if(!TransferThread::exists(item.destination))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to set destination folder time (not exists): "+TransferThread::internalStringTostring(item.destination));
+ else if(!TransferThread::is_dir(item.destination))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to set destination folder time (not a dir): "+TransferThread::internalStringTostring(item.destination));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to set destination folder time: "+TransferThread::internalStringTostring(item.destination));
+ /*if(stopIt)
+ return;
+ waitAction=true;
+
+ emit errorOnFolder(item.source,tr("Unable to set time"));
+ return;*/
+ }
+ if(doRightTransfer && item.actionType!=ActionType_RealMove)
+ {
+ #ifdef Q_OS_UNIX
+ struct stat permissions;
+ if(stat(TransferThread::internalStringTostring(item.source).c_str(), &permissions)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to get the right: "+TransferThread::internalStringTostring(item.destination));
+ else
+ {
+ if(chmod(TransferThread::internalStringTostring(item.destination).c_str(), permissions.st_mode)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to chmod the right: "+TransferThread::internalStringTostring(item.destination));
+ if(chown(TransferThread::internalStringTostring(item.destination).c_str(), permissions.st_uid, permissions.st_gid)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to chown the right: "+TransferThread::internalStringTostring(item.destination));
+ }
+ #else
+ PSECURITY_DESCRIPTOR PSecurityD;
+ PACL dacl;
+
+ HANDLE hFile = CreateFileW(item.source.c_str(), GENERIC_READ ,
+ FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,
+ std::string("CreateFile() failed. Error: INVALID_HANDLE_VALUE ")+TransferThread::internalStringTostring(item.source).c_str()+", GetLastError(): "+std::to_string(GetLastError())
+ );
+ else
+ {
+ DWORD lasterror = GetSecurityInfo(hFile, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
+ NULL, NULL, &dacl, NULL, &PSecurityD);
+ CloseHandle(hFile);
+ if (lasterror != ERROR_SUCCESS)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"GetSecurityInfo() failed. Error"+std::to_string(lasterror));
+ else
+ {
+ hFile = CreateFileW(item.destination.c_str(),READ_CONTROL | WRITE_OWNER | WRITE_DAC | ACCESS_SYSTEM_SECURITY ,
+ 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"CreateFile() failed. Error: INVALID_HANDLE_VALUE");
+ else
+ {
+ lasterror = SetSecurityInfo(hFile, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION , NULL, NULL, dacl, NULL);
+ if (lasterror != ERROR_SUCCESS)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"GetSecurityInfo() failed. Error"+std::to_string(lasterror));
+ }
+ //free(dacl);
+ //free(PSecurityD);
+ CloseHandle(hFile);
+ }
+ }
+ #endif
+ }
+ if(item.actionType==ActionType_MovePath)
+ {
+ if(!rmpath(item.source))
+ {
+ if(stopIt)
+ return;
+ waitAction=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to remove the source folder: "+TransferThread::internalStringTostring(item.destination));
+ emit errorOnFolder(item.source,tr("Unable to remove").toStdString());
+ return;
+ }
+ }
+ pathList.erase(pathList.cbegin());
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+}
+
+void MkPath::internalAddPath(const INTERNALTYPEPATH &source, const INTERNALTYPEPATH &destination, const ActionType &actionType)
+{
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ #ifdef WIDESTRING
+ if(destination.find(L"//") != std::wstring::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path destination contains error");
+ if(source.find(L"//") != std::wstring::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path source contains error");
+ #else
+ if(destination.find("//") != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path destination contains error");
+ if(source.find("//") != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path source contains error");
+ #endif
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(source)+", destination: "+TransferThread::internalStringTostring(destination));
+ Item tempPath;
+ tempPath.source=source;
+ tempPath.destination=destination;
+ tempPath.actionType=actionType;
+ pathList.push_back(tempPath);
+ if(!waitAction)
+ checkIfCanDoTheNext();
+}
+
+void MkPath::checkIfCanDoTheNext()
+{
+ if(!waitAction && !stopIt && pathList.size()>0)
+ emit internalStartDoThisPath();
+}
+
+void MkPath::internalSkip()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ waitAction=false;
+ pathList.erase(pathList.cbegin());
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+}
+
+void MkPath::internalRetry()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ waitAction=false;
+ checkIfCanDoTheNext();
+}
+
+void MkPath::setRightTransfer(const bool doRightTransfer)
+{
+ this->doRightTransfer=doRightTransfer;
+}
+
+void MkPath::setKeepDate(const bool keepDate)
+{
+ this->keepDate=keepDate;
+}
+
+void MkPath::setMkFullPath(const bool mkFullPath)
+{
+ this->mkFullPath=mkFullPath;
+}
+
+bool MkPath::rmpath(const INTERNALTYPEPATH &dir
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ ,const bool &toSync
+ #endif
+ )
+{
+ if(!TransferThread::is_dir(dir))
+ return false;
+ bool allHaveWork=true;
+ #ifdef Q_OS_UNIX
+ std::vector<TransferThread::dirent_uc> list;
+ if(!TransferThread::entryInfoList(dir,list))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"folder list error: "+TransferThread::internalStringTostring(dir)+", errno: "+std::to_string(errno));
+ return false;
+ }
+ for (unsigned int i = 0; i < list.size(); ++i)
+ {
+ TransferThread::dirent_uc fileInfo=list.at(i);
+ if(!fileInfo.isFolder)
+ {
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(toSync)
+ {
+ QFile file(fileInfo.absoluteFilePath());
+ if(!file.remove())
+ {
+ QFile file(fileInfo.absoluteFilePath());
+ if(!file.remove())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to remove a file: "+fileInfo+", due to: "+file.errorString().toStdString());
+ allHaveWork=false;
+ }
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"found a file: "+fileInfo.fileName().toStdString());
+ allHaveWork=false;
+ }
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"found a file: "+TransferThread::internalStringTostring(fileInfo.d_name));
+ allHaveWork=false;
+ #endif
+ }
+ else
+ {
+ //return the fonction for scan the new folder
+ if(!rmpath(FSabsolutePath(dir)+TransferThread::stringToInternalString("/")+fileInfo.d_name+TransferThread::stringToInternalString("/")))
+ allHaveWork=false;
+ }
+ }
+ #else
+ HANDLE hFind = NULL;
+ allHaveWork=true;
+ WIN32_FIND_DATAW fdFile;
+ if((hFind = FindFirstFileW((TransferThread::toFinalPath(dir)+L"\\*").c_str(), &fdFile)) == INVALID_HANDLE_VALUE)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"folder list error: "+TransferThread::internalStringTostring(dir)+", errno: "+std::to_string(errno));
+ return false;
+ }
+
+ if(allHaveWork)
+ do
+ {
+ #ifdef WIDESTRING
+ if(wcscmp(fdFile.cFileName, L".")!=0 && wcscmp(fdFile.cFileName, L"..")!=0)
+ #else
+ if(strcmp(fdFile.cFileName, ".")!=0 && strcmp(fdFile.cFileName, "..")!=0)
+ #endif
+ {
+ if(fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
+ {
+ //return the fonction for scan the new folder
+ #ifdef WIDESTRING
+ if(!rmpath(dir+L'\\'+fdFile.cFileName+L'/'))
+ #else
+ if(!rmpath(dir+'\\'+fdFile.cFileName+'/'))
+ #endif
+ allHaveWork=false;
+ }
+ else
+ {
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(toSync)
+ {
+ QFile file(fileInfo.absoluteFilePath());
+ if(!file.remove())
+ {
+ QFile file(fileInfo.absoluteFilePath());
+ if(!file.remove())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to remove a file: "+fileInfo+", due to: "+file.errorString().toStdString());
+ allHaveWork=false;
+ }
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"found a file: "+fileInfo.fileName().toStdString());
+ allHaveWork=false;
+ }
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"found a file: "+TransferThread::internalStringTostring(fdFile.cFileName));
+ allHaveWork=false;
+ #endif
+ }
+ }
+ }
+ while(FindNextFileW(hFind, &fdFile));
+ FindClose(hFind);
+ #endif
+ if(!allHaveWork)
+ return false;
+ allHaveWork=TransferThread::rmdir(dir);
+ if(!allHaveWork)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to remove the folder: "+TransferThread::internalStringTostring(FSabsolutePath(dir)));
+ return allHaveWork;
+}
+
+//fonction to edit the file date time
+bool MkPath::readFileDateTime(const INTERNALTYPEPATH &source)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"readFileDateTime("+TransferThread::internalStringTostring(source)+")");
+ /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
+ #ifdef Q_OS_UNIX
+ struct stat info;
+ if(stat(TransferThread::internalStringTostring(source).c_str(),&info)!=0)
+ return false;
+ #ifdef Q_OS_MAC
+ time_t ctime=info.st_ctimespec.tv_sec;
+ time_t actime=info.st_atimespec.tv_sec;
+ time_t modtime=info.st_mtimespec.tv_sec;
+ //this function avalaible on unix and mingw
+ butime.actime=actime;
+ butime.modtime=modtime;
+ #else
+ time_t ctime=info.st_ctim.tv_sec;
+ time_t actime=info.st_atim.tv_sec;
+ time_t modtime=info.st_mtim.tv_sec;
+ //this function avalaible on unix and mingw
+ butime.actime=actime;
+ butime.modtime=modtime;
+ #endif
+ Q_UNUSED(ctime);
+ return true;
+ #else
+ #ifdef Q_OS_WIN32
+ HANDLE hFileSouce = CreateFileW(TransferThread::toFinalPath(source).c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY | FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if(hFileSouce == INVALID_HANDLE_VALUE)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"open failed to read: "+TransferThread::internalStringTostring(source)+", error: "+std::to_string(GetLastError()));
+ return false;
+ }
+ FILETIME ftCreate, ftAccess, ftWrite;
+ if(!GetFileTime(hFileSouce, &ftCreate, &ftAccess, &ftWrite))
+ {
+ CloseHandle(hFileSouce);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to get the file time");
+ return false;
+ }
+ this->ftCreate=ftCreate;
+ this->ftAccess=ftAccess;
+ this->ftWrite=ftWrite;
+ CloseHandle(hFileSouce);
+ return true;
+ #else
+ return false;
+ #endif
+ #endif
+ return false;
+}
+
+bool MkPath::writeFileDateTime(const INTERNALTYPEPATH &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"writeFileDateTime("+TransferThread::internalStringTostring(destination)+")");
+ /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
+ #ifdef Q_OS_UNIX
+ #ifdef Q_OS_LINUX
+ return utime(TransferThread::internalStringTostring(destination).c_str(),&butime)==0;
+ #else //mainly for mac
+ return utime(TransferThread::internalStringTostring(destination).c_str(),&butime)==0;
+ #endif
+ #else
+ #ifdef Q_OS_WIN32
+ HANDLE hFileDestination = CreateFileW(TransferThread::toFinalPath(destination).c_str(), GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if(hFileDestination == INVALID_HANDLE_VALUE)
+ {
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ wchar_t filePath[65535];
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"open failed to write: "+QString::fromWCharArray(filePath).toStdString()+", error: "+std::to_string(GetLastError()));
+ #endif
+ return false;
+ }
+ FILETIME ftCreate, ftAccess, ftWrite;
+ ftCreate=this->ftCreate;
+ ftAccess=this->ftAccess;
+ ftWrite=this->ftWrite;
+ if(!SetFileTime(hFileDestination, &ftCreate, &ftAccess, &ftWrite))
+ {
+ CloseHandle(hFileDestination);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the file time");
+ return false;
+ }
+ CloseHandle(hFileDestination);
+ return true;
+ #else
+ return false;
+ #endif
+ #endif
+ return false;
+}
diff --git a/plugins/CopyEngine/Ultracopier/MkPath.h b/plugins/CopyEngine/Ultracopier-Spec/MkPath.h
index 2bbebcc..1b3a674 100644..100755
--- a/plugins/CopyEngine/Ultracopier/MkPath.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/MkPath.h
@@ -7,13 +7,18 @@
#define MKPATH_H
#include <QThread>
-#include <QFileInfo>
#include <string>
#include <QSemaphore>
#include <vector>
#include <QDir>
#include <QDateTime>
+#ifdef WIDESTRING
+#define INTERNALTYPEPATH std::wstring
+#else
+#define INTERNALTYPEPATH std::string
+#endif
+
#include "Environment.h"
#ifdef Q_OS_UNIX
@@ -23,12 +28,7 @@
#include <sys/stat.h>
#else
#ifdef Q_OS_WIN32
- #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- #include <utime.h>
- #include <time.h>
- #include <unistd.h>
- #include <sys/stat.h>
- #endif
+ #include <windows.h>
#endif
#endif
@@ -40,13 +40,14 @@ public:
explicit MkPath();
~MkPath();
/// \brief add path to make
- void addPath(const QFileInfo& source,const QFileInfo& destination,const ActionType &actionType);
+ void addPath(const INTERNALTYPEPATH& source,const INTERNALTYPEPATH& destination,const ActionType &actionType);
void setRightTransfer(const bool doRightTransfer);
void setKeepDate(const bool keepDate);
+ void setMkFullPath(const bool mkFullPath);
signals:
- void errorOnFolder(const QFileInfo &,const std::string &,const ErrorType &errorType=ErrorType_FolderWithRety) const;
+ void errorOnFolder(const INTERNALTYPEPATH &,const std::string &,const ErrorType &errorType=ErrorType_FolderWithRety) const;
void firstFolderFinish();
- void internalStartAddPath(const QFileInfo& source,const QFileInfo& destination, const ActionType &actionType) const;
+ void internalStartAddPath(const INTERNALTYPEPATH& source,const INTERNALTYPEPATH& destination, const ActionType &actionType) const;
void internalStartDoThisPath() const;
void internalStartSkip() const;
void internalStartRetry() const;
@@ -61,42 +62,35 @@ private:
bool waitAction;
bool stopIt;
bool skipIt;
- QDateTime maxTime;
struct Item
{
- QFileInfo source;
- QFileInfo destination;
+ INTERNALTYPEPATH source;
+ INTERNALTYPEPATH destination;
ActionType actionType;
};
- QList<Item> pathList;
+ std::vector<Item> pathList;
void checkIfCanDoTheNext();
- QDir dir;
bool doRightTransfer;
bool keepDate;
+ bool mkFullPath;
bool doTheDateTransfer;
#ifdef Q_OS_UNIX
utimbuf butime;
#else
#ifdef Q_OS_WIN32
- #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- utimbuf butime;
- #else
- uint64_t ftCreateL, ftAccessL, ftWriteL;
- uint64_t ftCreateH, ftAccessH, ftWriteH;
- std::regex regRead;
- #endif
+ FILETIME ftCreate, ftAccess, ftWrite;
#endif
#endif
//fonction to edit the file date time
- bool readFileDateTime(const QFileInfo &source);
- bool writeFileDateTime(const QFileInfo &destination);
- static std::string text_slash;
+ bool readFileDateTime(const INTERNALTYPEPATH &source);
+ bool writeFileDateTime(const INTERNALTYPEPATH &destination);
+ static INTERNALTYPEPATH text_slash;
private slots:
void internalDoThisPath();
- void internalAddPath(const QFileInfo& source, const QFileInfo& destination,const ActionType &actionType);
+ void internalAddPath(const INTERNALTYPEPATH& source, const INTERNALTYPEPATH& destination,const ActionType &actionType);
void internalSkip();
void internalRetry();
- bool rmpath(const QDir &dir
+ bool rmpath(const INTERNALTYPEPATH &dir
#ifdef ULTRACOPIER_PLUGIN_RSYNC
, const bool &toSync=false
#endif
diff --git a/plugins/CopyEngine/Ultracopier-Spec/README.md b/plugins/CopyEngine/Ultracopier-Spec/README.md
new file mode 100755
index 0000000..a15b943
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/README.md
@@ -0,0 +1,3 @@
+# Copy Engine: Ultracopier
+
+This is the default copy engine.
diff --git a/plugins/CopyEngine/Ultracopier/RenamingRules.cpp b/plugins/CopyEngine/Ultracopier-Spec/RenamingRules.cpp
index 4ae23b8..8c0d698 100644..100755
--- a/plugins/CopyEngine/Ultracopier/RenamingRules.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/RenamingRules.cpp
@@ -31,16 +31,23 @@ void RenamingRules::on_buttonBox_clicked(QAbstractButton *button)
void RenamingRules::setRenamingRules(std::string firstRenamingRule,std::string otherRenamingRule)
{
disconnectUI();
+ if(firstRenamingRule.find("%name%")==std::string::npos || firstRenamingRule.find("%suffix%")==std::string::npos)
+ firstRenamingRule.clear();
+ if(otherRenamingRule.find("%name%")==std::string::npos || otherRenamingRule.find("%suffix%")==std::string::npos
+ || otherRenamingRule.find("%number%")==std::string::npos)
+ otherRenamingRule.clear();
+
this->firstRenamingRule=firstRenamingRule;
this->otherRenamingRule=otherRenamingRule;
+
if(!firstRenamingRule.empty())
ui->firstRenamingRule->setText(QString::fromStdString(firstRenamingRule));
else
- ui->firstRenamingRule->setText(tr("%1 - copy").arg(QStringLiteral("%name%")));
+ ui->firstRenamingRule->setText(tr("%1 - copy%2").arg(QStringLiteral("%name%")).arg(QStringLiteral("%suffix%")));
if(!otherRenamingRule.empty())
ui->otherRenamingRule->setText(QString::fromStdString(otherRenamingRule));
else
- ui->otherRenamingRule->setText(tr("%1 - copy (%2)").arg(QStringLiteral("%name%")).arg(QStringLiteral("%number%")));
+ ui->otherRenamingRule->setText(tr("%1 - copy (%2)%3").arg(QStringLiteral("%name%")).arg(QStringLiteral("%number%")).arg(QStringLiteral("%suffix%")));
connectUI();
}
@@ -59,7 +66,9 @@ void RenamingRules::disconnectUI()
void RenamingRules::firstRenamingRule_haveChanged()
{
QString newValue=ui->firstRenamingRule->text();
- if(newValue==tr("%1 - copy").arg(QStringLiteral("%name%")))
+ if(!newValue.contains("%name%") || !newValue.contains("%suffix%"))
+ newValue.clear();
+ if(newValue==tr("%1 - copy%2").arg(QStringLiteral("%name%")).arg(QStringLiteral("%name%")))
newValue=QStringLiteral("");
if(newValue.toStdString()==firstRenamingRule)
return;
@@ -70,7 +79,9 @@ void RenamingRules::firstRenamingRule_haveChanged()
void RenamingRules::otherRenamingRule_haveChanged()
{
QString newValue=ui->otherRenamingRule->text();
- if(newValue==tr("%1 - copy (%2)").arg(QStringLiteral("%name%")).arg(QStringLiteral("%number%")))
+ if(!newValue.contains("%name%") || !newValue.contains("%suffix%") || !newValue.contains("%number%"))
+ newValue.clear();
+ if(newValue==tr("%1 - copy (%2)%3").arg(QStringLiteral("%name%")).arg(QStringLiteral("%number%")).arg(QStringLiteral("%name%")))
newValue=QStringLiteral("");
if(newValue.toStdString()==otherRenamingRule)
return;
diff --git a/plugins/CopyEngine/Ultracopier/RenamingRules.h b/plugins/CopyEngine/Ultracopier-Spec/RenamingRules.h
index b2e9d02..b2e9d02 100644..100755
--- a/plugins/CopyEngine/Ultracopier/RenamingRules.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/RenamingRules.h
diff --git a/plugins/CopyEngine/Ultracopier/RenamingRules.ui b/plugins/CopyEngine/Ultracopier-Spec/RenamingRules.ui
index 0219249..0219249 100644..100755
--- a/plugins/CopyEngine/Ultracopier/RenamingRules.ui
+++ b/plugins/CopyEngine/Ultracopier-Spec/RenamingRules.ui
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp b/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp
new file mode 100755
index 0000000..014585d
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.cpp
@@ -0,0 +1,953 @@
+#include "ScanFileOrFolder.h"
+#include "TransferThread.h"
+#include <QtGlobal>
+#include <regex>
+#include "../../../cpp11addition.h"
+
+#ifdef Q_OS_WIN32
+ #ifndef NOMINMAX
+ #define NOMINMAX
+ #endif
+ #include <windows.h>
+#endif
+
+#ifdef WIDESTRING
+std::wstring ScanFileOrFolder::text_slash=L"/";
+std::wstring ScanFileOrFolder::text_antislash=L"\\";
+std::wstring ScanFileOrFolder::text_dot=L".";
+#else
+std::string ScanFileOrFolder::text_slash="/";
+std::string ScanFileOrFolder::text_antislash="\\";
+std::string ScanFileOrFolder::text_dot=".";
+#endif
+
+ScanFileOrFolder::ScanFileOrFolder(const Ultracopier::CopyMode &mode) :
+ moveTheWholeFolder(false),
+ stopIt(false),
+ stopped(false),
+ folderExistsAction(FolderExistsAction::FolderExists_NotSet),
+ fileErrorAction(FileErrorAction::FileError_NotSet),
+ checkDestinationExists(false),
+ copyListOrder(false),
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ rsync(false),
+ #endif
+ mode(Ultracopier::CopyMode::Copy),
+ reloadTheNewFilters(false),
+ haveFilters(false)
+{
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ rsync = false;
+ #endif
+ moveTheWholeFolder = true;
+ stopped = true;
+ stopIt = false;
+ this->mode = mode;
+ folder_isolation = std::regex("^(.*/)?([^/]+)/$");
+ setObjectName(QStringLiteral("ScanFileOrFolder"));
+ /*#ifdef Q_OS_WIN32
+ QString userName;
+ DWORD size=255;
+ WCHAR * userNameW=new WCHAR[size];
+ if(GetUserNameW(userNameW,&size))
+ {
+ userName=QString::fromWCharArray(userNameW,size-1);
+ blackList.push_back(QFileInfo(QStringLiteral("C:/Users/%1/AppData/Roaming/").arg(userName)));
+ }
+ delete userNameW;
+ #endif*/
+}
+
+ScanFileOrFolder::~ScanFileOrFolder()
+{
+ stop();
+ quit();
+ wait();
+}
+
+bool ScanFileOrFolder::isFinished() const
+{
+ return stopped;
+}
+
+void ScanFileOrFolder::addToList(const std::vector<INTERNALTYPEPATH>& sources,const INTERNALTYPEPATH& destination)
+{
+ stopIt=false;
+ this->sources=parseWildcardSources(sources);
+ this->destination=destination;
+ #ifdef WIDESTRING
+ QFileInfo destinationInfo(QString::fromStdWString(this->destination));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"check symblink: "+destinationInfo.absoluteFilePath().toStdString()+", destination: "+TransferThread::internalStringTostring(destination));
+ #ifdef WIDESTRING
+ while(TransferThread::is_symlink(destinationInfo.absoluteFilePath().toStdWString()))
+ #else
+ while(TransferThread::is_symlink(destinationInfo.absoluteFilePath().toStdString()))
+ #endif
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"resolv destination to: "+destinationInfo.symLinkTarget().toStdString());
+ if(QFileInfo(destinationInfo.symLinkTarget()).isAbsolute())
+ this->destination=destinationInfo.symLinkTarget().toStdWString();
+ else
+ this->destination=destinationInfo.absolutePath().toStdWString()+text_slash+destinationInfo.symLinkTarget().toStdWString();
+ destinationInfo.setFile(QString::fromStdWString(this->destination));
+ }
+ if(sources.size()>1 || QFileInfo(QString::fromStdWString(destination)).isDir())
+ /* Disabled because the separator transformation product bug
+ * if(!destination.endsWith(QDir::separator()))
+ this->destination+=QDir::separator();*/
+ if(!stringEndsWith(destination,'/') && !stringEndsWith(destination,'\\'))
+ this->destination+=text_slash;//put unix separator because it's transformed into that's under windows too
+ #else
+ QFileInfo destinationInfo(QString::fromStdString(this->destination));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"check symblink: "+destinationInfo.absoluteFilePath().toStdString());
+ while(destinationInfo.isSymLink())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"resolv destination to: "+destinationInfo.symLinkTarget().toStdString());
+ if(QFileInfo(destinationInfo.symLinkTarget()).isAbsolute())
+ this->destination=destinationInfo.symLinkTarget().toStdString();
+ else
+ this->destination=destinationInfo.absolutePath().toStdString()+text_slash+destinationInfo.symLinkTarget().toStdString();
+ destinationInfo.setFile(QString::fromStdString(this->destination));
+ }
+ if(sources.size()>1 || QFileInfo(QString::fromStdString(destination)).isDir())
+ /* Disabled because the separator transformation product bug
+ * if(!destination.endsWith(QDir::separator()))
+ this->destination+=QDir::separator();*/
+ if(!stringEndsWith(destination,'/') && !stringEndsWith(destination,'\\'))
+ this->destination+=text_slash;//put unix separator because it's transformed into that's under windows too
+ #endif
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"addToList("+stringimplode(sources,";")+","+this->destination+")");
+}
+
+
+std::vector<INTERNALTYPEPATH> ScanFileOrFolder::parseWildcardSources(const std::vector<INTERNALTYPEPATH> &sources) const
+{
+ std::regex splitFolder("[/\\\\]");
+ std::vector<INTERNALTYPEPATH> returnList;
+ unsigned int index=0;
+ while(index<(unsigned int)sources.size())
+ {
+ std::string sourceAt=TransferThread::internalStringTostring(sources.at(index));
+ if(sourceAt.find("*") != std::string::npos)
+ {
+ std::vector<std::string> toParse=stringregexsplit(sourceAt,splitFolder);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"before wildcard parse: "+sourceAt+", toParse: "+stringimplode(toParse,", "));
+ std::vector<std::vector<std::string> > recomposedSource;
+ {
+ std::vector<std::string> t;
+ t.push_back("");
+ recomposedSource.push_back(t);
+ }
+ while(toParse.size()>0)
+ {
+ if(toParse.front().find("*") != std::string::npos)
+ {
+ std::string toParseFirst=toParse.front();
+ if(toParseFirst.empty())
+ toParseFirst=TransferThread::internalStringTostring(text_slash);
+ std::vector<std::vector<std::string> > newRecomposedSource;
+ stringreplaceAll(toParseFirst,"*","[^/\\\\]*");
+ std::regex toResolv=std::regex(toParseFirst);
+ unsigned int index_recomposedSource=0;
+ while(index_recomposedSource<recomposedSource.size())//parse each url part
+ {
+ std::string fileInfo(stringimplode(recomposedSource.at(index_recomposedSource),TransferThread::internalStringTostring(text_slash)));
+ std::vector<TransferThread::dirent_uc> list;
+
+ if(TransferThread::is_dir(fileInfo.c_str()))
+ {
+ if(TransferThread::entryInfoList(TransferThread::stringToInternalString(fileInfo),list))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list the folder: "+fileInfo+", with the wildcard: "+toParseFirst);
+ unsigned int index_fileList=0;
+ while(index_fileList<list.size())
+ {
+ const std::string &fileName=TransferThread::internalStringTostring(list.at(index_fileList).d_name);
+ if(std::regex_match(fileName,toResolv))
+ {
+ std::vector<std::string> tempList=recomposedSource.at(index_recomposedSource);
+ tempList.push_back(fileName);
+ newRecomposedSource.push_back(tempList);
+ }
+ index_fileList++;
+ }
+ }
+ }
+ index_recomposedSource++;
+ }
+ recomposedSource=newRecomposedSource;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"add toParse: "+stringimplode(toParse,TransferThread::internalStringTostring(text_slash)));
+ unsigned int index_recomposedSource=0;
+ while(index_recomposedSource<recomposedSource.size())
+ {
+ recomposedSource[index_recomposedSource].push_back(toParse.front());
+ if(!QFileInfo(QString::fromStdString(stringimplode(recomposedSource.at(index_recomposedSource),TransferThread::internalStringTostring(text_slash)))).exists())
+ recomposedSource.erase(recomposedSource.cbegin()+index_recomposedSource);
+ else
+ index_recomposedSource++;
+ }
+ }
+ toParse.erase(toParse.cbegin());
+ }
+ unsigned int index_recomposedSource=0;
+ while(index_recomposedSource<recomposedSource.size())
+ {
+ returnList.push_back(TransferThread::stringToInternalString(stringimplode(recomposedSource.at(index_recomposedSource),TransferThread::internalStringTostring(text_slash))));
+ index_recomposedSource++;
+ }
+ }
+ else
+ returnList.push_back(TransferThread::stringToInternalString(sourceAt));
+ index++;
+ }
+ return returnList;
+}
+
+void ScanFileOrFolder::setFilters(const std::vector<Filters_rules> &include, const std::vector<Filters_rules> &exclude)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
+ QMutexLocker lock(&filtersMutex);
+ this->include_send=include;
+ this->exclude_send=exclude;
+ reloadTheNewFilters=true;
+ haveFilters=include_send.size()>0 || exclude_send.size()>0;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"haveFilters: "+std::to_string(haveFilters)+", include_send.size(): "+std::to_string(include_send.size())+", exclude_send.size(): "+std::to_string(exclude_send.size()));
+}
+
+//set action if Folder are same or exists
+void ScanFileOrFolder::setFolderExistsAction(const FolderExistsAction &action, const std::string &newName)
+{
+ this->newName=TransferThread::stringToInternalString(newName);
+ folderExistsAction=action;
+ waitOneAction.release();
+}
+
+//set action if error
+void ScanFileOrFolder::setFolderErrorAction(const FileErrorAction &action)
+{
+ fileErrorAction=action;
+ waitOneAction.release();
+}
+
+void ScanFileOrFolder::stop()
+{
+ stopIt=true;
+ waitOneAction.release();
+}
+
+void ScanFileOrFolder::run()
+{
+ stopped=false;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,
+ "start the listing with destination: "+TransferThread::internalStringTostring(destination)+", mode: "+std::to_string(mode));
+ #ifdef Q_OS_UNIX
+ destination=resolvDestination(destination);
+ #endif
+ #ifdef WIDESTRING
+ stringreplaceAll(destination,L"\\",L"/");
+ #else
+ stringreplaceAll(destination,"\\","/");
+ #endif
+ if(stopIt)
+ {
+ stopped=true;
+ return;
+ }
+ if(fileErrorAction==FileError_Skip)
+ {
+ stopped=true;
+ return;
+ }
+ unsigned int sourceIndex=0;
+ while(sourceIndex<sources.size())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"size source to list: "+std::to_string(sourceIndex)+TransferThread::internalStringTostring(text_slash)+std::to_string(sources.size()));
+ if(stopIt)
+ {
+ stopped=true;
+ return;
+ }
+ INTERNALTYPEPATH source=sources.at(sourceIndex);
+ #ifdef WIDESTRING
+ stringreplaceAll(source,L"\\",L"/");
+ #else
+ stringreplaceAll(source,"\\","/");
+ #endif
+ if(TransferThread::is_dir(source))
+ {
+ /* Bad way; when you copy c:\source\folder into d:\destination, you wait it create the folder d:\destination\folder
+ //listFolder(source.absoluteFilePath()+QDir::separator(),destination);
+ listFolder(source.absoluteFilePath()+text_slash,destination);//put unix separator because it's transformed into that's under windows too
+ */
+ //put unix separator because it's transformed into that's under windows too
+ INTERNALTYPEPATH tempString=destination;
+ if(!stringEndsWith(tempString,text_slash) && !stringEndsWith(tempString,text_antislash))
+ tempString+=text_slash;
+ tempString+=TransferThread::resolvedName(source);
+ if(moveTheWholeFolder && mode==Ultracopier::Move && !QFileInfo(
+ #ifdef WIDESTRING
+ QString::fromStdWString(tempString)
+ #else
+ QString::fromStdString(tempString)
+ #endif
+ ).exists() &&
+ driveManagement.isSameDrive(TransferThread::internalStringTostring(source),TransferThread::internalStringTostring(tempString)))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"tempString: move and not exists: "+TransferThread::internalStringTostring(tempString));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"do real move: "+TransferThread::internalStringTostring(source)+" to "+TransferThread::internalStringTostring(tempString));
+ emit addToRealMove(source,tempString);
+ }
+ else
+ {
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"tempString: "+tempString+" normal listing, blacklist size: "+std::to_string(blackList.size()));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"tempString: "+TransferThread::internalStringTostring(tempString)+" normal listing");
+ if(stringEndsWith(source,'/'))
+ source.erase(source.end()-1);
+ if(stringEndsWith(tempString,'/'))
+ tempString.erase(tempString.end()-1);
+ listFolder(source,tempString);
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(source)+" is file or symblink");
+ if(stringEndsWith(destination,'/') || stringEndsWith(destination,'\\'))
+ emit fileTransfer(source,destination+TransferThread::resolvedName(source),mode);
+ else
+ emit fileTransfer(source,destination+text_slash+TransferThread::resolvedName(source),mode);
+ }
+ sourceIndex++;
+ }
+ stopped=true;
+ if(stopIt)
+ return;
+ emit finishedTheListing();
+}
+
+#ifdef Q_OS_UNIX
+INTERNALTYPEPATH ScanFileOrFolder::resolvDestination(const INTERNALTYPEPATH &destination)
+{
+ INTERNALTYPEPATH temp(destination);
+ char buf[PATH_MAX];
+ ssize_t nbytes=0;
+ nbytes=readlink(TransferThread::internalStringTostring(destination).c_str(), buf, sizeof(buf));
+ while(nbytes!=-1) {
+ temp=FSabsolutePath(temp);
+ if(!stringEndsWith(destination,'/')
+ #ifdef Q_OS_WIN32
+ && !stringEndsWith(destination,'\\')
+ #endif
+ )
+ temp+=TransferThread::stringToInternalString("/");
+ temp+=TransferThread::stringToInternalString(std::string(buf,nbytes));
+ /// \todo change for pure c++ code
+ #ifdef WIDESTRING
+ temp=QFileInfo(QString::fromStdWString(temp)).absoluteFilePath().toStdWString();
+ #else
+ temp=QFileInfo(QString::fromStdString(temp)).absoluteFilePath().toStdString();
+ #endif
+ nbytes=readlink(TransferThread::internalStringTostring(temp).c_str(), buf, sizeof(buf));
+ }
+ return temp;
+ /*do
+ {
+ fileErrorAction=FileError_NotSet;
+ if(isBlackListed(destination))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"isBlackListed: "+destination);
+ emit errorOnFolder(destination,tr("Blacklisted folder").toStdString(),ErrorType_Folder);
+ waitOneAction.acquire();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionNum: "+std::to_string(fileErrorAction));
+ }
+ } while(fileErrorAction==FileError_Retry || fileErrorAction==FileError_PutToEndOfTheList);
+ return newDestination;*/
+}
+#endif
+
+/*bool ScanFileOrFolder::isBlackListed(const QFileInfo &destination)
+{
+ int index=0;
+ int size=blackList.size();
+ while(index<size)
+ {
+ if(stringStartWith(destination,blackList.at(index)))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,destination+" start with: "+blackList.at(index));
+ return true;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,destination+" not start with: "+blackList.at(index));
+ index++;
+ }
+ return false;
+}*/
+
+void ScanFileOrFolder::listFolder(INTERNALTYPEPATH source,INTERNALTYPEPATH destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(source)+
+ ", destination: "+TransferThread::internalStringTostring(destination)
+ );
+ if(stopIt)
+ return;
+ #ifdef Q_OS_UNIX
+ destination=resolvDestination(destination);
+ #endif
+ if(stopIt)
+ return;
+ if(fileErrorAction==FileError_Skip)
+ return;
+ //if is same
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ #ifdef WIDESTRING
+ if(destination.find(L"//") != std::wstring::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path destination contains error");
+ if(source.find(L"//") != std::wstring::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path source contains error");
+ #else
+ if(destination.find("//") != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path destination contains error");
+ if(source.find("//") != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path source contains error");
+ #endif
+ #endif
+ if(source==destination)
+ {
+ emit folderAlreadyExists(source,destination,true);
+ waitOneAction.acquire();
+ INTERNALTYPEPATH destinationSuffixPath;
+ switch(folderExistsAction)
+ {
+ case FolderExists_Merge:
+ break;
+ case FolderExists_Skip:
+ return;
+ break;
+ case FolderExists_Rename:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination before rename: "+TransferThread::internalStringTostring(destination));
+ if(newName.empty())
+ {
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"pattern: "+folder_isolation.str());
+ //resolv the new name
+ destinationSuffixPath=TransferThread::resolvedName(destination);
+ int num=1;
+ do
+ {
+ if(num==1)
+ {
+ if(firstRenamingRule.empty())
+ #ifdef WIDESTRING
+ destinationSuffixPath=tr("%1 - copy").arg(QString::fromStdWString(TransferThread::resolvedName(destination))).toStdWString();
+ #else
+ destinationSuffixPath=tr("%1 - copy").arg(QString::fromStdString(TransferThread::resolvedName(destination))).toStdString();
+ #endif
+ else
+ destinationSuffixPath=TransferThread::stringToInternalString(firstRenamingRule);
+ }
+ else
+ {
+ if(otherRenamingRule.empty())
+ #ifdef WIDESTRING
+ destinationSuffixPath=tr("%1 - copy (%2)").arg(QString::fromStdWString(TransferThread::resolvedName(destination))).arg(num).toStdWString();
+ #else
+ destinationSuffixPath=tr("%1 - copy (%2)").arg(QString::fromStdString(TransferThread::resolvedName(destination))).arg(num).toStdString();
+ #endif
+ else
+ {
+ destinationSuffixPath=TransferThread::stringToInternalString(otherRenamingRule);
+ #ifdef WIDESTRING
+ stringreplaceAll(destinationSuffixPath,L"%number%",std::to_wstring(num));
+ #else
+ stringreplaceAll(destinationSuffixPath,"%number%",std::to_string(num));
+ #endif
+ }
+ }
+ #ifdef WIDESTRING
+ stringreplaceAll(destinationSuffixPath,L"%name%",TransferThread::resolvedName(destination));
+ #else
+ stringreplaceAll(destinationSuffixPath,"%name%",TransferThread::resolvedName(destination));
+ #endif
+ num++;
+ {
+ std::string::size_type n=destination.rfind('/');
+ if(n == std::string::npos)
+ n=destination.rfind('.');
+ else
+ n=destination.rfind(n,'.');
+ if(n == std::string::npos)
+ {
+ destination=FSabsolutePath(destination);
+ if(!stringEndsWith(destination,'/')
+ #ifdef Q_OS_WIN32
+ && !stringEndsWith(destination,'\\')
+ #endif
+ )
+ destination+=text_slash;
+ destination+=destinationSuffixPath;
+ }
+ else
+ {
+ destination=FSabsolutePath(destination);
+ if(!stringEndsWith(destination,'/')
+ #ifdef Q_OS_WIN32
+ && !stringEndsWith(destination,'\\')
+ #endif
+ )
+ destination+=text_slash;
+ destination+=destinationSuffixPath+TransferThread::stringToInternalString(".")+destination.substr(n);
+ }
+ }
+ }
+ while(TransferThread::exists(destination));
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"use new name: "+TransferThread::internalStringTostring(newName));
+ destinationSuffixPath = newName;
+ }
+ destination=FSabsolutePath(destination);
+ if(!stringEndsWith(destination,'/')
+ #ifdef Q_OS_WIN32
+ && !stringEndsWith(destination,'\\')
+ #endif
+ )
+ destination+=text_slash;
+ destination+=destinationSuffixPath;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination after rename: "+TransferThread::internalStringTostring(destination));
+ break;
+ default:
+ return;
+ break;
+ }
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ #ifdef WIDESTRING
+ if(destination.find(L"//") != std::wstring::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path destination contains error");
+ if(source.find(L"//") != std::wstring::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path source contains error");
+ #else
+ if(destination.find("//") != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path destination contains error");
+ if(source.find("//") != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path source contains error");
+ #endif
+ #endif
+ //check if destination exists
+ if(checkDestinationExists)
+ {
+ if(TransferThread::exists(destination))
+ {
+ emit folderAlreadyExists(source,destination,false);
+ waitOneAction.acquire();
+ INTERNALTYPEPATH destinationSuffixPath;
+ switch(folderExistsAction)
+ {
+ case FolderExists_Merge:
+ break;
+ case FolderExists_Skip:
+ return;
+ break;
+ case FolderExists_Rename:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination before rename: "+TransferThread::internalStringTostring(destination));
+ if(newName.empty())
+ {
+ //resolv the new name
+ int num=1;
+ INTERNALTYPEPATH tempdestination;
+ do
+ {
+ if(num==1)
+ {
+ if(firstRenamingRule.empty())
+ #ifdef WIDESTRING
+ destinationSuffixPath=tr("%name% - copy").toStdWString();
+ #else
+ destinationSuffixPath=tr("%name% - copy").toStdString();
+ #endif
+ else
+ destinationSuffixPath=TransferThread::stringToInternalString(firstRenamingRule);
+ }
+ else
+ {
+ if(otherRenamingRule.empty())
+ #ifdef WIDESTRING
+ destinationSuffixPath=tr("%name% - copy (%number%)").toStdWString();
+ #else
+ destinationSuffixPath=tr("%name% - copy (%number%)").toStdString();
+ #endif
+ else
+ destinationSuffixPath=TransferThread::stringToInternalString(otherRenamingRule);
+ #ifdef WIDESTRING
+ stringreplaceAll(destinationSuffixPath,L"%number%",std::to_wstring(num));
+ #else
+ stringreplaceAll(destinationSuffixPath,"%number%",std::to_string(num));
+ #endif
+ }
+ #ifdef WIDESTRING
+ stringreplaceAll(destinationSuffixPath,L"%name%",TransferThread::resolvedName(destination));
+ #else
+ stringreplaceAll(destinationSuffixPath,"%name%",TransferThread::resolvedName(destination));
+ #endif
+ tempdestination=FSabsolutePath(destination);
+ if(!stringEndsWith(destination,'/')
+ #ifdef Q_OS_WIN32
+ && !stringEndsWith(destination,'\\')
+ #endif
+ )
+ tempdestination+=text_slash;
+ tempdestination+=destinationSuffixPath;
+ num++;
+ }
+ while(TransferThread::exists(tempdestination));
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"use new name: "+TransferThread::internalStringTostring(newName));
+ destinationSuffixPath = newName;
+ }
+ {
+ std::string::size_type n=destination.rfind('/');
+ if(n == std::string::npos)
+ n=destination.rfind('.');
+ else
+ n=destination.rfind(n,'.');
+ if(n == std::string::npos)
+ {
+ destination=FSabsolutePath(destination);
+ if(!stringEndsWith(destination,'/')
+ #ifdef Q_OS_WIN32
+ && !stringEndsWith(destination,'\\')
+ #endif
+ )
+ destination+=text_slash;
+ destination+=destinationSuffixPath;
+ }
+ else
+ {
+ destination=FSabsolutePath(destination);
+ if(!stringEndsWith(destination,'/')
+ #ifdef Q_OS_WIN32
+ && !stringEndsWith(destination,'\\')
+ #endif
+ )
+ destination+=text_slash;
+ destination+=destinationSuffixPath+
+ TransferThread::stringToInternalString(".")+destination.substr(n);
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination after rename: "+TransferThread::internalStringTostring(destination));
+ break;
+ default:
+ return;
+ break;
+ }
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"checkDestinationExists but stat failed");
+ }
+ if(stopIt)
+ return;
+ std::vector<TransferThread::dirent_uc> entryList;
+ do
+ {
+ fileErrorAction=FileError_NotSet;
+ if(!TransferThread::entryInfoList(source,entryList))
+ {
+ #ifdef Q_OS_UNIX
+ int saveerrno=errno;
+ const std::string &errorStr=strerror(saveerrno);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Problem with the folder "+TransferThread::internalStringTostring(source)+" to read: "+std::to_string(saveerrno));
+ emit errorOnFolder(source,tr("Problem with folder read").toStdString()+": "+errorStr);
+ #else
+ const std::string &errorStr=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Problem with the folder "+TransferThread::internalStringTostring(source)+" to read: "+errorStr);
+ emit errorOnFolder(source,tr("Problem with folder read").toStdString()+": "+errorStr);
+ #endif
+ waitOneAction.acquire();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionNum: "+std::to_string(fileErrorAction));
+ }
+ } while(fileErrorAction==FileError_Retry);
+
+ if(copyListOrder)
+ std::sort(entryList.begin(), entryList.end(), [](TransferThread::dirent_uc a, TransferThread::dirent_uc b) {
+ return a.d_name<b.d_name;
+ });
+ if(stopIt)
+ return;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ #ifdef WIDESTRING
+ if(destination.find(L"//") != std::wstring::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path destination contains error");
+ if(source.find(L"//") != std::wstring::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path source contains error");
+ #else
+ if(destination.find("//") != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path destination contains error");
+ if(source.find("//") != std::string::npos)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"path source contains error");
+ #endif
+ #endif
+ const unsigned int sizeEntryList=entryList.size();
+ emit newFolderListing(TransferThread::internalStringTostring(source));
+ if(mode!=Ultracopier::Move)
+ emit addToMkPath(source,destination,sizeEntryList);
+ for(unsigned int index=0;index<sizeEntryList;++index)
+ {
+ const TransferThread::dirent_uc &fileInfo=entryList.at(index);
+ if(stopIt)
+ return;
+ if(haveFilters)
+ {
+ if(reloadTheNewFilters)
+ {
+ QMutexLocker lock(&filtersMutex);
+ QCoreApplication::processEvents(QEventLoop::AllEvents);
+ reloadTheNewFilters=false;
+ this->include=this->include_send;
+ this->exclude=this->exclude_send;
+ }
+ const INTERNALTYPEPATH &fileName=fileInfo.d_name;
+ if(fileInfo.isFolder)
+ {
+ bool excluded=false,included=(include.size()==0);
+ unsigned int filters_index=0;
+ while(filters_index<exclude.size())
+ {
+ if(exclude.at(filters_index).apply_on==ApplyOn_folder || exclude.at(filters_index).apply_on==ApplyOn_fileAndFolder)
+ {
+ if(std::regex_match(TransferThread::internalStringTostring(fileName),exclude.at(filters_index).regex))
+ {
+ excluded=true;
+ break;
+ }
+ }
+ filters_index++;
+ }
+ if(excluded)
+ {}
+ else
+ {
+ filters_index=0;
+ while(filters_index<include.size())
+ {
+ if(include.at(filters_index).apply_on==ApplyOn_folder || include.at(filters_index).apply_on==ApplyOn_fileAndFolder)
+ {
+ if(std::regex_match(TransferThread::internalStringTostring(fileName),include.at(filters_index).regex))
+ {
+ included=true;
+ break;
+ }
+ }
+ filters_index++;
+ }
+ if(!included)
+ {}
+ else
+ {
+ INTERNALTYPEPATH fullSource=source;
+ if(!stringEndsWith(fullSource,'/'))
+ fullSource+='/';
+ fullSource+=fileName;
+ INTERNALTYPEPATH fullDestination=destination;
+ if(!stringEndsWith(fullDestination,'/'))
+ fullDestination+='/';
+ fullDestination+=fileName;
+ listFolder(fullSource,fullDestination);
+ }
+ }
+ }
+ else
+ {
+ bool excluded=false,included=(include.size()==0);
+ unsigned int filters_index=0;
+ while(filters_index<exclude.size())
+ {
+ if(exclude.at(filters_index).apply_on==ApplyOn_file || exclude.at(filters_index).apply_on==ApplyOn_fileAndFolder)
+ {
+ if(std::regex_match(TransferThread::internalStringTostring(fileName),exclude.at(filters_index).regex))
+ {
+ excluded=true;
+ break;
+ }
+ }
+ filters_index++;
+ }
+ if(excluded)
+ {}
+ else
+ {
+ filters_index=0;
+ while(filters_index<include.size())
+ {
+ if(include.at(filters_index).apply_on==ApplyOn_file || include.at(filters_index).apply_on==ApplyOn_fileAndFolder)
+ {
+ if(std::regex_match(TransferThread::internalStringTostring(fileName),include.at(filters_index).regex))
+ {
+ included=true;
+ break;
+ }
+ }
+ filters_index++;
+ }
+ if(!included)
+ {}
+ else
+ {
+ INTERNALTYPEPATH fullSource=source;
+ if(!stringEndsWith(fullSource,'/'))
+ fullSource+='/';
+ fullSource+=fileName;
+ #ifndef ULTRACOPIER_PLUGIN_RSYNC
+ #ifdef Q_OS_WIN32
+ emit fileTransferWithInode(fullSource,destination+TransferThread::stringToInternalString("/")+fileName,mode,fileInfo);
+ #else
+ emit fileTransfer(fullSource,destination+TransferThread::stringToInternalString("/")+fileName,mode);
+ #endif
+ #else
+ {
+ bool sendToTransfer=false;
+ if(!rsync)
+ sendToTransfer=true;
+ else if(!QFile::exists(destination.absoluteFilePath()+"/"+fileInfo.fileName()))
+ sendToTransfer=true;
+ else if(fileInfo.lastModified()!=QFileInfo(destination.absoluteFilePath()+"/"+fileInfo.fileName()).lastModified())
+ sendToTransfer=true;
+ if(sendToTransfer)
+ #ifdef Q_OS_WIN32
+ emit fileTransferWithInode(fileInfo.absoluteFilePath(),destination.absoluteFilePath()+"/"+fileInfo.fileName(),mode,fileInfo);
+ #else
+ emit fileTransfer(fileInfo.absoluteFilePath(),destination.absoluteFilePath()+"/"+fileInfo.fileName(),mode);
+ #endif
+ }
+ #endif
+ }
+ }
+ }
+ }
+ else
+ {
+ const INTERNALTYPEPATH fileName(fileInfo.d_name);
+ if(fileInfo.isFolder)//possible wait time here
+ {
+ //listFolder(source,destination,suffixPath+fileInfo.fileName()+QDir::separator());
+ INTERNALTYPEPATH fullSource=source;
+ if(!stringEndsWith(fullSource,'/'))
+ fullSource+='/';
+ fullSource+=fileName;
+ INTERNALTYPEPATH fullDestination=destination;
+ if(!stringEndsWith(fullDestination,'/'))
+ fullDestination+='/';
+ fullDestination+=fileName;
+ listFolder(fullSource,fullDestination);
+ }
+ else
+ {
+ INTERNALTYPEPATH fullSource=source;
+ if(!stringEndsWith(fullSource,'/'))
+ fullSource+='/';
+ fullSource+=fileName;
+ #ifndef ULTRACOPIER_PLUGIN_RSYNC
+ #ifdef Q_OS_WIN32
+ emit fileTransferWithInode(fullSource,destination+TransferThread::stringToInternalString("/")+fileName,mode,fileInfo);
+ #else
+ emit fileTransfer(fullSource,destination+TransferThread::stringToInternalString("/")+fileName,mode);
+ #endif
+ #else
+ {
+ bool sendToTransfer=false;
+ if(!rsync)
+ sendToTransfer=true;
+ else if(!QFile::exists(destination.absoluteFilePath()+"/"+fileInfo.fileName()))
+ sendToTransfer=true;
+ else if(fileInfo.lastModified()!=QFileInfo(destination.absoluteFilePath()+"/"+fileInfo.fileName()).lastModified())
+ sendToTransfer=true;
+ if(sendToTransfer)
+ #ifdef Q_OS_WIN32
+ emit fileTransferWithInode(fileInfo.absoluteFilePath(),destination.absoluteFilePath()+"/"+fileInfo.fileName(),mode,fileInfo);
+ #else
+ emit fileTransfer(fileInfo.absoluteFilePath(),destination.absoluteFilePath()+"/"+fileInfo.fileName(),mode);
+ #endif
+ }
+ #endif
+ }
+ }
+ }
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ if(rsync)
+ {
+ //check the reverse path here
+ QFileInfoList entryListDestination;
+ if(copyListOrder)
+ entryListDestination=QDir(destination.absoluteFilePath()).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System,QDir::DirsFirst|QDir::Name|QDir::IgnoreCase);//possible wait time here
+ else
+ entryListDestination=QDir(destination.absoluteFilePath()).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System);//possible wait time here
+ int sizeEntryListDestination=entryListDestination.size();
+ int index=0;
+ for (int indexDestination=0;indexDestination<sizeEntryListDestination;++indexDestination)
+ {
+ index=0;
+ while(index<sizeEntryList)
+ {
+ if(entryListDestination.at(indexDestination).fileName()==entryList.at(index).fileName())
+ break;
+ index++;
+ }
+ if(index==sizeEntryList)
+ {
+ //then not found, need be remove
+ emit addToRmForRsync(entryListDestination.at(indexDestination));
+ }
+ }
+ return;
+ }
+ #endif
+ if(mode==Ultracopier::Move)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(source)+", sizeEntryList: "+std::to_string(sizeEntryList));
+ emit addToMovePath(source,destination,sizeEntryList);
+ }
+ else// if(keepDate or keep permition, perfer alwasy send it)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+TransferThread::internalStringTostring(source)+", sizeEntryList: "+std::to_string(sizeEntryList));
+ emit addToKeepAttributePath(source,destination,sizeEntryList);
+ }
+}
+
+//set if need check if the destination exists
+void ScanFileOrFolder::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+{
+ this->checkDestinationExists=checkDestinationFolderExists;
+}
+
+void ScanFileOrFolder::setRenamingRules(const std::string &firstRenamingRule, const std::string &otherRenamingRule)
+{
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+}
+
+void ScanFileOrFolder::setMoveTheWholeFolder(const bool &moveTheWholeFolder)
+{
+ this->moveTheWholeFolder=moveTheWholeFolder;
+}
+
+void ScanFileOrFolder::setFollowTheStrictOrder(const bool &order)
+{
+ this->copyListOrder=order;
+}
+
+#ifdef ULTRACOPIER_PLUGIN_RSYNC
+/// \brief set rsync
+void ScanFileOrFolder::setRsync(const bool rsync)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"set rsync: "+std::to_string(rsync));
+ this->rsync=rsync;
+}
+#endif
+
+void ScanFileOrFolder::set_updateMount()
+{
+ driveManagement.tryUpdate();
+}
diff --git a/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.h b/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.h
index 0c625e9..f74d355 100644..100755
--- a/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/ScanFileOrFolder.h
@@ -16,10 +16,17 @@
#include "Environment.h"
#include "DriveManagement.h"
+#include "TransferThread.h"
#ifndef SCANFILEORFOLDER_H
#define SCANFILEORFOLDER_H
+#ifdef WIDESTRING
+#define INTERNALTYPEPATH std::wstring
+#else
+#define INTERNALTYPEPATH std::string
+#endif
+
/// \brief Thread changed to list recursively the folder
class ScanFileOrFolder : public QThread
{
@@ -32,7 +39,7 @@ public:
/// \brief to get if is finished
bool isFinished() const;
/// \brief set action if Folder are same or exists
- void setFolderExistsAction(const FolderExistsAction &action, const std::string &newName="");
+ void setFolderExistsAction(const FolderExistsAction &action, const std::string &newName=std::string());
/// \brief set action if error
void setFolderErrorAction(const FileErrorAction &action);
/// \brief set if need check if the destination exists
@@ -43,42 +50,45 @@ public:
void setRsync(const bool rsync);
#endif
signals:
- void fileTransfer(const QFileInfo &source,const QFileInfo &destination,const Ultracopier::CopyMode &mode) const;
+ void fileTransfer(const INTERNALTYPEPATH &source,const INTERNALTYPEPATH &destination,const Ultracopier::CopyMode &mode) const;
+ void fileTransferWithInode(const INTERNALTYPEPATH &source,const INTERNALTYPEPATH &destination,const Ultracopier::CopyMode &mode,const TransferThread::dirent_uc &inode) const;
/// \brief To debug source
void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
- void folderAlreadyExists(const QFileInfo &source,const QFileInfo &destination,const bool &isSame) const;
- void errorOnFolder(const QFileInfo &fileInfo,const std::string &errorString,const ErrorType &errorType=ErrorType_FolderWithRety) const;
+ void folderAlreadyExists(const INTERNALTYPEPATH &source,const INTERNALTYPEPATH &destination,const bool &isSame) const;
+ void errorOnFolder(const INTERNALTYPEPATH &fileInfo,const std::string &errorString,const ErrorType &errorType=ErrorType_FolderWithRety) const;
void finishedTheListing() const;
void newFolderListing(const std::string &path) const;
- void addToMkPath(const QFileInfo& source,const QFileInfo& destination, const int& inode) const;
- void addToMovePath(const QFileInfo& source,const QFileInfo& destination, const int& inodeToRemove) const;
- void addToRealMove(const QFileInfo& source,const QFileInfo& destination) const;
+ void addToMkPath(const INTERNALTYPEPATH& source,const INTERNALTYPEPATH& destination, const int& inode) const;
+ void addToMovePath(const INTERNALTYPEPATH& source,const INTERNALTYPEPATH& destination, const int& inodeToRemove) const;
+ void addToKeepAttributePath(const INTERNALTYPEPATH& source,const INTERNALTYPEPATH& destination, const int& inodeToRemove) const;
+ void addToRealMove(const INTERNALTYPEPATH& source,const INTERNALTYPEPATH& destination) const;
#ifdef ULTRACOPIER_PLUGIN_RSYNC
- void addToRmForRsync(const QFileInfo& destination) const;
+ void addToRmForRsync(const INTERNALTYPEPATH& destination) const;
#endif
public slots:
- void addToList(const std::vector<std::string>& sources,const std::string& destination);
+ void addToList(const std::vector<INTERNALTYPEPATH>& sources,const INTERNALTYPEPATH& destination);
void setFilters(const std::vector<Filters_rules> &include,const std::vector<Filters_rules> &exclude);
- void setCopyListOrder(const bool &order);
+ void setFollowTheStrictOrder(const bool &order);
void set_updateMount();
protected:
void run();
private:
DriveManagement driveManagement;
bool moveTheWholeFolder;
- std::vector<std::string> sources;
- std::string destination;
+ std::vector<INTERNALTYPEPATH> sources;
+ INTERNALTYPEPATH destination;
volatile bool stopIt;
- void listFolder(QFileInfo source, QFileInfo destination);
- bool isBlackListed(const QFileInfo &destination);
- QFileInfo resolvDestination(const QFileInfo &destination);
+ void listFolder(INTERNALTYPEPATH source, INTERNALTYPEPATH destination);
+ #ifdef Q_OS_UNIX
+ INTERNALTYPEPATH resolvDestination(const INTERNALTYPEPATH &destination);
+ #endif
volatile bool stopped;
QSemaphore waitOneAction;
FolderExistsAction folderExistsAction;
FileErrorAction fileErrorAction;
volatile bool checkDestinationExists;
- std::string newName;
+ INTERNALTYPEPATH newName;
bool copyListOrder;
std::regex folder_isolation;
#ifdef ULTRACOPIER_PLUGIN_RSYNC
@@ -92,17 +102,17 @@ private:
QMutex filtersMutex;
std::string firstRenamingRule;
std::string otherRenamingRule;
- std::vector<std::string> blackList;
+ //std::vector<std::string> blackList;
/** Parse the multiple wildcard source, it allow resolv multiple wildcard with Qt into their path
* The string: /toto/f*a/yy*a/toto.mp3
* Will give: /toto/f1a/yy*a/toto.mp3, /toto/f2a/yy*a/toto.mp3
* Will give: /toto/f2a/yy1a/toto.mp3, /toto/f2a/yy2a/toto.mp3
*/
- std::vector<std::string> parseWildcardSources(const std::vector<std::string> &sources) const;
+ std::vector<INTERNALTYPEPATH> parseWildcardSources(const std::vector<INTERNALTYPEPATH> &sources) const;
- static std::string text_slash;
- static std::string text_antislash;
- static std::string text_dot;
+ static INTERNALTYPEPATH text_slash;
+ static INTERNALTYPEPATH text_antislash;
+ static INTERNALTYPEPATH text_dot;
};
#endif // SCANFILEORFOLDER_H
diff --git a/plugins/CopyEngine/Ultracopier/StructEnumDefinition.h b/plugins/CopyEngine/Ultracopier-Spec/StructEnumDefinition.h
index c1758f4..c1758f4 100644..100755
--- a/plugins/CopyEngine/Ultracopier/StructEnumDefinition.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/StructEnumDefinition.h
diff --git a/plugins/CopyEngine/Ultracopier/StructEnumDefinition_CopyEngine.h b/plugins/CopyEngine/Ultracopier-Spec/StructEnumDefinition_CopyEngine.h
index 036803c..5898e5a 100644..100755
--- a/plugins/CopyEngine/Ultracopier/StructEnumDefinition_CopyEngine.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/StructEnumDefinition_CopyEngine.h
@@ -16,10 +16,12 @@ enum FileExistsAction
FileExists_Cancel=1,
FileExists_Skip=2,
FileExists_Overwrite=3,
- FileExists_OverwriteIfNotSame=4,
+ FileExists_OverwriteIfNotSameMdate=4,
FileExists_OverwriteIfNewer=5,
FileExists_OverwriteIfOlder=6,
- FileExists_Rename=7
+ FileExists_OverwriteIfNotSameSize=7,
+ FileExists_OverwriteIfNotSameSizeAndDate=8,
+ FileExists_Rename=9
};
/// \brief Define action if file error
@@ -32,13 +34,6 @@ enum FileErrorAction
FileError_PutToEndOfTheList=5
};
-enum TransferAlgorithm
-{
- TransferAlgorithm_Automatic=0,
- TransferAlgorithm_Sequential=1,
- TransferAlgorithm_Parallel=2
-};
-
/// \brief to have the transfer status
enum TransferStat
{
@@ -46,7 +41,6 @@ enum TransferStat
TransferStat_PreOperation=1,
TransferStat_WaitForTheTransfer=2,
TransferStat_Transfer=3,
- TransferStat_Checksum=4,
TransferStat_PostTransfer=5,
TransferStat_PostOperation=6
};
@@ -107,11 +101,11 @@ enum ActionType
{
ActionType_MkPath=1,
ActionType_MovePath=2,
- ActionType_RealMove=3
+ ActionType_RealMove=3,
#ifdef ULTRACOPIER_PLUGIN_RSYNC
- ,
- ActionType_RmSync=4
+ ActionType_RmSync=4,
#endif
+ ActionType_SyncDate=5
};
struct Diskspace
diff --git a/plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp b/plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp
new file mode 100755
index 0000000..9cbad5a
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/TransferThread.cpp
@@ -0,0 +1,1547 @@
+//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"
+#include <string>
+#include <dirent.h>
+#include <limits.h>
+#ifdef WIDESTRING
+#include <locale>
+//#include <codecvt>
+#endif
+
+#ifdef Q_OS_WIN32
+#include <accctrl.h>
+#include <aclapi.h>
+#endif
+
+#include "../../../cpp11addition.h"
+
+TransferThread::TransferThread() :
+ mode(Ultracopier::CopyMode::Copy),
+ transfer_stat (TransferStat_Idle),
+ doRightTransfer (false),
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ rsync (false),
+ #endif
+ keepDate (false),
+ mkFullPath (false),
+ stopIt (false),
+ fileExistsAction (FileExists_NotSet),
+ alwaysDoFileExistsAction (FileExists_NotSet),
+ needSkip (false),
+ needRemove (false),
+ deletePartiallyTransferredFiles (true),
+ renameTheOriginalDestination (false),
+ writeError (false),
+ readError (false),
+ havePermission (false),
+ haveTransferTime (false)
+{
+ id=0;
+ renameRegex=std::regex("^(.*)(\\.[a-zA-Z0-9]+)$");
+ #ifdef Q_OS_WIN32
+ regRead=std::regex("^[a-zA-Z]:");
+ #endif
+ transferSize = 0;//external set by ListThread
+
+ #ifndef Q_OS_UNIX
+ PSecurityD=NULL;
+ dacl=NULL;
+ #endif
+ #ifdef Q_OS_Win32
+ stopItWin=0;
+ #endif
+ //if not QThread
+ run();
+}
+
+TransferThread::~TransferThread()
+{
+ #ifdef Q_OS_WIN32
+ stopItWin=1;
+ #endif
+ stopIt=true;
+ //else cash without this disconnect
+ //disconnect(&readThread);
+ //disconnect(&writeThread);
+ #ifndef Q_OS_UNIX
+ if(PSecurityD!=NULL)
+ {
+ free(PSecurityD);
+ PSecurityD=NULL;
+ }
+ if(dacl!=NULL)
+ {
+ //free(dacl);
+ dacl=NULL;
+ }
+ #endif
+}
+
+void TransferThread::run()
+{
+ moveToThread(this);
+
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+QStringLiteral("] start: ")+QString::number((qint64)QThread::currentThreadId())));
+ transfer_stat = TransferStat_Idle;
+ stopIt = false;
+ fileExistsAction = FileExists_NotSet;
+ alwaysDoFileExistsAction= FileExists_NotSet;
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(!connect(&driveManagement,&DriveManagement::debugInformation,this, &TransferThread::debugInformation, Qt::QueuedConnection))
+ abort();
+ #endif
+}
+
+TransferStat TransferThread::getStat() const
+{
+ return transfer_stat;
+}
+
+#ifdef WIDESTRING
+INTERNALTYPEPATH TransferThread::stringToInternalString(const std::string& utf8)
+{
+ /* buggy on MXE
+ std::wstring_convert<std::codecvt_utf8_utf16<wchar_t>> converter;
+ return converter.from_bytes(utf8);*/
+ return QString::fromUtf8(utf8.data(),utf8.size()).toStdWString();
+ //return widen(utf8);
+}
+
+std::string TransferThread::internalStringTostring(const INTERNALTYPEPATH& utf16)
+{
+ /* buggy on MXE
+ std::wstring_convert<std::codecvt_utf8<wchar_t>> conv1;
+ return conv1.to_bytes(utf16);*/
+ const QByteArray &data=QString::fromStdWString(utf16).toUtf8();
+ return std::string(data.constData(),data.size());
+ //return narrow(utf16);
+}
+#else
+std::string TransferThread::stringToInternalString(const std::string& utf8)
+{
+ return utf8;
+}
+
+std::string TransferThread::internalStringTostring(const std::string& utf16)
+{
+ return utf16;
+}
+#endif
+
+bool TransferThread::setFiles(const INTERNALTYPEPATH& source, const int64_t &size, const INTERNALTYPEPATH& destination, const Ultracopier::CopyMode &mode)
+{
+ if(transfer_stat!=TransferStat_Idle)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+
+ TransferThread::internalStringTostring(source)+", destination: "+TransferThread::internalStringTostring(destination));
+ return false;
+ }
+ //to prevent multiple file alocation into ListThread::doNewActions_inode_manipulation()
+ transfer_stat = TransferStat_PreOperation;
+ //emit pushStat(stat,transferId);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start, source: "+TransferThread::internalStringTostring(source)+", destination: "+TransferThread::internalStringTostring(destination));
+ this->source = source;
+ this->destination = destination;
+ this->mode = mode;
+ this->size = size;
+ stopIt = false;
+ #ifdef Q_OS_WIN32
+ stopItWin=0;
+ #endif
+ fileExistsAction = FileExists_NotSet;
+ canStartTransfer = false;
+ sended_state_preOperationStopped= false;
+ fileContentError = false;
+ writeError = false;
+ readError = false;
+ haveTransferTime = false;
+ canStartTransfer = false;
+ resetExtraVariable();
+ emit internalStartPreOperation();
+ startTransferTime.restart();
+ return true;
+}
+
+void TransferThread::setFileRename(const std::string &nameForRename)
+{
+ if(transfer_stat!=TransferStat_PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+
+ TransferThread::internalStringTostring(source)+(", destination: ")+TransferThread::internalStringTostring(destination));
+ return;
+ }
+ if(QString::fromStdString(nameForRename).contains(QRegularExpression(QStringLiteral("[/\\\\\\*]"))))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't use this kind of name, internal error"));
+ emit errorOnFile(destination,tr("Try rename with using special characters").toStdString());
+ return;
+ }
+ #ifdef WIDESTRING
+ std::string::size_type n=destination.rfind(L'/');
+ #else
+ std::string::size_type n=destination.rfind('/');
+ #endif
+ #ifdef Q_OS_WIN32
+ const std::wstring::size_type n2=destination.rfind(L'\\');
+ if(n2>n && (n2!=std::wstring::npos || n==std::wstring::npos))
+ n=n2;
+ #endif
+ #ifdef WIDESTRING
+ if(n != std::wstring::npos)
+ #else
+ if(n != std::string::npos)
+ #endif
+ {
+ INTERNALTYPEPATH destinationPath=destination.substr(0,n);//+1
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] nameForRename: "+nameForRename+", destinationPath: "+internalStringTostring(destinationPath));
+ if(stringEndsWith(destinationPath,'/')
+ #ifdef Q_OS_WIN32
+ || stringEndsWith(destinationPath,'\\')
+ #endif
+ )
+ destination=destinationPath+TransferThread::stringToInternalString(nameForRename);
+ else
+ destination=destinationPath+TransferThread::stringToInternalString("/")+TransferThread::stringToInternalString(nameForRename);
+ }
+ else
+ destination=TransferThread::stringToInternalString(nameForRename);
+
+ /*why all this code?
+ if(!renameTheOriginalDestination)
+ destination=destination+TransferThread::stringToInternalString("/")+TransferThread::stringToInternalString(nameForRename);
+ else
+ {
+ //INTERNALTYPEPATH tempDestination=destination;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+"] rename "+TransferThread::internalStringTostring(destination)+
+ ": to: "+TransferThread::internalStringTostring(destination)+"/"+nameForRename);
+ if(!rename(destination,(destination+TransferThread::stringToInternalString("/")+TransferThread::stringToInternalString(nameForRename))))
+ {
+ if(!is_file(destination))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] source not exists "+TransferThread::internalStringTostring(destination)+
+ ": destination: "+TransferThread::internalStringTostring(destination)+", error: "+std::to_string(errno));
+ emit errorOnFile(destination,tr("File not found").toStdString());
+ return;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to do real move "+TransferThread::internalStringTostring(destination)+
+ ": "+TransferThread::internalStringTostring(destination)+", error: "+std::to_string(errno));
+ emit errorOnFile(destination,"errno: "+std::string(strerror(errno)));
+ return;
+ }
+ if(source==destination)
+ source=destination+TransferThread::stringToInternalString("/")+TransferThread::stringToInternalString(nameForRename);
+ destination=tempDestination;
+ }*/
+ fileExistsAction = FileExists_NotSet;
+ resetExtraVariable();
+ emit internalStartPreOperation();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] destination is: "+TransferThread::internalStringTostring(destination));
+}
+
+bool TransferThread::rename(const INTERNALTYPEPATH &source, const INTERNALTYPEPATH &destination)
+{
+ #ifdef Q_OS_WIN32
+ return MoveFileExW(
+ TransferThread::toFinalPath(source).c_str(),
+ TransferThread::toFinalPath(destination).c_str(),
+ MOVEFILE_REPLACE_EXISTING);
+ #else
+ return ::rename(TransferThread::internalStringTostring(source).c_str(),
+ TransferThread::internalStringTostring(destination).c_str())==0;
+ #endif
+}
+
+void TransferThread::setAlwaysFileExistsAction(const FileExistsAction &action)
+{
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+QStringLiteral("] action to do always: ")+QString::number(action)));
+ alwaysDoFileExistsAction=action;
+}
+
+void TransferThread::resetExtraVariable()
+{
+ sended_state_preOperationStopped=false;
+ writeError = false;
+ readError = false;
+ needRemove = false;
+ needSkip = false;
+ retry = false;
+ havePermission = false;
+}
+
+bool TransferThread::isSame()
+{
+ //check if source and destination is not the same
+ //source.absoluteFilePath()==destination.absoluteFilePath() not work is source don't exists
+ if(source==destination)
+ {
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(!is_file(destination))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start source: "+TransferThread::internalStringTostring(source)+" not exists");
+ if(is_symlink(source))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start source: "+TransferThread::internalStringTostring(source)+" isSymLink");
+ if(is_symlink(destination))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start destination: "+TransferThread::internalStringTostring(destination)+" isSymLink");
+ #endif
+ if(fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_Skip)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] is same but skip");
+ transfer_stat=TransferStat_Idle;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transfer_stat=TransferStat_Idle");
+ emit postOperationStopped();
+ //quit
+ return true;
+ }
+ if(checkAlwaysRename())
+ return false;
+ emit fileAlreadyExists(source,destination,true);
+ return true;
+ }
+ return false;
+}
+
+bool TransferThread::destinationExists()
+{
+ //check if destination exists
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("overwrite: %1, alwaysDoFileExistsAction: %2, readError: %3, writeError: %4")
+ .arg(fileExistsAction)
+ .arg(alwaysDoFileExistsAction)
+ .arg(readError)
+ .arg(writeError)
+ .toStdString()
+ );
+ if(alwaysDoFileExistsAction==FileExists_Overwrite || readError || writeError
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ || rsync
+ #endif
+ )
+ return false;
+
+ bool destinationExists=false;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] time to first FS access");
+ destinationExists=is_file(destination);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] finish first FS access: "+std::to_string(destinationExists));
+ if(destinationExists)
+ {
+ if(fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_Skip)
+ {
+ transfer_stat=TransferStat_Idle;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transfer_stat=TransferStat_Idle");
+ emit postOperationStopped();
+ //quit
+ return true;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] FS access");
+ if(checkAlwaysRename())
+ return false;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] FS access");
+ if(is_file(source))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] FS access");
+ if(fileExistsAction==FileExists_OverwriteIfNewer || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfNewer))
+ {
+ const int64_t &sm=readFileMDateTime(source);
+ const int64_t &sd=readFileMDateTime(destination);
+ if(sm==-1)
+ {
+ #ifndef Q_OS_WIN32
+ const int e=errno;
+ emit errorOnFile(source,"Unable to read modification time: "+std::string(strerror(e))+" ("+std::to_string(e)+")");
+ #else
+ emit errorOnFile(source,"Unable to read modification time: "+GetLastErrorStdStr());
+ #endif
+ return true;
+ }
+ if(sd==-1)
+ {
+ #ifndef Q_OS_WIN32
+ const int e=errno;
+ emit errorOnFile(destination,"Unable to read modification time: "+std::string(strerror(e))+" ("+std::to_string(e)+")");
+ #else
+ emit errorOnFile(destination,"Unable to read modification time: "+GetLastErrorStdStr());
+ #endif
+ return true;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readFileMDateTime(source): "+std::to_string(sm));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readFileMDateTime(destination): "+std::to_string(sd));
+ if(sm>sd || sm==-1 || sd==-1)
+ return false;
+ else
+ {
+ transfer_stat=TransferStat_Idle;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transfer_stat=TransferStat_Idle;");
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] FS access");
+ if(fileExistsAction==FileExists_OverwriteIfOlder || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfOlder))
+ {
+ const int64_t &sm=readFileMDateTime(source);
+ const int64_t &sd=readFileMDateTime(destination);
+ if(sm==-1)
+ {
+ #ifndef Q_OS_WIN32
+ const int e=errno;
+ emit errorOnFile(source,"Unable to read modification time: "+std::string(strerror(e))+" ("+std::to_string(e)+")");
+ #else
+ emit errorOnFile(source,"Unable to read modification time: "+GetLastErrorStdStr());
+ #endif
+ return true;
+ }
+ if(sd==-1)
+ {
+ #ifndef Q_OS_WIN32
+ const int e=errno;
+ emit errorOnFile(destination,"Unable to read modification time: "+std::string(strerror(e))+" ("+std::to_string(e)+")");
+ #else
+ emit errorOnFile(destination,"Unable to read modification time: "+GetLastErrorStdStr());
+ #endif
+ return true;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readFileMDateTime(source): "+std::to_string(sm));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readFileMDateTime(destination): "+std::to_string(sd));
+ if(sm<sd/* || sm==-1 || sd==-1*/)
+ return false;
+ else
+ {
+ transfer_stat=TransferStat_Idle;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transfer_stat=TransferStat_Idle;");
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] FS access");
+ if(fileExistsAction==FileExists_OverwriteIfNotSameMdate || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfNotSameMdate))
+ {
+ const int64_t &sm=readFileMDateTime(source);
+ const int64_t &sd=readFileMDateTime(destination);
+ if(sm==-1)
+ {
+ #ifndef Q_OS_WIN32
+ const int e=errno;
+ emit errorOnFile(source,"Unable to read modification time: "+std::string(strerror(e))+" ("+std::to_string(e)+")");
+ #else
+ emit errorOnFile(source,"Unable to read modification time: "+GetLastErrorStdStr());
+ #endif
+ return true;
+ }
+ if(sd==-1)
+ {
+ #ifndef Q_OS_WIN32
+ const int e=errno;
+ emit errorOnFile(destination,"Unable to read modification time: "+std::string(strerror(e))+" ("+std::to_string(e)+")");
+ #else
+ emit errorOnFile(destination,"Unable to read modification time: "+GetLastErrorStdStr());
+ #endif
+ return true;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readFileMDateTime(source): "+std::to_string(sm));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readFileMDateTime(destination): "+std::to_string(sd));
+ if(sm!=sd || sm==-1 || sd==-1)
+ return false;
+ else
+ {
+ transfer_stat=TransferStat_Idle;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transfer_stat=TransferStat_Idle;");
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] FS access");
+ if(fileExistsAction==FileExists_OverwriteIfNotSameSize || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfNotSameMdate))
+ {
+ if(file_stat_size(source)!=file_stat_size(destination))
+ return false;
+ else
+ {
+ transfer_stat=TransferStat_Idle;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transfer_stat=TransferStat_Idle;");
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] FS access");
+ if(fileExistsAction==FileExists_OverwriteIfNotSameSizeAndDate || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfNotSameMdate))
+ {
+ const int64_t &sm=readFileMDateTime(source);
+ const int64_t &sd=readFileMDateTime(destination);
+ if(sm==-1)
+ {
+ #ifndef Q_OS_WIN32
+ const int e=errno;
+ emit errorOnFile(source,"Unable to read modification time: "+std::string(strerror(e))+" ("+std::to_string(e)+")");
+ #else
+ emit errorOnFile(source,"Unable to read modification time: "+GetLastErrorStdStr());
+ #endif
+ return true;
+ }
+ if(sd==-1)
+ {
+ #ifndef Q_OS_WIN32
+ const int e=errno;
+ emit errorOnFile(destination,"Unable to read modification time: "+std::string(strerror(e))+" ("+std::to_string(e)+")");
+ #else
+ emit errorOnFile(destination,"Unable to read modification time: "+GetLastErrorStdStr());
+ #endif
+ return true;
+ }
+ if(sm!=sd || file_stat_size(source)!=file_stat_size(destination))
+ return false;
+ else
+ {
+ transfer_stat=TransferStat_Idle;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transfer_stat=TransferStat_Idle;");
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] FS access");
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] FS access");
+ if(fileExistsAction!=FileExists_NotSet)
+ {
+ transfer_stat=TransferStat_Idle;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transfer_stat=TransferStat_Idle;");
+ emit postOperationStopped();
+ return true;
+ }
+ }
+ if(fileExistsAction==FileExists_NotSet)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] FS access");
+ emit fileAlreadyExists(source,destination,false);
+ return true;
+ }
+ }
+ return false;
+}
+
+/** \example
+ * /dir1/dir2/file -> file
+ * /file -> file
+ * /dir1/dir2/ -> dir2
+ * /dir1/ -> dir1
+ * / -> root */
+#ifdef Q_OS_WIN32
+std::string TransferThread::resolvedName(std::string inode)
+#else
+std::string TransferThread::resolvedName(const std::string &inode)
+#endif
+{
+ #ifdef Q_OS_WIN32
+ stringreplaceAll(inode,"\\","/");
+ #endif
+ const std::string::size_type &lastPos=inode.rfind('/');
+ if(lastPos == std::string::npos || (lastPos==0 && inode.size()==1))
+ return "root";
+ if((lastPos+1)!=inode.size())
+ return inode.substr(lastPos+1);
+ if(inode.size()==1)
+ return "root";
+ const std::string::size_type &previousLastPos=inode.rfind('/',inode.size()-2);
+ if((lastPos-2)==previousLastPos || previousLastPos == std::string::npos)
+ return "root";
+ return inode.substr(previousLastPos+1,lastPos-previousLastPos-1);
+}
+
+#ifdef Q_OS_WIN32
+std::wstring TransferThread::resolvedName(std::wstring inode)
+#else
+std::wstring TransferThread::resolvedName(const std::wstring &inode)
+#endif
+{
+ #ifdef Q_OS_WIN32
+ stringreplaceAll(inode,L"\\",L"/");
+ #endif
+ const std::wstring::size_type &lastPos=inode.rfind(L'/');
+ if(lastPos == std::wstring::npos || (lastPos==0 && inode.size()==1))
+ return L"root";
+ if((lastPos+1)!=inode.size())
+ return inode.substr(lastPos+1);
+ if(inode.size()==1)
+ return L"root";
+ const std::wstring::size_type &previousLastPos=inode.rfind(L'/',inode.size()-2);
+ if((lastPos-2)==previousLastPos || previousLastPos == std::wstring::npos)
+ return L"root";
+ return inode.substr(previousLastPos+1,lastPos-previousLastPos-1);
+}
+
+INTERNALTYPEPATH TransferThread::getSourcePath() const
+{
+ return source;
+}
+
+INTERNALTYPEPATH TransferThread::getDestinationPath() const
+{
+ return destination;
+}
+
+Ultracopier::CopyMode TransferThread::getMode() const
+{
+ return mode;
+}
+
+//return true if has been renamed
+bool TransferThread::checkAlwaysRename()
+{
+ if(alwaysDoFileExistsAction==FileExists_Rename)
+ {
+ INTERNALTYPEPATH newDestination=destination;
+ std::string fileName=resolvedName(TransferThread::internalStringTostring(newDestination));
+ std::string suffix;
+ std::string newFileName;
+ //resolv the suffix
+ if(std::regex_match(fileName,renameRegex))
+ {
+ suffix=fileName;
+ suffix=std::regex_replace(suffix,renameRegex,"$2");
+ fileName=std::regex_replace(fileName,renameRegex,"$1");
+ }
+ //resolv the new name
+ int num=1;
+ do
+ {
+ if(num==1)
+ {
+ if(firstRenamingRule.empty())
+ newFileName=tr("%name% - copy%suffix%").toStdString();
+ else
+ newFileName=firstRenamingRule;
+ }
+ else
+ {
+ if(otherRenamingRule.empty())
+ newFileName=tr("%name% - copy (%number%)%suffix%").toStdString();
+ else
+ newFileName=otherRenamingRule;
+ stringreplaceAll(newFileName,"%number%",std::to_string(num));
+ }
+ stringreplaceAll(newFileName,"%name%",fileName);
+ stringreplaceAll(newFileName,"%suffix%",suffix);
+ newDestination=FSabsolutePath(newDestination);
+ if(!stringEndsWith(newDestination,'/')
+ #ifdef Q_OS_WIN32
+ && !stringEndsWith(destination,'\\')
+ #endif
+ )
+ newDestination+=TransferThread::stringToInternalString("/");
+ newDestination+=TransferThread::stringToInternalString(newFileName);
+ num++;
+ }
+ while(is_file(newDestination));
+ if(!renameTheOriginalDestination)
+ destination=newDestination;
+ else
+ {
+ if(rename(destination.c_str(),newDestination.c_str())!=0)
+ {
+ if(!is_file(destination))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] source not exists "+TransferThread::internalStringTostring(destination)+
+ ": destination: "+TransferThread::internalStringTostring(newDestination)+", error: "+std::to_string(errno));
+ emit errorOnFile(destination,tr("File not found").toStdString());
+ readError=true;
+ return true;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to do real move "+TransferThread::internalStringTostring(destination)+
+ ": "+TransferThread::internalStringTostring(newDestination)+", error: "+std::to_string(errno));
+ readError=true;
+ emit errorOnFile(destination,std::string(strerror(errno))+", errno: "+std::string(strerror(errno)));
+ return true;
+ }
+ }
+ return true;
+ }
+ return false;
+}
+
+/// \warning not check if path have double //, if have do bug return failed
+/// \warning check mkpath() call should not exists because only existing dest is allowed now
+#ifdef Q_OS_UNIX
+bool TransferThread::mkpath(const INTERNALTYPEPATH &path, const mode_t &mode)
+#else
+bool TransferThread::mkpath(const INTERNALTYPEPATH &path)
+#endif
+{
+ #ifdef Q_OS_WIN32
+ if(!mkdir(path))
+ if(errno==EEXIST)
+ return true;
+
+ printf("%i",errno);
+ #ifndef WIDESTRING
+ #error if windows, WIDESTRING need be enabled
+ #endif
+ //use reverse method to performance, more complex to code but less system call/fs call
+ std::wstring::size_type previouspos=path.size();
+ std::wstring::size_type lastpos=std::string::npos;
+
+ const wchar_t *pathC=path.c_str();
+ wchar_t pathCedit[32000];
+ wcscpy(pathCedit,pathC);
+ std::vector<std::wstring::size_type> pathSplit;
+ pathSplit.push_back(path.size());
+ do
+ {
+ lastpos=path.rfind(L'/',previouspos-1);
+ if(lastpos == std::wstring::npos)
+ return false;
+
+ while(pathC[lastpos-1]==L'/')
+ if(lastpos>0)
+ lastpos--;
+ else
+ return false;
+
+ //buggy case?
+ #ifdef Q_OS_UNIX
+ if(lastpos<2)
+ return false;
+ #else
+ if(lastpos<4)
+ return false;
+ #endif
+
+ pathCedit[lastpos]=L'\0';
+ previouspos=lastpos;
+
+ errno=0;
+ if(!mkdir(pathCedit))
+ if(errno!=EEXIST && errno!=ENOENT)
+ return false;
+ //here errno can be: EEXIST, ENOENT, 0
+ if(errno==ENOENT)
+ pathSplit.push_back(lastpos);
+ } while(lastpos>0 && errno==ENOENT);
+
+ do
+ {
+ wcscpy(pathCedit,pathC);
+ lastpos=pathSplit.back();
+ pathSplit.pop_back();
+ pathCedit[lastpos]=L'\0';
+ #ifdef Q_OS_UNIX
+ if(mkdir(pathCedit, mode)==-1)
+ #else
+ if(!mkdir(pathCedit))
+ #endif
+ if(errno!=EEXIST)
+ return false;
+ } while(!pathSplit.empty());
+ return true;
+ #else
+ char pathC[PATH_MAX];
+ strcpy(pathC,TransferThread::internalStringTostring(path).c_str());
+ if(!mkdir(path))
+ if(errno==EEXIST)
+ return true;
+
+ printf("%i",errno);
+ //use reverse method to performance, more complex to code but less system call/fs call
+ std::string::size_type previouspos=path.size();
+ std::string::size_type lastpos=std::string::npos;
+
+ char pathCedit[PATH_MAX];
+ strcpy(pathCedit,pathC);
+ std::vector<std::string::size_type> pathSplit;
+ pathSplit.push_back(path.size());
+ do
+ {
+ lastpos=path.rfind('/',previouspos-1);
+ if(lastpos == std::string::npos)
+ return false;
+
+ while(pathC[lastpos-1]=='/')
+ if(lastpos>0)
+ lastpos--;
+ else
+ return false;
+
+ //buggy case?
+ #ifdef Q_OS_UNIX
+ if(lastpos<2)
+ return false;
+ #else
+ if(lastpos<4)
+ return false;
+ #endif
+
+ pathCedit[lastpos]='\0';
+ previouspos=lastpos;
+
+ errno=0;
+ #ifdef Q_OS_UNIX
+ if(::mkdir(pathCedit, mode)==-1)
+ #else
+ if(::mkdir(pathCedit)==-1)
+ #endif
+ if(errno!=EEXIST && errno!=ENOENT)
+ return false;
+ //here errno can be: EEXIST, ENOENT, 0
+ if(errno==ENOENT)
+ pathSplit.push_back(lastpos);
+ } while(lastpos>0 && errno==ENOENT);
+
+ do
+ {
+ strcpy(pathCedit,pathC);
+ lastpos=pathSplit.back();
+ pathSplit.pop_back();
+ pathCedit[lastpos]='\0';
+ #ifdef Q_OS_UNIX
+ if(::mkdir(pathCedit, mode)==-1)
+ #else
+ if(::mkdir(pathCedit)==-1)
+ #endif
+ if(errno!=EEXIST)
+ return false;
+ } while(!pathSplit.empty());
+ return true;
+ #endif
+}
+
+#ifdef Q_OS_UNIX
+bool TransferThread::mkdir(const INTERNALTYPEPATH &file_path, const mode_t &mode)
+#else
+bool TransferThread::mkdir(const INTERNALTYPEPATH &file_path)
+#endif
+{
+#ifdef Q_OS_WIN32
+ const bool r = CreateDirectory(TransferThread::toFinalPath(file_path).c_str(),NULL);
+ const DWORD &t=GetLastError();
+ if(!r)
+ {
+ if(t==183/*is_dir(file_path) performance impact*/)
+ errno=EEXIST;
+ else if(t==3/*is_dir(file_path) performance impact*/)
+ errno=ENOENT;
+ else
+ errno=t;
+ }
+ return r;
+#else
+ #ifdef Q_OS_UNIX
+ return ::mkdir(TransferThread::internalStringTostring(file_path).c_str(),mode)==0;
+ #else
+ return ::mkdir(TransferThread::internalStringTostring(file_path).c_str())==0;
+ #endif
+#endif
+}
+
+bool TransferThread::canBeMovedDirectly() const
+{
+ if(mode!=Ultracopier::Move)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] mode!=Ultracopier::Move");
+ return false;
+ }
+ return is_symlink(source) || driveManagement.isSameDrive(
+ TransferThread::internalStringTostring(destination),
+ TransferThread::internalStringTostring(source)
+ );
+}
+
+bool TransferThread::canBeCopiedDirectly() const
+{
+ return is_symlink(source);
+}
+
+//set the copy info and options before runing
+void TransferThread::setRightTransfer(const bool doRightTransfer)
+{
+ this->doRightTransfer=doRightTransfer;
+}
+
+/// \brief set buffer
+void TransferThread::setBuffer(const bool buffer)
+{
+ Q_UNUSED(buffer);
+}
+
+/*void TransferThread::setBufferSize(const int parallelBuffer,const int serialBuffer)
+{
+ writeThread->setBufferSize(const int parallelBuffer,const int serialBuffer);
+}*/
+
+//set keep date
+void TransferThread::setKeepDate(const bool keepDate)
+{
+ this->keepDate=keepDate;
+}
+
+bool TransferThread::doFilePostOperation()
+{
+ //do operation needed by copy
+ //set the time if no write thread used
+
+ if(/*not implied by is_symlink, exist can be false because symlink dest not exists*/
+ !exists(destination) && !is_symlink(destination))
+ {
+ if(!stopIt)
+ if(/*true when the destination have been remove but not the symlink:*/!is_symlink(source))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to change the date: File not found");
+ emit errorOnFile(destination,tr("Unable to change the date").toStdString()+": "+tr("File not found").toStdString());
+ return false;
+ }
+ }
+ else
+ {
+ if(doRightTransfer)
+ {
+ //should be never used but...
+ /*source.refresh();
+ if(source.exists())*/
+ if(havePermission)
+ {
+ if(!writeDestinationFilePermissions(destination))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to set the destination file permission");
+ //emit errorOnFile(destination,tr("Unable to set the destination file permission"));
+ //return false;
+ }
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Try doRightTransfer when source not exists");
+ }
+ //date at end because previous change can touch the file
+ if(doTheDateTransfer)
+ {
+ if(!writeDestinationFileDateTime(destination))
+ {
+ if(!is_file(destination))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to change the date (is not a file)");
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to change the date");
+ /* error with virtual folder under windows */
+ #ifndef Q_OS_WIN32
+ if(keepDate)
+ {
+ emit errorOnFile(destination,tr("Unable to change the date").toStdString());
+ return false;
+ }
+ #endif
+ }
+ /*else -> need be done at source m time read
+ {
+ #ifndef Q_OS_WIN32
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] read the destination time: "+destination.lastModified().toString().toStdString());
+ if(destination.lastModified()<ULTRACOPIER_PLUGIN_MINIMALYEAR_TIMESTAMPS)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] read the destination time lower than min time: "+destination.lastModified().toString().toStdString());
+ if(keepDate)
+ {
+ emit errorOnFile(destination,tr("Unable to change the date").toStdString());
+ return false;
+ }
+ }
+ #endif
+ }*/
+ }
+
+ }
+ if(stopIt)
+ return false;
+
+ return true;
+}
+
+//////////////////////////////////////////////////////////////////
+///////////////////////// Normal event ///////////////////////////
+//////////////////////////////////////////////////////////////////
+
+int64_t TransferThread::readFileMDateTime(const INTERNALTYPEPATH &source)
+{
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"readFileDateTime("+source+")");
+ /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
+ #ifdef Q_OS_UNIX
+ struct stat info;
+ if(stat(TransferThread::internalStringTostring(source).c_str(),&info)!=0)
+ return -1;
+ #ifdef Q_OS_MAC
+ return info.st_mtimespec.tv_sec;
+ #else
+ return info.st_mtim.tv_sec;
+ #endif
+ #else
+ #ifdef Q_OS_WIN32
+ HANDLE hFileSouce = CreateFileW(TransferThread::toFinalPath(source).c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
+ if(hFileSouce == INVALID_HANDLE_VALUE)
+ return -1;
+ FILETIME ftCreate, ftAccess, ftWrite;
+ if(!GetFileTime(hFileSouce, &ftCreate, &ftAccess, &ftWrite))
+ {
+ CloseHandle(hFileSouce);
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to get the file time: "+TransferThread::GetLastErrorStdStr());
+ return -1;
+ }
+ CloseHandle(hFileSouce);
+ const int64_t UNIX_TIME_START = 0x019DB1DED53E8000; //January 1, 1970 (start of Unix epoch) in "ticks"
+ const int64_t TICKS_PER_SECOND = 10000000; //a tick is 100ns
+ LARGE_INTEGER li;
+ li.LowPart = ftWrite.dwLowDateTime;
+ li.HighPart = ftWrite.dwHighDateTime;
+ return (li.QuadPart - UNIX_TIME_START) / TICKS_PER_SECOND;
+ #else
+ return -1;
+ #endif
+ #endif
+ return -1;
+}
+
+//fonction to read the file date time
+bool TransferThread::readSourceFileDateTime(const INTERNALTYPEPATH &source)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readFileDateTime("+TransferThread::internalStringTostring(source)+")");
+ /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
+ #ifdef Q_OS_UNIX
+ struct stat info;
+ if(stat(TransferThread::internalStringTostring(source).c_str(),&info)!=0)
+ return false;
+ #ifdef Q_OS_MAC
+ time_t ctime=info.st_ctimespec.tv_sec;
+ time_t actime=info.st_atimespec.tv_sec;
+ time_t modtime=info.st_mtimespec.tv_sec;
+ //this function avalaible on unix and mingw
+ butime.actime=actime;
+ butime.modtime=modtime;
+ #else
+ time_t ctime=info.st_ctim.tv_sec;
+ time_t actime=info.st_atim.tv_sec;
+ time_t modtime=info.st_mtim.tv_sec;
+ //this function avalaible on unix and mingw
+ butime.actime=actime;
+ butime.modtime=modtime;
+ #endif
+ if((uint64_t)modtime<ULTRACOPIER_PLUGIN_MINIMALYEAR_TIMESTAMPS)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] the sources is older to copy the time: "+TransferThread::internalStringTostring(source));
+ return false;
+ }
+ Q_UNUSED(ctime);
+ return true;
+ #else
+ #ifdef Q_OS_WIN32
+ HANDLE hFileSouce = CreateFileW(TransferThread::toFinalPath(source).c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
+ if(hFileSouce == INVALID_HANDLE_VALUE)
+ {
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] open failed to read: "+QString::fromWCharArray(filePath).toStdString()+", error: "+TransferThread::GetLastErrorStdStr());
+ return false;
+ }
+ FILETIME ftCreate, ftAccess, ftWrite;
+ if(!GetFileTime(hFileSouce, &ftCreate, &ftAccess, &ftWrite))
+ {
+ CloseHandle(hFileSouce);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to get the file time");
+ return false;
+ }
+ this->ftCreate=ftCreate;
+ this->ftAccess=ftAccess;
+ this->ftWrite=ftWrite;
+ CloseHandle(hFileSouce);
+ const uint64_t modtime=(uint64_t)ftWrite.dwLowDateTime + ((uint64_t)2^32 * (uint64_t)ftWrite.dwHighDateTime);
+ if(modtime<ULTRACOPIER_PLUGIN_MINIMALYEAR_TIMESTAMPS)
+ {
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] the sources is older to copy the time: "+source+": "+source.lastModified().toString().toStdString());
+ return false;
+ }
+ return true;
+ #else
+ return false;
+ #endif
+ #endif
+ return false;
+}
+
+bool TransferThread::writeDestinationFileDateTime(const INTERNALTYPEPATH &destination)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] writeFileDateTime("+TransferThread::internalStringTostring(destination)+")");
+ /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
+ #ifdef Q_OS_UNIX
+ return utime(TransferThread::internalStringTostring(destination).c_str(),&butime)==0;
+ #else
+ #ifdef Q_OS_WIN32
+ HANDLE hFileDestination = CreateFileW(TransferThread::toFinalPath(destination).c_str(), GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
+ if(hFileDestination == INVALID_HANDLE_VALUE)
+ {
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] open failed to write: "+QString::fromWCharArray(filePath).toStdString()+", error: "+TransferThread::GetLastErrorStdStr());
+ return false;
+ }
+ FILETIME ftCreate, ftAccess, ftWrite;
+ ftCreate=this->ftCreate;
+ ftAccess=this->ftAccess;
+ ftWrite=this->ftWrite;
+ if(!SetFileTime(hFileDestination, &ftCreate, &ftAccess, &ftWrite))
+ {
+ CloseHandle(hFileDestination);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to set the file time");
+ return false;
+ }
+ CloseHandle(hFileDestination);
+ return true;
+ #else
+ return false;
+ #endif
+ #endif
+ return false;
+}
+
+bool TransferThread::readSourceFilePermissions(const INTERNALTYPEPATH &source)
+{
+ #ifdef Q_OS_UNIX
+ if(stat(TransferThread::internalStringTostring(source).c_str(), &permissions)!=0)
+ return false;
+ else
+ return true;
+ #else
+ HANDLE hFile = CreateFileW(source.c_str(), GENERIC_READ ,
+ FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if (hFile == INVALID_HANDLE_VALUE) {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] CreateFile() failed. Error: INVALID_HANDLE_VALUE: "+TransferThread::GetLastErrorStdStr());
+ return false;
+ }
+ DWORD lasterror = GetSecurityInfo(hFile, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION,
+ NULL, NULL, &dacl, NULL, &PSecurityD);
+ if (lasterror != ERROR_SUCCESS) {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] GetSecurityInfo() failed. Error"+std::to_string(lasterror));
+ return false;
+ }
+ CloseHandle(hFile);
+ return true;
+ #endif
+}
+
+bool TransferThread::writeDestinationFilePermissions(const INTERNALTYPEPATH &destination)
+{
+ #ifdef Q_OS_UNIX
+ if(chmod(TransferThread::internalStringTostring(destination).c_str(), permissions.st_mode)!=0)
+ return false;
+ if(chown(TransferThread::internalStringTostring(destination).c_str(), permissions.st_uid, permissions.st_gid)!=0)
+ return false;
+ return true;
+ #else
+ HANDLE hFile = CreateFileW(destination.c_str(),READ_CONTROL | WRITE_OWNER | WRITE_DAC | ACCESS_SYSTEM_SECURITY,0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if (hFile == INVALID_HANDLE_VALUE) {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] CreateFile() failed. Error: INVALID_HANDLE_VALUE: "+TransferThread::GetLastErrorStdStr());
+ return false;
+ }
+ DWORD lasterror = SetSecurityInfo(hFile, SE_FILE_OBJECT, DACL_SECURITY_INFORMATION , NULL, NULL, dacl, NULL);
+ if (lasterror != ERROR_SUCCESS) {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] SetSecurityInfo() failed. Error"+std::to_string(lasterror));
+ return false;
+ }
+ CloseHandle(hFile);
+ if(PSecurityD!=NULL)
+ {
+ //free(PSecurityD);//crash on some NAS, it's why is commented, http://forum-ultracopier.first-world.info/viewtopic.php?f=8&t=903&p=3689#p3689
+ PSecurityD=NULL;
+ }
+ if(dacl!=NULL)
+ {
+ //free(dacl);
+ dacl=NULL;
+ }
+ return true;
+ #endif
+}
+
+//retry after error
+void TransferThread::putAtBottom()
+{
+ emit tryPutAtBottom();
+}
+
+#ifdef ULTRACOPIER_PLUGIN_RSYNC
+/// \brief set rsync
+void TransferThread::setRsync(const bool rsync)
+{
+ this->rsync=rsync;
+}
+#endif
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+//to set the id
+void TransferThread::setId(int id)
+{
+ this->id=id;
+}
+#endif
+
+void TransferThread::setRenamingRules(const std::string &firstRenamingRule, const std::string &otherRenamingRule)
+{
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+}
+
+void TransferThread::setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles)
+{
+ this->deletePartiallyTransferredFiles=deletePartiallyTransferredFiles;
+}
+
+void TransferThread::setRenameTheOriginalDestination(const bool &renameTheOriginalDestination)
+{
+ this->renameTheOriginalDestination=renameTheOriginalDestination;
+}
+
+void TransferThread::set_updateMount()
+{
+ driveManagement.tryUpdate();
+}
+
+bool TransferThread::is_symlink(const INTERNALTYPEPATH &filename)
+{
+ #ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA fileInfo;
+ BOOL r = GetFileAttributesExW(TransferThread::toFinalPath(filename).c_str(), GetFileExInfoStandard, &fileInfo);
+ if(r != FALSE)
+ {
+ return fileInfo.dwFileAttributes != INVALID_FILE_ATTRIBUTES &&
+ (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT);
+ }
+ else
+ return false;
+ #else
+ return is_symlink(TransferThread::internalStringTostring(filename).c_str());
+ #endif
+}
+
+bool TransferThread::is_symlink(const char * const filename)
+{
+ #ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA fileInfo;
+ BOOL r = GetFileAttributesExA(TransferThread::toFinalPath(filename).c_str(), GetFileExInfoStandard, &fileInfo);
+ if(r != FALSE)
+ {
+ return fileInfo.dwFileAttributes != INVALID_FILE_ATTRIBUTES &&
+ (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT);
+ }
+ else
+ return false;
+ #else
+ struct stat p_statbuf;
+ if (lstat(filename, &p_statbuf) < 0)
+ //if error or file not exists, considere as regular file
+ return false;
+ if (S_ISLNK(p_statbuf.st_mode))
+ return true;
+ #endif
+ return false;
+}
+
+bool TransferThread::is_file(const INTERNALTYPEPATH &filename)
+{
+ #ifdef Q_OS_WIN32
+ DWORD dwAttrib = GetFileAttributesW(TransferThread::toFinalPath(filename).c_str());
+ return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
+ (dwAttrib & FILE_ATTRIBUTE_NORMAL || dwAttrib & FILE_ATTRIBUTE_ARCHIVE)
+ );
+ #else
+ return is_file(TransferThread::internalStringTostring(filename).c_str());
+ #endif
+}
+
+bool TransferThread::is_file(const char * const filename)
+{
+ #ifdef Q_OS_WIN32
+ DWORD dwAttrib = GetFileAttributesA(TransferThread::toFinalPath(filename).c_str());
+ return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
+ (dwAttrib & FILE_ATTRIBUTE_DIRECTORY));
+ #else
+ struct stat p_statbuf;
+ if (lstat(filename, &p_statbuf) < 0)
+ //if error or file not exists, considere as regular file
+ return false;
+ if (S_ISREG(p_statbuf.st_mode))
+ return true;
+ return false;
+ #endif
+}
+
+bool TransferThread::is_dir(const INTERNALTYPEPATH &filename)
+{
+ #ifdef Q_OS_WIN32
+ DWORD dwAttrib = GetFileAttributesW(TransferThread::toFinalPath(filename).c_str());
+ return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
+ (dwAttrib & FILE_ATTRIBUTE_DIRECTORY) &&
+ !(dwAttrib & FILE_ATTRIBUTE_REPARSE_POINT));
+ #else
+ return is_dir(TransferThread::internalStringTostring(filename).c_str());
+ #endif
+}
+
+bool TransferThread::is_dir(const char * const filename)
+{
+ #ifdef Q_OS_WIN32
+ DWORD dwAttrib = GetFileAttributesA(TransferThread::toFinalPath(filename).c_str());
+ return (dwAttrib != INVALID_FILE_ATTRIBUTES &&
+ (dwAttrib & FILE_ATTRIBUTE_DIRECTORY) &&
+ !(dwAttrib & FILE_ATTRIBUTE_REPARSE_POINT));
+ #else
+ struct stat p_statbuf;
+ if (lstat(filename, &p_statbuf) < 0)
+ //if error or file not exists, considere as regular file
+ return false;
+ if (S_ISDIR(p_statbuf.st_mode))
+ return true;
+ return false;
+ #endif
+}
+
+bool TransferThread::exists(const INTERNALTYPEPATH &filename)
+{
+ #ifdef Q_OS_WIN32
+ DWORD dwAttrib = GetFileAttributesW(TransferThread::toFinalPath(filename).c_str());
+ return dwAttrib != INVALID_FILE_ATTRIBUTES;
+ #else
+ return exists(TransferThread::internalStringTostring(filename).c_str());
+ #endif
+}
+
+bool TransferThread::exists(const char * const filename)
+{
+ #ifdef Q_OS_WIN32
+ DWORD dwAttrib = GetFileAttributesA(TransferThread::toFinalPath(filename).c_str());
+ return dwAttrib != INVALID_FILE_ATTRIBUTES;
+ #else
+ struct stat p_statbuf;
+ if (lstat(filename, &p_statbuf) < 0)
+ //if error or file not exists, considere as regular file
+ return false;
+ #endif
+ return true;
+}
+
+int64_t TransferThread::file_stat_size(const INTERNALTYPEPATH &filename)
+{
+ #ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA fileInfo;
+ BOOL r = GetFileAttributesExW(TransferThread::toFinalPath(filename).c_str(), GetFileExInfoStandard, &fileInfo);
+ if(r == FALSE)
+ return -1;
+ int64_t size=fileInfo.nFileSizeHigh;
+ size<<=32;
+ size|=fileInfo.nFileSizeLow;
+ return size;
+ #else
+ return file_stat_size(TransferThread::internalStringTostring(filename).c_str());
+ #endif
+}
+
+int64_t TransferThread::file_stat_size(const char * const filename)
+{
+ #ifdef Q_OS_WIN32
+ WIN32_FILE_ATTRIBUTE_DATA fileInfo;
+ BOOL r = GetFileAttributesExA(TransferThread::toFinalPath(filename).c_str(), GetFileExInfoStandard, &fileInfo);
+ if(r == FALSE)
+ return -1;
+ int64_t size=fileInfo.nFileSizeHigh;
+ size<<=32;
+ size|=fileInfo.nFileSizeLow;
+ return size;
+ #else
+ struct stat p_statbuf;
+ if (stat(filename, &p_statbuf) < 0)
+ //if error or file not exists, considere as regular file
+ return -1;
+ if (lstat(filename, &p_statbuf) < 0)
+ //if error or file not exists, considere as regular file
+ return -1;
+ return p_statbuf.st_size;
+ #endif
+}
+
+bool TransferThread::entryInfoList(const INTERNALTYPEPATH &path,std::vector<INTERNALTYPEPATH> &list)
+{
+ std::vector<dirent_uc> listTemp;
+ if(!TransferThread::entryInfoList(path,listTemp))
+ return false;
+ for(const dirent_uc &u : listTemp)
+ list.push_back(u.d_name);
+ return true;
+}
+
+bool TransferThread::rmdir(const INTERNALTYPEPATH &path)
+{
+ #ifdef Q_OS_WIN32
+ return RemoveDirectoryW(TransferThread::toFinalPath(path).c_str());
+ #else
+ return ::rmdir(TransferThread::internalStringTostring(path).c_str())==0;
+ #endif
+}
+
+#ifdef Q_OS_UNIX
+bool TransferThread::entryInfoList(const INTERNALTYPEPATH &path,std::vector<dirent_uc> &list)
+{
+ DIR *dp;
+ struct dirent *ep;
+ dp=opendir(TransferThread::internalStringTostring(path).c_str());
+ if(dp!=NULL)
+ {
+ do {
+ ep=readdir(dp);
+ if(ep!=NULL)
+ {
+ const std::string name(ep->d_name);
+ if(name!="." && name!="..")
+ {
+ dirent_uc tempValue;
+ #if defined(__HAIKU__)
+ struct stat sp;
+ memset(&sp,0,sizeof(sp));
+ if(stat((TransferThread::internalStringTostring(path)+"/"+name).c_str(), &sp)==0)
+ tempValue.isFolder=S_ISDIR(sp.st_mode);
+ else
+ return false;
+ #else
+ tempValue.isFolder=ep->d_type==DT_DIR;
+ #endif
+ tempValue.d_name=TransferThread::stringToInternalString(ep->d_name);
+ list.push_back(tempValue);
+ }
+ }
+ } while(ep!=NULL);
+ (void) closedir(dp);
+ return true;
+ }
+ return false;
+}
+#else
+bool TransferThread::entryInfoList(const INTERNALTYPEPATH &path,std::vector<dirent_uc> &list)
+{
+ HANDLE hFind = NULL;
+ #ifdef WIDESTRING
+ WIN32_FIND_DATAW fdFile;
+ if((hFind = FindFirstFileW((TransferThread::toFinalPath(path)+L"\\*").c_str(), &fdFile)) == INVALID_HANDLE_VALUE)
+ #else
+ WIN32_FIND_DATAA fdFile;
+ char finalpath[MAX_PATH];
+ strcpy(finalpath,path.c_str());
+ strcat(finalpath,"\\*");
+ if((hFind = FindFirstFileW(finalpath, &fdFile)) == INVALID_HANDLE_VALUE)
+ #endif
+ return false;
+ do
+ {
+ #ifdef WIDESTRING
+ if(wcscmp(fdFile.cFileName, L".")!=0 && wcscmp(fdFile.cFileName, L"..")!=0)
+ #else
+ if(strcmp(fdFile.cFileName, ".")!=0 && strcmp(fdFile.cFileName, "..")!=0)
+ #endif
+ {
+ dirent_uc tempValue;
+ tempValue.isFolder=
+ (fdFile.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
+ !(fdFile.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT)
+ ;
+ tempValue.d_name=fdFile.cFileName;
+ tempValue.size=fdFile.nFileSizeHigh;
+ tempValue.size<<=32;
+ tempValue.size|=fdFile.nFileSizeLow;
+ list.push_back(tempValue);
+ }
+ }
+ while(FindNextFileW(hFind, &fdFile));
+ FindClose(hFind);
+ return true;
+}
+#endif
+
+void TransferThread::setMkFullPath(const bool mkFullPath)
+{
+ this->mkFullPath=mkFullPath;
+}
+
+/*int TransferThread::fseeko64(FILE *__stream, uint64_t __off, int __whence)
+{
+ #if defined(__HAIKU__) || defined(Q_OS_MAC) || defined(ANDROID) || defined(__ANDROID_API__)
+ return ::fseeko(__stream,__off,__whence);
+ #else
+ return ::fseeko64(__stream,__off,__whence);
+ #endif
+}
+
+int TransferThread::ftruncate64(int __fd, uint64_t __length)
+{
+ #if defined(__HAIKU__) || defined(Q_OS_MAC) || defined(ANDROID) || defined(__ANDROID_API__)
+ return ::ftruncate(__fd,__length);
+ #else
+ //return ::ftruncate64(__fd,__length);
+ return ::ftruncate(__fd,__length);
+ #endif
+}*/
+
+int64_t TransferThread::transferTime() const
+{
+ return startTransferTime.elapsed();
+}
+
+#ifdef Q_OS_WIN32
+std::wstring TransferThread::toFinalPath(std::wstring path)
+{
+ if(path.size()==2 && path.at(1)==L':')
+ path+=L"\\";
+ stringreplaceAll(path,L"/",L"\\");
+ std::wstring pathW;
+ if(path.size()>2 && path.substr(0,2)==L"\\\\")//nas
+ pathW=L"\\\\?\\UNC\\"+path.substr(2);
+ else
+ pathW=L"\\\\?\\"+path;
+ return pathW;
+}
+
+std::string TransferThread::toFinalPath(std::string path)
+{
+ if(path.size()==2 && path.at(1)==':')
+ path+="\\";
+ stringreplaceAll(path,"/","\\");
+ std::string pathW;
+ if(path.size()>2 && path.substr(0,2)=="\\\\")//nas
+ pathW="\\\\?\\UNC\\"+path.substr(2);
+ else
+ pathW="\\\\?\\"+path;
+ return pathW;
+}
+
+bool TransferThread::unlink(const std::wstring &path)
+{
+ return DeleteFileW(TransferThread::toFinalPath(path).c_str()) || RemoveDirectoryW(TransferThread::toFinalPath(path).c_str());
+}
+
+std::string TransferThread::GetLastErrorStdStr()
+{
+ DWORD error = GetLastError();
+ if (error)
+ {
+ LPVOID lpMsgBuf;
+ DWORD bufLen = FormatMessageA(
+ FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM |
+ FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL,
+ error,
+ MAKELANGID(LANG_SYSTEM_DEFAULT, SUBLANG_DEFAULT),
+ (LPSTR) &lpMsgBuf,
+ 0, NULL );
+ if (bufLen)
+ {
+ std::string result((char *)lpMsgBuf, (int)bufLen);
+ LocalFree(lpMsgBuf);
+ return result+" ("+std::to_string(error)+")";
+ }
+ return "1: "+std::to_string(error);
+ }
+ return "2: "+std::to_string(error);
+}
+#else
+bool TransferThread::unlink(const INTERNALTYPEPATH &path)
+{
+ return ::unlink(internalStringTostring(path).c_str())==0;
+}
+#endif
diff --git a/plugins/CopyEngine/Ultracopier-Spec/TransferThread.h b/plugins/CopyEngine/Ultracopier-Spec/TransferThread.h
new file mode 100755
index 0000000..42db854
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/TransferThread.h
@@ -0,0 +1,265 @@
+/** \file TransferThread.h
+\brief Thread changed to manage the inode operation, the signals, canceling, pre and post operations
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QObject>
+#include <QTime>
+#include <QThread>
+
+#include <regex>
+#include <vector>
+#include <string>
+#include <utility>
+#include <dirent.h>
+#include <atomic>
+
+#ifdef WIDESTRING
+#define INTERNALTYPEPATH std::wstring
+#define INTERNALTYPECHAR wchar_t
+#else
+#define INTERNALTYPEPATH std::string
+#define INTERNALTYPECHAR char
+#endif
+
+//defore the next define
+#include "CopyEngineUltracopier-SpecVariable.h"
+
+#ifdef Q_OS_UNIX
+ #include <utime.h>
+ #include <time.h>
+ #include <unistd.h>
+ #include <sys/stat.h>
+#endif
+#ifdef Q_OS_WIN32
+ #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ #include <utime.h>
+ #include <time.h>
+ #include <unistd.h>
+ #include <sys/stat.h>
+ #endif
+#endif
+
+#ifdef Q_OS_WIN32
+#include <windows.h>
+#endif
+
+#include "Environment.h"
+#include "DriveManagement.h"
+#include "StructEnumDefinition_CopyEngine.h"
+
+#ifndef TRANSFERTHREAD_H
+#define TRANSFERTHREAD_H
+
+/// \brief Thread changed to manage the inode operation, the signals, canceling, pre and post operations
+class TransferThread : public QThread
+{
+ Q_OBJECT
+public:
+ explicit TransferThread();
+ ~TransferThread();
+ /// \brief get transfer stat
+ TransferStat getStat() const;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief to set the id
+ void setId(int id);
+ #endif
+ /// \brief get the transfer time in ms
+ int64_t transferTime() const;
+ /// \brief to store the transfer id
+ std::atomic<uint64_t> transferId;
+ /// \brief to store the transfer size
+ uint64_t transferSize;
+
+ //not copied size, ...
+ #ifdef Q_OS_WIN32
+ static std::string resolvedName(std::string inode);
+ static std::wstring resolvedName(std::wstring inode);
+ #else
+ static std::string resolvedName(const std::string &inode);
+ static std::wstring resolvedName(const std::wstring &inode);
+ #endif
+ INTERNALTYPEPATH getSourcePath() const;
+ INTERNALTYPEPATH getDestinationPath() const;
+ Ultracopier::CopyMode getMode() const;
+ // \warning check mkpath() call should not exists because only existing dest is allowed now
+ #ifdef Q_OS_UNIX
+ static bool mkpath(const INTERNALTYPEPATH &file_path, const mode_t &mode=0755);
+ static bool mkdir(const INTERNALTYPEPATH &file_path, const mode_t &mode=0755);
+ #else
+ static bool mkpath(const INTERNALTYPEPATH &file_path);
+ static bool mkdir(const INTERNALTYPEPATH &file_path);
+ #endif
+ #ifdef WIDESTRING
+ static INTERNALTYPEPATH stringToInternalString(const std::string& utf8);
+ static std::string internalStringTostring(const INTERNALTYPEPATH& utf16);
+ #else
+ static std::string stringToInternalString(const std::string& utf8);
+ static std::string internalStringTostring(const std::string& utf16);
+ #endif
+ #ifdef Q_OS_WIN32
+ static std::wstring toFinalPath(std::wstring path);
+ static std::string toFinalPath(std::string path);
+ static bool unlink(const std::wstring &path);
+ static std::string GetLastErrorStdStr();
+ #else
+ static bool unlink(const INTERNALTYPEPATH &path);//return true if sucess
+ #endif
+
+ static int64_t readFileMDateTime(const INTERNALTYPEPATH &source);
+ static bool is_symlink(const char * const filename);
+ static bool is_symlink(const INTERNALTYPEPATH &filename);
+ static bool is_file(const char * const filename);
+ static bool is_file(const INTERNALTYPEPATH &filename);
+ static bool is_dir(const char * const filename);
+ static bool is_dir(const INTERNALTYPEPATH &filename);
+ static bool exists(const char * const filename);
+ static bool exists(const INTERNALTYPEPATH &filename);
+ static int64_t file_stat_size(const INTERNALTYPEPATH &filename);
+ static int64_t file_stat_size(const char * const filename);
+ static bool entryInfoList(const INTERNALTYPEPATH &path, std::vector<INTERNALTYPEPATH> &list);
+ static bool rmdir(const INTERNALTYPEPATH &path);
+ struct dirent_uc
+ {
+ #ifdef Q_OS_WIN32
+ int64_t size;
+ #endif
+ INTERNALTYPEPATH d_name;
+ bool isFolder;
+ };
+ static bool entryInfoList(const INTERNALTYPEPATH &path, std::vector<dirent_uc> &list);
+ void setMkFullPath(const bool mkFullPath);
+ /*static int fseeko64(FILE *__stream, uint64_t __off, int __whence);
+ static int ftruncate64(int __fd, uint64_t __length);*/
+ static bool rename(const INTERNALTYPEPATH &source, const INTERNALTYPEPATH &destination);
+protected:
+ void run();
+ virtual void resetExtraVariable();
+ bool isSame();
+ bool destinationExists();
+
+ //different pre-operation
+ bool checkAlwaysRename();///< return true if has been renamed
+ bool canBeMovedDirectly() const;
+ bool canBeCopiedDirectly() const;
+
+ //fonction to edit the file date time
+ bool readSourceFileDateTime(const INTERNALTYPEPATH &source);
+ bool writeDestinationFileDateTime(const INTERNALTYPEPATH &destination);
+ bool readSourceFilePermissions(const INTERNALTYPEPATH &source);
+ bool writeDestinationFilePermissions(const INTERNALTYPEPATH &destination);
+signals:
+ //internal signal
+ void internalStartPostOperation() const;
+ void internalStartPreOperation() const;
+ //force into the right thread
+ void internalTryStartTheTransfer() const;
+ //to send state
+ void preOperationStopped() const;
+ void checkIfItCanBeResumed() const;
+ //void transferStarted();//not sended (and not used then)
+ void readStopped() const;
+ void writeStopped() const;
+ void postOperationStopped() const;
+ //get dialog
+ void fileAlreadyExists(const INTERNALTYPEPATH &info,const INTERNALTYPEPATH &info2,const bool &isSame) const;
+ void errorOnFile(const INTERNALTYPEPATH &info,const std::string &string,const ErrorType &errorType=ErrorType_Normal) const;
+ /// \brief To debug source
+ void debugInformation(const Ultracopier::DebugLevel &level,std::string fonction,std::string text,std::string file,int ligne) const;
+ void tryPutAtBottom() const;
+ /// \brief update the transfer stat
+ void pushStat(const TransferStat &stat,const uint64_t &pos) const;
+public slots:
+ /// \brief to set files to transfer
+ virtual bool setFiles(const INTERNALTYPEPATH& source,const int64_t &size,const INTERNALTYPEPATH& destination,const Ultracopier::CopyMode &mode);
+ /// \brief to set the new name of the destination
+ void setFileRename(const std::string &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 buffer
+ virtual void setBuffer(const bool buffer);
+ /// \brief set keep date
+ void setKeepDate(const bool keepDate);
+ /// \brief put the current file at bottom
+ void putAtBottom();
+
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ void setRsync(const bool rsync);
+ #endif
+
+ void setRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule);
+
+ void setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles);
+ void setRenameTheOriginalDestination(const bool &renameTheOriginalDestination);
+ void set_updateMount();
+protected:
+ enum MoveReturn
+ {
+ MoveReturn_skip=0,
+ MoveReturn_moved=1,
+ MoveReturn_error=2
+ };
+
+ Ultracopier::CopyMode mode;
+ std::atomic<TransferStat> transfer_stat;
+ bool doRightTransfer;
+ #ifdef ULTRACOPIER_PLUGIN_RSYNC
+ bool rsync;
+ #endif
+ bool keepDate;
+ bool mkFullPath;
+ volatile bool stopIt;
+ #ifdef Q_OS_WIN32
+ int stopItWin;
+ #endif
+ DriveManagement driveManagement;
+ volatile bool canStartTransfer;
+ bool retry;
+ INTERNALTYPEPATH source;
+ INTERNALTYPEPATH destination;
+ int64_t size;
+ FileExistsAction fileExistsAction;
+ FileExistsAction alwaysDoFileExistsAction;
+ bool needSkip,needRemove;
+ int id;
+ bool deletePartiallyTransferredFiles;
+ std::string firstRenamingRule;
+ std::string otherRenamingRule;
+ //error management
+ bool renameTheOriginalDestination;
+ bool fileContentError;
+ bool doTheDateTransfer;
+ int parallelizeIfSmallerThan;
+ //error management
+ bool writeError;
+ bool readError;
+ std::regex renameRegex;
+ #ifdef Q_OS_UNIX
+ utimbuf butime;
+ #else
+ #ifdef Q_OS_WIN32
+ FILETIME ftCreate, ftAccess, ftWrite;
+ std::regex regRead;
+ #else
+ #error Not unix, not windows, fix this
+ #endif
+ #endif
+ #ifdef Q_OS_UNIX
+ struct stat permissions;
+ #else
+ PSECURITY_DESCRIPTOR PSecurityD;
+ PACL dacl;
+ #endif
+ bool havePermission;
+ //to send state
+ bool sended_state_preOperationStopped;
+ //different post-operation
+ bool doFilePostOperation();
+protected:
+ QTime startTransferTime;
+ bool haveTransferTime;
+};
+
+#endif // TRANSFERTHREAD_H
diff --git a/plugins/CopyEngine/Ultracopier/ReadThread.cpp b/plugins/CopyEngine/Ultracopier-Spec/async/ReadThread.cpp
index 7bdb60c..d83e8ff 100644..100755
--- a/plugins/CopyEngine/Ultracopier/ReadThread.cpp
+++ b/plugins/CopyEngine/Ultracopier-Spec/async/ReadThread.cpp
@@ -1,9 +1,18 @@
#include "ReadThread.h"
+#include "../TransferThread.h"
#ifdef Q_OS_LINUX
#include <fcntl.h>
#endif
+#ifdef Q_OS_UNIX
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#endif
+#include <iostream>
+
ReadThread::ReadThread()
{
start();
@@ -13,12 +22,18 @@ ReadThread::ReadThread()
blockSize=ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*1024;
setObjectName(QStringLiteral("read"));
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
+ status=Idle;
#endif
isInReadLoop=false;
tryStartRead=false;
lastGoodPosition=0;
isOpen.release();
+
+ #ifdef Q_OS_UNIX
+ from=-1;
+ #else
+ from=nullptr;
+ #endif
}
ReadThread::~ReadThread()
@@ -42,48 +57,66 @@ ReadThread::~ReadThread()
void ReadThread::run()
{
- connect(this,&ReadThread::internalStartOpen, this,&ReadThread::internalOpenSlot, Qt::QueuedConnection);
- connect(this,&ReadThread::internalStartReopen, this,&ReadThread::internalReopen, Qt::QueuedConnection);
- connect(this,&ReadThread::internalStartRead, this,&ReadThread::internalRead, Qt::QueuedConnection);
- connect(this,&ReadThread::internalStartClose, this,&ReadThread::internalCloseSlot, Qt::QueuedConnection);
- connect(this,&ReadThread::checkIfIsWait, this,&ReadThread::isInWait, Qt::QueuedConnection);
- connect(this,&ReadThread::internalStartChecksum, this,&ReadThread::checkSum, Qt::QueuedConnection);
+ if(!connect(this,&ReadThread::internalStartOpen, this,&ReadThread::internalOpenSlot, Qt::QueuedConnection))
+ abort();
+ if(!connect(this,&ReadThread::internalStartReopen, this,&ReadThread::internalReopen, Qt::QueuedConnection))
+ abort();
+ if(!connect(this,&ReadThread::internalStartRead, this,&ReadThread::internalRead, Qt::QueuedConnection))
+ abort();
+ if(!connect(this,&ReadThread::internalStartClose, this,&ReadThread::internalCloseSlot, Qt::QueuedConnection))
+ abort();
+ if(!connect(this,&ReadThread::checkIfIsWait, this,&ReadThread::isInWait, Qt::QueuedConnection))
+ abort();
exec();
}
-void ReadThread::open(const QFileInfo &file, const Ultracopier::CopyMode &mode)
+void ReadThread::openRead(const INTERNALTYPEPATH &file, const Ultracopier::CopyMode &mode)
{
if(!isRunning())
{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] the thread not running to open destination: "+file.absoluteFilePath().toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] the thread not running to open destination"+TransferThread::internalStringTostring(file));
errorString_internal=tr("Internal error, please report it!").toStdString();
emit error();
}
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] open source: "+file.absoluteFilePath().toStdString());
- if(this->file.isOpen())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] open source: "+TransferThread::internalStringTostring(file));
+ #ifdef Q_OS_UNIX
+ if(from>=0)
+ #else
+ if(from!=NULL)
+ #endif
{
- if(file.absoluteFilePath()==this->file.fileName())
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Try reopen already opened same file: "+file.absoluteFilePath().toStdString());
+ if(file==this->file)
+ {
+ std::cerr << "["+std::to_string(id)+"] Try reopen already opened same file: " << TransferThread::internalStringTostring(file) << std::endl;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Try reopen already opened same file: "+TransferThread::internalStringTostring(file));
+ }
else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already open: "+file.absoluteFilePath().toStdString());
- emit internalStartClose();
+ {
+ std::cerr << "["+std::to_string(id)+"] previous file is already open: "+TransferThread::internalStringTostring(this->file) << ", can't open " << TransferThread::internalStringTostring(file) << std::endl;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already open: "+TransferThread::internalStringTostring(this->file));
+ }
+ internalCloseSlot();
+ /* try bypass the bug
+ return;//better than hard shutdown
+ abort();
+ emit internalStartClose();*/
isOpen.acquire();
isOpen.release();
}
if(isInReadLoop)
{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already readding: "+file.absoluteFilePath().toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already readding: "+TransferThread::internalStringTostring(file));
return;
}
if(tryStartRead)
{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already try read: "+file.absoluteFilePath().toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already try read: "+TransferThread::internalStringTostring(file));
return;
}
stopIt=false;
fakeMode=false;
lastGoodPosition=0;
- this->file.setFileName(file.absoluteFilePath());
+ this->file=file;
this->mode=mode;
emit internalStartOpen();
}
@@ -102,7 +135,7 @@ void ReadThread::stop()
#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
waitNewClockForSpeed.release();
#endif
- if(isOpen.available()<=0)
+ //if(isOpen.available()<=0 || from>=0)
emit internalStartClose();
}
@@ -125,7 +158,11 @@ void ReadThread::resume()
}
else
return;
- if(!file.isOpen())
+ #ifdef Q_OS_UNIX
+ if(from<0)
+ #else
+ if(from==NULL)
+ #endif
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] file is not open");
return;
@@ -136,118 +173,63 @@ void ReadThread::resume()
bool ReadThread::seek(const int64_t &position)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start with: "+std::to_string(position));
- if(position>file.size())
+ if((int64_t)position>size())
return false;
- return file.seek(position);
-}
-int64_t ReadThread::size() const
-{
- return file.size();
-}
-
-void ReadThread::postOperation()
-{
- emit internalStartClose();
+ #ifdef Q_OS_UNIX
+ if(from<0)
+ abort();//internal failure
+ return lseek(from,position,SEEK_SET)==position;
+ #else
+ if(from==NULL)
+ abort();//internal failure
+ LARGE_INTEGER liSize;
+ liSize.QuadPart=position;
+ return SetFilePointerEx(from,liSize,NULL,FILE_BEGIN);
+ #endif
}
-void ReadThread::checkSum()
+int64_t ReadThread::size() const
{
- QByteArray blockArray;
- QCryptographicHash hash(QCryptographicHash::Sha1);
- isInReadLoop=true;
- lastGoodPosition=0;
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- numberOfBlockCopied=0;
- #endif
- seek(0);
- int sizeReaden=0;
- do
+ #ifdef Q_OS_UNIX
+ struct stat st;
+ if(fstat(from, &st)==0)
+ return st.st_size;
+ else
{
- //read one block
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Read;
+ struct stat source_statbuf;
+ #ifdef Q_OS_UNIX
+ if(lstat(TransferThread::internalStringTostring(file).c_str(), &source_statbuf)==0)
+ #else
+ if(stat(TransferThread::internalStringTostring(file).c_str(), &source_statbuf)==0)
#endif
- if(putInPause)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+"] read put in pause");
- if(stopIt)
- return;
- pauseMutex.acquire();
- if(stopIt)
- return;
- }
- blockArray=file.read(blockSize);
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
- #endif
-
- //can be smaller than min block size to do correct speed limitation
- if(blockArray.size()>ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE*1024)
- {
- errorString_internal=tr("Internal error reading the source file:block size out of range").toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Internal error reading the source file:block size out of range");
- emit error();
- isInReadLoop=false;
- return;
- }
- if(file.error()!=QFile::NoError)
- {
- errorString_internal=tr("Unable to read the source file: ").toStdString()+file.errorString().toStdString()+" ("+std::to_string(file.error())+")";
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("file.error()!=QFile::NoError: %1, error: ").arg(QString::number(file.error())).toStdString()+errorString_internal);
- emit error();
- isInReadLoop=false;
- return;
- }
- sizeReaden=blockArray.size();
- if(sizeReaden>0)
- {
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Checksum;
- #endif
- hash.addData(blockArray);
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
- #endif
-
- if(stopIt)
- break;
-
- lastGoodPosition+=blockArray.size();
-
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- //wait for limitation speed if stop not query
- if(multiForBigSpeed>0)
- {
- numberOfBlockCopied++;
- if(numberOfBlockCopied>=multiForBigSpeed)
- {
- numberOfBlockCopied=0;
- waitNewClockForSpeed.acquire();
- if(stopIt)
- break;
- }
- }
- #endif
- }
- }
- while(sizeReaden>0 && !stopIt);
- if(lastGoodPosition>file.size())
- {
- errorString_internal=tr("File truncated during the read, possible data change").toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Source truncated during the read: %1 (%2)").arg(file.errorString()).arg(QString::number(file.error())).toStdString());
- emit error();
- isInReadLoop=false;
- return;
+ return source_statbuf.st_size;
+ else
+ return -1;
}
- isInReadLoop=false;
- if(stopIt)
+ #else
+ LARGE_INTEGER lpFileSize;
+ if(!GetFileSizeEx(from,&lpFileSize))
{
- stopIt=false;
- return;
+ WIN32_FILE_ATTRIBUTE_DATA sourceW;
+ if(GetFileAttributesExW(file.c_str(),GetFileExInfoStandard,&sourceW))
+ {
+ uint64_t size=sourceW.nFileSizeHigh;
+ size<<=32;
+ size|=sourceW.nFileSizeLow;
+ return size;
+ }
+ else
+ return -1;
}
- emit checksumFinish(hash.result());
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop the read");
+ else
+ return lpFileSize.QuadPart;
+ #endif
+}
+
+void ReadThread::postOperation()
+{
+ emit internalStartClose();
}
bool ReadThread::internalOpenSlot()
@@ -257,7 +239,8 @@ bool ReadThread::internalOpenSlot()
bool ReadThread::internalOpen(bool resetLastGoodPosition)
{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] internalOpen source: "+file.fileName().toStdString()+", open in write because move: "+std::to_string(mode==Ultracopier::Move));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] internalOpen source: "+
+ TransferThread::internalStringTostring(file)+", open in write because move: "+std::to_string(mode==Ultracopier::Move));
if(stopIt)
{
emit closed();
@@ -265,75 +248,170 @@ bool ReadThread::internalOpen(bool resetLastGoodPosition)
}
putInPause=false;
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=InodeOperation;
+ status=InodeOperation;
+ #endif
+ #ifdef Q_OS_UNIX
+ if(from>=0)
+ #else
+ if(from!=NULL)
#endif
- if(file.isOpen())
{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] this file is already open: "+file.fileName().toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] this file is already open: "+TransferThread::internalStringTostring(file));
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
+ status=Idle;
#endif
emit closed();
return false;
}
- QIODevice::OpenMode openMode=QIODevice::ReadOnly;
/*can have permision to remove but not write
* if(mode==Ultracopier::Move)
openMode=QIODevice::ReadWrite;*/
seekToZero=false;
- if(file.open(openMode))
+ #ifdef Q_OS_UNIX
+ from = ::open(TransferThread::internalStringTostring(file).c_str(), O_RDONLY);
+ #else
+ DWORD flags=FILE_ATTRIBUTE_NORMAL;
+ if(os_spec_flags)
+ flags|=FILE_FLAG_SEQUENTIAL_SCAN;
+ from=CreateFileW(file.c_str(),GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,flags,NULL);
+ #endif
+ #ifdef Q_OS_UNIX
+ if(from>=0)
+ #else
+ if(from!=INVALID_HANDLE_VALUE)
+ #endif
{
if(stopIt)
{
- file.close();
+ #ifdef Q_OS_UNIX
+ if(::close(from)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ from=-1;
+ #else
+ if(CloseHandle(from)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ from=NULL;
+ #endif
+ this->file.clear();
emit closed();
return false;
}
pauseMutex.tryAcquire(pauseMutex.available());
#ifdef Q_OS_LINUX
- const int intfd=file.handle();
- if(intfd!=-1)
+ if(os_spec_flags)
{
- posix_fadvise(intfd, 0, 0, POSIX_FADV_WILLNEED);
- posix_fadvise(intfd, 0, 0, POSIX_FADV_SEQUENTIAL);
+ posix_fadvise(from, 0, 0, POSIX_FADV_WILLNEED);
+ posix_fadvise(from, 0, 0, POSIX_FADV_SEQUENTIAL);
+ posix_fadvise(from, 0, 0, POSIX_FADV_NOREUSE);
}
#endif
if(stopIt)
{
- file.close();
+ #ifdef Q_OS_UNIX
+ if(::close(from)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ from=-1;
+ #else
+ if(CloseHandle(from)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ from=NULL;
+ #endif
+ this->file.clear();
emit closed();
return false;
}
- size_at_open=file.size();
- mtime_at_open=QFileInfo(file).lastModified().toMSecsSinceEpoch()/1000;
+
+ //do one at same time
+ #ifdef Q_OS_UNIX
+ {
+ struct stat st;
+ fstat(from, &st);
+ size_at_open=st.st_size;
+ #ifdef Q_OS_MAC
+ mtime_at_open=st.st_mtimespec.tv_sec;
+ #else
+ mtime_at_open=st.st_mtim.tv_sec;
+ #endif
+ }
+ #else
+ {
+ LARGE_INTEGER lpFileSize;
+ GetFileSizeEx(from,&lpFileSize);
+ size_at_open=lpFileSize.QuadPart;
+ FILETIME LastWriteTime;
+ GetFileTime(from,NULL,NULL,&LastWriteTime);
+ mtime_at_open=LastWriteTime;
+ }
+ #endif
+
putInPause=false;
if(resetLastGoodPosition)
lastGoodPosition=0;
if(!seek(lastGoodPosition))
{
- file.close();
- errorString_internal=file.errorString().toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to seek after open: %1, error: %2").arg(file.fileName()).toStdString()+errorString_internal);
+ #ifdef Q_OS_WIN32
+ errorString_internal=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to seek after open: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal
+ );
+ #else
+ int t=errno;
+ errorString_internal=strerror(t);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to seek after open: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal+" ("+std::to_string(t)+")"
+ );
+ #endif
+
+ #ifdef Q_OS_UNIX
+ if(::close(from)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ from=-1;
+ #else
+ if(CloseHandle(from)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ from=NULL;
+ #endif
+ this->file.clear();
+
emit error();
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
+ status=Idle;
#endif
return false;
}
isOpen.acquire();
emit opened();
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
+ status=Idle;
#endif
return true;
}
else
{
- errorString_internal=file.errorString().toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to open: %1, error: ").arg(file.fileName()).toStdString()+errorString_internal);
+ #ifdef Q_OS_WIN32
+ from=NULL;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ DWORD e = GetLastError();
+ #endif
+ errorString_internal=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to open: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal+" ("+std::to_string(e)+")"
+ );
+ #else
+ int t=errno;
+ errorString_internal=strerror(t);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to open: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal+" ("+std::to_string(t)+")"
+ );
+ #endif
+
emit error();
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
+ status=Idle;
#endif
return false;
}
@@ -341,15 +419,23 @@ bool ReadThread::internalOpen(bool resetLastGoodPosition)
void ReadThread::internalRead()
{
+ if(writeThread==nullptr)
+ abort();
isInReadLoop=true;
tryStartRead=false;
if(stopIt)
{
- if(seekToZero && file.isOpen())
+ if(seekToZero &&
+ #ifdef Q_OS_WIN32
+ from!=NULL
+ #else
+ from>=0
+ #endif
+ )
{
stopIt=false;
lastGoodPosition=0;
- file.seek(0);
+ seek(0);
}
else
{
@@ -360,23 +446,27 @@ void ReadThread::internalRead()
}
}
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=InodeOperation;
+ status=InodeOperation;
#endif
int sizeReaden=0;
- if(!file.isOpen())
+ #ifdef Q_OS_WIN32
+ if(from==NULL)
+ #else
+ if(from<0)
+ #endif
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] is not open!");
isInReadLoop=false;
return;
}
- QByteArray blockArray;
+ char * data=NULL;
#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
numberOfBlockCopied=0;
#endif
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start the copy");
emit readIsStarted();
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
+ status=Idle;
#endif
if(stopIt)
{
@@ -408,29 +498,66 @@ void ReadThread::internalRead()
}
}
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Read;
+ status=Read;
+ #endif
+ data=(char *)malloc(blockSize);
+ if(data==NULL)
+ {
+ errorString_internal="Out of memory";
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to read the source file: "+TransferThread::internalStringTostring(file)+
+ ", error: "+"Out of memory"
+ );
+ isInReadLoop=false;
+ emit error();
+ return;
+ }
+ #ifdef Q_OS_WIN32
+ DWORD lpNumberOfBytesRead=0;
+ const BOOL retRead=ReadFile(from,data,blockSize,
+ &lpNumberOfBytesRead,NULL);
+ sizeReaden=lpNumberOfBytesRead;
+ #else
+ sizeReaden=::read(from,data,blockSize);
#endif
- blockArray=file.read(blockSize);
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
+ status=Idle;
#endif
- if(file.error()!=QFile::NoError)
+ #ifdef Q_OS_WIN32
+ if(retRead==FALSE)
+ #else
+ if(sizeReaden<0)
+ #endif
{
- errorString_internal=tr("Unable to read the source file: ").toStdString()+file.errorString().toStdString()+" ("+std::to_string(file.error())+")";
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("file.error()!=QFile::NoError: %1, error: ").arg(QString::number(file.error())).toStdString()+errorString_internal);
+ #ifdef Q_OS_WIN32
+ errorString_internal=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to read the source file: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal
+ );
+ #else
+ int t=errno;
+ errorString_internal=tr("Unable to read the source file: ").toStdString()+strerror(t);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to read the source file: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal+" ("+std::to_string(t)+")"
+ );
+ #endif
isInReadLoop=false;
emit error();
return;
}
- sizeReaden=blockArray.size();
if(sizeReaden>0)
{
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=WaitWritePipe;
+ status=WaitWritePipe;
#endif
- if(!writeThread->write(blockArray))//speed limitation here
+ if(!writeThread->write(data,sizeReaden))//speed limitation here
{
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Idle;
+ #endif
if(!stopIt)
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stopped because the write is stopped: "+std::to_string(lastGoodPosition));
@@ -439,7 +566,7 @@ void ReadThread::internalRead()
}
#ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
+ status=Idle;
#endif
if(stopIt)
@@ -449,7 +576,7 @@ void ReadThread::internalRead()
internalClose();//need re-open the destination and then the source
return;
}
- lastGoodPosition+=blockArray.size();
+ lastGoodPosition+=sizeReaden;
}
/*
if(lastGoodPosition>16*1024)
@@ -463,10 +590,11 @@ void ReadThread::internalRead()
*/
}
while(sizeReaden>0 && !stopIt);
- if(lastGoodPosition>file.size())
+ if(lastGoodPosition>size())
{
errorString_internal=tr("File truncated during the read, possible data change").toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Source truncated during the read: %1 (%2)").arg(file.errorString()).arg(QString::number(file.error())).toStdString());
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Source truncated during the read");
isInReadLoop=false;
emit error();
return;
@@ -477,6 +605,7 @@ void ReadThread::internalRead()
stopIt=false;
return;
}
+ postOperation();
emit readIsStopped();//will product by signal connection writeThread->endIsDetected();
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop the read");
}
@@ -510,10 +639,23 @@ void ReadThread::internalClose(bool callByTheDestructor)
bool closeTheFile=false;
if(!fakeMode)
{
- if(file.isOpen())
+ #ifdef Q_OS_UNIX
+ if(from>=0)
+ #else
+ if(from!=NULL)
+ #endif
{
closeTheFile=true;
- file.close();
+ #ifdef Q_OS_UNIX
+ if(::close(from)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ from=-1;
+ #else
+ if(CloseHandle(from)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ from=NULL;
+ #endif
+ this->file.clear();
isInReadLoop=false;
}
}
@@ -585,15 +727,10 @@ void ReadThread::fakeReadIsStarted()
/// \brief do the fake writeIsStopped
void ReadThread::fakeReadIsStopped()
{
+ postOperation();
emit readIsStopped();
}
-/// do the checksum
-void ReadThread::startCheckSum()
-{
- emit internalStartChecksum();
-}
-
int64_t ReadThread::getLastGoodPosition() const
{
/*if(lastGoodPosition>file.size())
@@ -622,12 +759,50 @@ bool ReadThread::internalReopen()
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
stopIt=false;
- if(file.isOpen())
+ #ifdef Q_OS_UNIX
+ if(from>=0)
+ #else
+ if(from!=NULL)
+ #endif
{
- file.close();
+ #ifdef Q_OS_UNIX
+ if(::close(from)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ from=-1;
+ #else
+ if(CloseHandle(from)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ from=NULL;
+ #endif
+ this->file.clear();
isOpen.release();
}
- if(size_at_open!=file.size() && mtime_at_open!=(uint64_t)QFileInfo(file).lastModified().toMSecsSinceEpoch()/1000)
+ int64_t temp_size=-1;
+ #ifdef Q_OS_UNIX
+ uint64_t temp_mtime=0;
+ {
+ struct stat st;
+ if(::stat(TransferThread::internalStringTostring(file).c_str(), &st)!=-1)
+ {
+ temp_size=st.st_size;
+ #ifdef Q_OS_MAC
+ temp_mtime=st.st_mtimespec.tv_sec;
+ #else
+ temp_mtime=st.st_mtim.tv_sec;
+ #endif
+ }
+ }
+ if(size_at_open!=temp_size || mtime_at_open!=temp_mtime)
+ #else
+ FILETIME temp_mtime;
+ {
+ LARGE_INTEGER FileSize;
+ GetFileSizeEx(from,&FileSize);
+ temp_size=FileSize.QuadPart;
+ GetFileTime(from,NULL,NULL,&temp_mtime);
+ }
+ if(size_at_open!=temp_size || mtime_at_open.dwLowDateTime!=temp_mtime.dwLowDateTime || mtime_at_open.dwHighDateTime!=temp_mtime.dwHighDateTime)
+ #endif
{
ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] source file have changed since the last open, restart all");
//fix this function like the close function
@@ -650,6 +825,7 @@ bool ReadThread::internalReopen()
else
return false;
}
+ return false;
}
//set the write thread
@@ -681,7 +857,11 @@ void ReadThread::isInWait()
{
stopIt=false;
seekToZero=false;
- if(file.isOpen())
+ #ifdef Q_OS_UNIX
+ if(from>=0)
+ #else
+ if(from!=NULL)
+ #endif
{
lastGoodPosition=0;
seek(0);
@@ -697,3 +877,7 @@ bool ReadThread::isReading() const
return isInReadLoop;
}
+void ReadThread::setOsSpecFlags(bool os_spec_flags)
+{
+ this->os_spec_flags=os_spec_flags;
+}
diff --git a/plugins/CopyEngine/Ultracopier/ReadThread.h b/plugins/CopyEngine/Ultracopier-Spec/async/ReadThread.h
index f817e35..4de0129 100644..100755
--- a/plugins/CopyEngine/Ultracopier/ReadThread.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/async/ReadThread.h
@@ -9,14 +9,24 @@
#include <QThread>
#include <QByteArray>
#include <QSemaphore>
-#include <QDateTime>
-#include <QFileInfo>
#include <QCryptographicHash>
+#ifdef Q_OS_WIN32
+#include <windows.h>
+#endif
+
#include "WriteThread.h"
-#include "Environment.h"
-#include "StructEnumDefinition_CopyEngine.h"
-#include "AvancedQFile.h"
+#include "../Environment.h"
+#include "../StructEnumDefinition_CopyEngine.h"
+#include "../CopyEngineUltracopier-SpecVariable.h"
+
+#ifdef WIDESTRING
+#define INTERNALTYPEPATH std::wstring
+#define INTERNALTYPECHAR wchar_t
+#else
+#define INTERNALTYPEPATH std::string
+#define INTERNALTYPECHAR char
+#endif
/// \brief Thread changed to open/close and read the source file
class ReadThread : public QThread
@@ -29,7 +39,7 @@ protected:
void run();
public:
/// \brief open with the name and copy mode
- void open(const QFileInfo &file, const Ultracopier::CopyMode &mode);
+ void openRead(const INTERNALTYPEPATH &file, const Ultracopier::CopyMode &mode);
/// \brief return the error string
std::string errorString() const;
//QByteArray read(qint64 position,qint64 maxSize);
@@ -49,7 +59,7 @@ public:
/// \brief set the current max speed in KB/s
void setMultiForBigSpeed(const int &multiForBigSpeed);
#endif
- /// \brief set block size in KB
+ /// \brief set block size in KB mostly for speed
bool setBlockSize(const int blockSize);
/// \brief reopen after an error
void reopen();
@@ -64,10 +74,9 @@ public:
Idle=0,
InodeOperation=1,
Read=2,
- WaitWritePipe=3,
- Checksum=4
+ WaitWritePipe=3
};
- ReadStat stat;
+ ReadStat status;
#endif
/// \brief return if it's reading
bool isReading() const;
@@ -81,14 +90,12 @@ public:
void fakeReadIsStarted();
/// \brief do the fake readIsStopped
void fakeReadIsStopped();
- /// do the checksum
- void startCheckSum();
+
+ void setOsSpecFlags(bool os_spec_flags);
public slots:
/// \brief to reset the copy, and put at the same state when it just open
void seekToZeroAndWait();
void postOperation();
- /// do the checksum
- void checkSum();
signals:
void error() const;
void opened() const;
@@ -99,10 +106,8 @@ signals:
void checkIfIsWait() const;
void resumeAfterErrorByRestartAll() const;
void resumeAfterErrorByRestartAtTheLastPosition() const;
- void checksumFinish(const QByteArray&) const;
// internal signals
void internalStartOpen() const;
- void internalStartChecksum() const;
void internalStartReopen() const;
void internalStartRead() const;
void internalStartClose() const;
@@ -111,9 +116,9 @@ signals:
private:
std::string errorString_internal;
- AvancedQFile file;
volatile bool stopIt;
Ultracopier::CopyMode mode;
+ bool os_spec_flags;
int64_t lastGoodPosition;
volatile int blockSize;//in Bytes
#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
@@ -130,10 +135,21 @@ private:
volatile bool seekToZero;
volatile bool tryStartRead;
int64_t size_at_open;
+ #ifdef Q_OS_UNIX
uint64_t mtime_at_open;
+ #else
+ FILETIME mtime_at_open;
+ #endif
bool fakeMode;
//internal function
bool seek(const int64_t &position);/// \todo search if is use full
+
+ #ifdef Q_OS_UNIX
+ int from;
+ #else
+ HANDLE from;
+ #endif
+ INTERNALTYPEPATH file;
private slots:
bool internalOpen(bool resetLastGoodPosition=true);
bool internalOpenSlot();
diff --git a/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp b/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp
new file mode 100755
index 0000000..b5af928
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.cpp
@@ -0,0 +1,1442 @@
+//presume bug linked as multple paralelle inode to resume after "overwrite"
+//then do overwrite node function to not re-set the file name
+
+#include "TransferThreadAsync.h"
+#include <string>
+#include <dirent.h>
+
+#ifdef Q_OS_WIN32
+#include <accctrl.h>
+#include <aclapi.h>
+#include <winbase.h>
+
+#define REPARSE_MOUNTPOINT_HEADER_SIZE 8
+
+typedef struct _REPARSE_DATA_BUFFER {
+ ULONG ReparseTag;
+ USHORT ReparseDataLength;
+ USHORT Reserved;
+ union {
+ struct {
+ USHORT SubstituteNameOffset;
+ USHORT SubstituteNameLength;
+ USHORT PrintNameOffset;
+ USHORT PrintNameLength;
+ ULONG Flags;
+ WCHAR PathBuffer[1];
+ } SymbolicLinkReparseBuffer;
+ struct {
+ USHORT SubstituteNameOffset;
+ USHORT SubstituteNameLength;
+ USHORT PrintNameOffset;
+ USHORT PrintNameLength;
+ WCHAR PathBuffer[1];
+ } MountPointReparseBuffer;
+ struct {
+ UCHAR DataBuffer[1];
+ } GenericReparseBuffer;
+ } DUMMYUNIONNAME;
+} REPARSE_DATA_BUFFER, *PREPARSE_DATA_BUFFER;
+
+/*memo> HANDLE hToken = NULL;
+TOKEN_PRIVILEGES tp;
+try {
+ if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)) throw ::GetLastError();
+ if (!::LookupPrivilegeValue(NULL, SE_RESTORE_NAME, &tp.Privileges[0].Luid)) throw ::GetLastError();
+ tp.PrivilegeCount = 1;
+ tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
+ if (!::AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL)) throw ::GetLastError();
+}
+catch (DWORD) {
+ ok=false;
+}
+if (hToken)
+ ::CloseHandle(hToken);*/
+#endif
+
+#include "../../../../cpp11addition.h"
+
+#ifndef Q_OS_WIN32
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#endif
+
+TransferThreadAsync::TransferThreadAsync() :
+ transferProgression(0)
+{
+ haveStartTime=false;
+ #ifndef Q_OS_UNIX
+ PSecurityD=NULL;
+ dacl=NULL;
+ #endif
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+QStringLiteral("] start: ")+QString::number((qint64)QThread::currentThreadId())));
+ //the error push
+ readThread.setWriteThread(&writeThread);
+
+ TransferThread::run();
+ if(!connect(this,&TransferThreadAsync::internalStartPostOperation, this, &TransferThreadAsync::doFilePostOperation, Qt::QueuedConnection))
+ abort();
+
+ //the thread change operation
+ if(!connect(this,&TransferThread::internalStartPreOperation, this, &TransferThreadAsync::preOperation, Qt::QueuedConnection))
+ abort();
+ if(!connect(this,&TransferThread::internalStartPostOperation, this, &TransferThreadAsync::postOperation, Qt::QueuedConnection))
+ abort();
+ if(!connect(this,&TransferThread::internalTryStartTheTransfer, this, &TransferThreadAsync::internalStartTheTransfer, Qt::QueuedConnection))
+ abort();
+
+ //the error push
+ if(!connect(&readThread,&ReadThread::error, this, &TransferThreadAsync::read_error, Qt::QueuedConnection))
+ abort();
+ if(!connect(&writeThread,&WriteThread::error, this, &TransferThreadAsync::write_error, Qt::QueuedConnection))
+ abort();
+ //the state change operation
+ if(!connect(&readThread,&ReadThread::readIsStopped, this, &TransferThreadAsync::read_readIsStopped, Qt::QueuedConnection))
+ abort();
+ if(!connect(&readThread,&ReadThread::readIsStopped, &writeThread, &WriteThread::endIsDetected, Qt::QueuedConnection))
+ abort();
+ if(!connect(&readThread,&ReadThread::closed, this, &TransferThreadAsync::read_closed, Qt::QueuedConnection))
+ abort();
+ if(!connect(&writeThread,&WriteThread::closed, this, &TransferThreadAsync::write_closed, Qt::QueuedConnection))
+ abort();
+
+ if(!connect(this, &TransferThreadAsync::openRead,&readThread,&ReadThread::openRead, Qt::QueuedConnection))
+ abort();
+ if(!connect(this, &TransferThreadAsync::openWrite,&writeThread,&WriteThread::openWrite, Qt::QueuedConnection))
+ abort();
+
+ //when both is ready, startRead()
+ if(!connect(&readThread,&ReadThread::opened, this, &TransferThreadAsync::read_opened, Qt::QueuedConnection))
+ abort();
+ if(!connect(&writeThread,&WriteThread::opened, this, &TransferThreadAsync::write_opened, Qt::QueuedConnection))
+ abort();
+
+ //error management
+/* if(!connect(&readThread,&ReadThread::isSeekToZeroAndWait, this, &TransferThreadAsync::readThreadIsSeekToZeroAndWait, Qt::QueuedConnection))
+ abort();
+ if(!connect(&readThread,&ReadThread::resumeAfterErrorByRestartAtTheLastPosition,this, &TransferThreadAsync::readThreadResumeAfterError, Qt::QueuedConnection))
+ abort();
+ if(!connect(&readThread,&ReadThread::resumeAfterErrorByRestartAll,&writeThread, &WriteThread::flushAndSeekToZero, Qt::QueuedConnection))
+ abort();
+ if(!connect(&writeThread,&WriteThread::flushedAndSeekedToZero, this, &TransferThread::readThreadResumeAfterError, Qt::QueuedConnection))
+ abort();*/
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(!connect(&readThread,&ReadThread::debugInformation, this, &TransferThreadAsync::debugInformation, Qt::QueuedConnection))
+ abort();
+ if(!connect(&writeThread,&WriteThread::debugInformation, this, &TransferThreadAsync::debugInformation, Qt::QueuedConnection))
+ abort();
+ if(!connect(&driveManagement,&DriveManagement::debugInformation,this, &TransferThreadAsync::debugInformation, Qt::QueuedConnection))
+ abort();
+ #endif
+
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start: "+std::to_string((int64_t)QThread::currentThreadId()));
+ start();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop: "+std::to_string((int64_t)QThread::currentThreadId()));
+}
+
+TransferThreadAsync::~TransferThreadAsync()
+{
+ #ifdef Q_OS_WIN32
+ stopItWin=1;
+ #endif
+ stopIt=true;
+ readThread.stop();
+ readThread.exit();
+ readThread.wait();
+ writeThread.stop();
+ writeThread.exit();
+ writeThread.wait();
+ exit(0);
+ wait();
+ //else cash without this disconnect
+ //disconnect(&readThread);
+ //disconnect(&writeThread);
+ #ifndef Q_OS_UNIX
+ if(PSecurityD!=NULL)
+ {
+ //free(PSecurityD);
+ PSecurityD=NULL;
+ }
+ if(dacl!=NULL)
+ {
+ //free(dacl);
+ dacl=NULL;
+ }
+ #endif
+}
+
+void TransferThreadAsync::run()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start: "+std::to_string((int64_t)QThread::currentThreadId()));
+ moveToThread(this);
+ exec();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop: "+std::to_string((int64_t)QThread::currentThreadId()));
+}
+
+void TransferThreadAsync::startTheTransfer()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] start"));
+ if(transferId==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't start transfert if transferId==0"));
+ return;
+ }
+ startTransferTime.restart();
+ haveTransferTime=true;
+ emit internalTryStartTheTransfer();
+}
+
+void TransferThreadAsync::internalStartTheTransfer()
+{
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(QThread::currentThread()!=this)
+ abort();
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] start"));
+ if(transfer_stat==TransferStat_Idle)
+ {
+ if(mode!=Ultracopier::Move)
+ {
+ /// \bug can pass here because in case of direct move on same media, it return to idle stat directly
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't start transfert at idle"));
+ }
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] start"));
+ if(transfer_stat==TransferStat_PostOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't start transfert at PostOperation"));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] start"));
+ if(transfer_stat==TransferStat_Transfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't start transfert at Transfer"));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] start"));
+ if(canStartTransfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] canStartTransfer is already set to true"));
+ // call for second time, first time was not ready, if blocked in preop why?
+ //ifCanStartTransfer();
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] check how start the transfer"));
+ canStartTransfer=true;
+
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] start directly the transfer"));
+ ifCanStartTransfer();
+}
+
+bool TransferThreadAsync::setFiles(const INTERNALTYPEPATH& source, const int64_t &size, const INTERNALTYPEPATH& destination, const Ultracopier::CopyMode &mode)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start, source: "+TransferThread::internalStringTostring(source)+
+ ", destination: "+TransferThread::internalStringTostring(destination));
+ if(transfer_stat!=TransferStat_Idle)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+TransferThread::internalStringTostring(source)+
+ ", destination: "+TransferThread::internalStringTostring(destination));
+ return false;
+ }
+ if(!isRunning())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] The current thread is not running");
+ if(!TransferThread::setFiles(source,size,destination,mode))
+ return false;
+ transferProgression=0;
+ //transferSize=0;//set by ListThread at currentTransferThread->transferSize=currentActionToDoTransfer.size; very important to do parallel small file
+ sended_state_readStopped=false;
+ readIsClosedVariable=false;
+ writeIsClosedVariable=false;
+ readIsOpenVariable=false;
+ writeIsOpenVariable=false;
+ realMove=false;
+ return true;
+}
+
+void TransferThreadAsync::resetExtraVariable()
+{
+ transferProgression=0;
+ readIsOpenVariable=false;
+ writeIsOpenVariable=false;
+ TransferThread::resetExtraVariable();
+}
+
+bool TransferThreadAsync::remainFileOpen() const
+{
+ return remainSourceOpen() || remainDestinationOpen();
+}
+
+bool TransferThreadAsync::remainSourceOpen() const
+{
+ return !readIsClosedVariable;
+}
+
+bool TransferThreadAsync::remainDestinationOpen() const
+{
+ return !writeIsClosedVariable;
+}
+
+void TransferThreadAsync::preOperation()
+{
+ if(transfer_stat!=TransferStat_PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+
+ TransferThread::internalStringTostring(source)+", destination: "+TransferThread::internalStringTostring(destination)
+ +" transfer_stat: "+std::to_string(transfer_stat));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start: source: "+
+ TransferThread::internalStringTostring(source)+", destination: "+TransferThread::internalStringTostring(destination));
+ haveStartTime=true;
+ needRemove=false;
+ if(isSame())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] is same "+
+ TransferThread::internalStringTostring(source)+" than "+TransferThread::internalStringTostring(destination));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after is same");
+ /*Why this code?
+ if(readError)
+ {
+ readError=false;
+ return;
+ }*/
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] before destination exists");
+ if(destinationExists())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] destination exists: "+TransferThread::internalStringTostring(destination));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after destination exists");
+ /*Why this code?
+ if(readError)
+ {
+ readError=false;
+ return;
+ }*/
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] before keep date");
+ #ifdef Q_OS_WIN32
+ doTheDateTransfer=!is_symlink(source);
+ #else
+ doTheDateTransfer=true;
+ #endif
+ if(doTheDateTransfer)
+ {
+ doTheDateTransfer=readSourceFileDateTime(source);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after keep date");
+ #ifdef Q_OS_MAC
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] read the source time: "+std::to_string(butime.modtime));
+ #endif
+ if(!doTheDateTransfer)
+ {
+ //will have the real error at source open
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] unable to read the source time: "+TransferThread::internalStringTostring(source));
+ if(keepDate)
+ {
+ emit errorOnFile(source,tr("Wrong modification date or unable to get it, you can disable time transfer to do it").toStdString());
+ return;
+ }
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] before perm");
+ if(doRightTransfer)
+ havePermission=readSourceFilePermissions(source);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after perm");
+ transfer_stat=TransferStat_WaitForTheTransfer;
+ ifCanStartTransfer();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit preOperationStopped()");
+ emit preOperationStopped();
+}
+
+void TransferThreadAsync::postOperation()
+{
+ doFilePostOperation();
+}
+
+#ifdef Q_OS_WIN32
+DWORD CALLBACK progressRoutine(
+ LARGE_INTEGER TotalFileSize,
+ LARGE_INTEGER TotalBytesTransferred,
+ LARGE_INTEGER StreamSize,
+ LARGE_INTEGER StreamBytesTransferred,
+ DWORD dwStreamNumber,
+ DWORD dwCallbackReason,
+ HANDLE hSourceFile,
+ HANDLE hDestinationFile,
+ LPVOID lpData
+)
+{
+ (void)TotalFileSize;
+ (void)TotalBytesTransferred;
+ (void)StreamSize;
+ (void)StreamBytesTransferred;
+ (void)dwStreamNumber;
+ (void)dwCallbackReason;
+ (void)hSourceFile;
+ (void)hDestinationFile;
+ (void)lpData;
+
+ static_cast<TransferThreadAsync *>(lpData)->setProgression(TotalBytesTransferred.QuadPart,TotalFileSize.QuadPart);
+ return PROGRESS_CONTINUE;
+}
+
+void TransferThreadAsync::setProgression(const uint64_t &pos, const uint64_t &size)
+{
+ if(transfer_stat==TransferStat_Transfer)
+ {
+ if(pos==size)
+ emit readStopped();
+ transferProgression=pos;
+ }
+}
+#endif
+
+/// \brief set buffer
+void TransferThreadAsync::setBuffer(const bool buffer)
+{
+ writeThread.buffer=buffer;
+}
+
+void TransferThreadAsync::ifCanStartTransfer()
+{
+ realMove=false;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start "+internalStringTostring(source)+"->"+internalStringTostring(destination));
+ if(transfer_stat!=TransferStat_WaitForTheTransfer /*wait preoperation*/ || !canStartTransfer/*wait start call*/)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+
+ "] transfer_stat:"+std::to_string(transfer_stat)+
+ ", canStartTransfer: "+std::to_string(canStartTransfer));
+ //preOperationStopped();//tiger to seam maybe is can be started, maybe this generate a bug
+ return;
+ }
+ transfer_stat=TransferStat_Transfer;
+
+ #ifdef WIDESTRING
+ const size_t destinationIndex=destination.rfind(L'/');
+ if(destinationIndex!=std::string::npos && destinationIndex<destination.size())
+ {
+ const std::wstring &path=destination.substr(0,destinationIndex);
+ if(!is_dir(path))
+ if(!TransferThread::mkpath(path))
+ {
+ #ifdef Q_OS_WIN32
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to create the destination folder: "+internalStringTostring(path)+" "+TransferThread::GetLastErrorStdStr());
+ emit errorOnFile(destination,tr("Unable to create the destination folder: ").toStdString()+TransferThread::GetLastErrorStdStr());
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to create the destination folder: "+internalStringTostring(path)+" "+std::to_string(errno));
+ emit errorOnFile(destination,tr("Unable to create the destination folder, errno: %1").arg(QString::number(errno)).toStdString());
+ #endif
+ return;
+ }
+ }
+ #else
+ const size_t destinationIndex=destination.rfind('/');
+ if(destinationIndex!=std::string::npos && destinationIndex<destination.size())
+ {
+ const std::string &path=destination.substr(0,destinationIndex);
+ if(!is_dir(path))
+ if(!TransferThread::mkpath(path))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to create the destination folder: "+path);
+ #ifdef Q_OS_WIN32
+ emit errorOnFile(destination,tr("Unable to create the destination folder: ")+TransferThread::GetLastErrorStdStr());
+ #else
+ emit errorOnFile(destination,tr("Unable to create the destination folder, errno: %1").arg(QString::number(errno)).toStdString());
+ #endif
+ return;
+ }
+ }
+ #endif
+
+ /* http://www.flexhex.com/docs/articles/hard-links.phtml
+ * Do here the smblink logic
+ * Under windows: BOOLEAN CreateSymbolicLinkA(
+ LPCSTR lpSymlinkFileName,
+ LPCSTR lpTargetFileName,
+ DWORD dwFlags
+ unix: int symlink(const char *target, const char *linkpath);
+);
+
+ */
+
+ emit pushStat(transfer_stat,transferId);
+ realMove=(mode==Ultracopier::Move && driveManagement.isSameDrive(
+ internalStringTostring(source),
+ internalStringTostring(destination)
+ ));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start copy");
+ needRemove=true;
+ bool successFull=false;
+ readError=false;
+ writeError=false;
+ if(realMove)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start real move");
+ successFull=TransferThread::rename(source,destination);
+ #ifdef Q_OS_UNIX
+ if(!successFull && errno==18)
+ {
+ //try full move
+ realMove=false;
+ openRead(source,mode);
+ openWrite(destination,0);
+ return;
+ }
+ #endif
+ }
+ else
+ {
+ #ifdef Q_OS_WIN32
+ bool isJunction=false;
+ bool isSymlink=false;
+ WIN32_FILE_ATTRIBUTE_DATA fileInfo;
+ BOOL r = GetFileAttributesExW(TransferThread::toFinalPath(source).c_str(), GetFileExInfoStandard, &fileInfo);
+ if(r != FALSE)
+ {
+ /*isJunction = fileInfo.dwFileAttributes != INVALID_FILE_ATTRIBUTES &&
+ (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT);*/
+ isSymlink = fileInfo.dwFileAttributes != INVALID_FILE_ATTRIBUTES &&
+ (fileInfo.dwFileAttributes & FILE_ATTRIBUTE_REPARSE_POINT);
+ }
+ if(isSymlink)
+ {
+ BYTE buf[MAXIMUM_REPARSE_DATA_BUFFER_SIZE];
+ REPARSE_DATA_BUFFER& ReparseBuffer = (REPARSE_DATA_BUFFER&)buf;
+ DWORD dwRet=0;
+ HANDLE hDir = ::CreateFile(TransferThread::toFinalPath(source).c_str(), GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if (hDir != INVALID_HANDLE_VALUE)
+ {
+ BOOL ioc = ::DeviceIoControl(hDir, FSCTL_GET_REPARSE_POINT, NULL, 0, &ReparseBuffer,
+ MAXIMUM_REPARSE_DATA_BUFFER_SIZE, &dwRet, NULL);
+ ::CloseHandle(hDir);
+ if(ioc!=FALSE)
+ {
+ if(ReparseBuffer.ReparseTag == IO_REPARSE_TAG_MOUNT_POINT)
+ {
+ //printf("%S\n",ReparseBuffer.MountPointReparseBuffer.PathBuffer);
+ isJunction=true;
+ }
+ else
+ {
+ //printf("%S\n",ReparseBuffer.SymbolicLinkReparseBuffer.PathBuffer);
+ }
+ }
+ else
+ {
+ const std::string &strError=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error: "+
+ GetLastErrorStdStr()+" "+TransferThread::internalStringTostring(source)+"->"+TransferThread::internalStringTostring(destination)+
+ " "+strError
+ );
+ readError=true;
+ writeError=false;
+ emit errorOnFile(source,strError);
+ return;
+ }
+ }
+ else
+ {
+ const std::string &strError=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error: "+
+ GetLastErrorStdStr()+" "+TransferThread::internalStringTostring(source)+"->"+TransferThread::internalStringTostring(destination)+
+ " "+strError
+ );
+ readError=true;
+ writeError=false;
+ emit errorOnFile(source,strError);
+ return;
+ }
+ if(isJunction)//junction
+ {
+ std::wstring cleanPath(ReparseBuffer.MountPointReparseBuffer.PathBuffer);
+ if(cleanPath.substr(0,4)==L"\\??\\")
+ cleanPath=cleanPath.substr(4);
+ successFull=TransferThreadAsync::mkJunction(
+ TransferThread::toFinalPath(destination).c_str(),
+ cleanPath.c_str()
+ );
+ if(successFull==FALSE)
+ {
+ const std::string &strError=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error: "+
+ GetLastErrorStdStr()+" "+TransferThread::internalStringTostring(source)+"->"+TransferThread::internalStringTostring(destination)+
+ " "+strError
+ );
+ readError=true;
+ writeError=true;
+ emit errorOnFile(destination,strError);
+ }
+ }
+ else//symlink or symlinkD
+ {
+ successFull=CopyFileExW(TransferThread::toFinalPath(source).c_str(),TransferThread::toFinalPath(destination).c_str(),
+ (LPPROGRESS_ROUTINE)progressRoutine,this,&stopItWin,COPY_FILE_ALLOW_DECRYPTED_DESTINATION | 0x00000800);//0x00000800 is COPY_FILE_COPY_SYMLINK
+ if(successFull==FALSE)
+ {
+ const std::string &strError=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error: "+
+ GetLastErrorStdStr()+" "+TransferThread::internalStringTostring(source)+"->"+TransferThread::internalStringTostring(destination)+
+ " "+strError
+ );
+ readError=true;
+ writeError=true;
+ emit errorOnFile(destination,strError);
+ }
+ }
+ }
+ else
+ #else
+ if(TransferThread::is_symlink(source))
+ {
+ realMove=true;
+ bool isFileOrSymlink=false;
+ {
+ struct stat p_statbuf;
+ if (lstat(TransferThread::internalStringTostring(destination).c_str(), &p_statbuf) < 0)
+ {}
+ else if (S_ISLNK(p_statbuf.st_mode))
+ isFileOrSymlink=true;
+ else if (S_ISREG(p_statbuf.st_mode))
+ isFileOrSymlink=true;
+ }
+ if(isFileOrSymlink)
+ if(!unlink(destination))
+ {
+ const int terr=errno;
+ if(terr!=2)
+ {
+ const std::string &strError=strerror(terr);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error "+
+ TransferThread::internalStringTostring(source)+"->"+TransferThread::internalStringTostring(destination)+
+ " "+strError+"("+std::to_string(terr)+")"
+ );
+ readError=false;
+ writeError=true;
+ emit errorOnFile(destination,strError);
+ return;
+ }
+ }
+ char buf[PATH_MAX];
+ const ssize_t s=readlink(TransferThread::internalStringTostring(source).c_str(),buf,sizeof(buf));
+ buf[s]=0x00;
+ if(s<0)
+ {
+ const int terr=errno;
+ const std::string &strError=strerror(terr);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error "+
+ TransferThread::internalStringTostring(source)+"->"+TransferThread::internalStringTostring(destination)+
+ " "+strError+"("+std::to_string(terr)+")"
+ );
+ readError=true;
+ writeError=false;
+ emit errorOnFile(source,strError);
+ return;
+ }
+ else
+ {
+ if(symlink(buf,TransferThread::internalStringTostring(destination).c_str())!=0)
+ {
+ const int terr=errno;
+ const std::string &strError=strerror(terr);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error "+
+ buf+"->"+TransferThread::internalStringTostring(destination)+
+ " "+strError+"("+std::to_string(terr)+")"
+ );
+ readError=true;
+ writeError=false;
+ emit errorOnFile(destination,strError);
+ return;
+ }
+ }
+ successFull=true;
+ }
+ else
+ #endif
+ {
+ #ifdef Q_OS_WIN32
+ if(native_copy)
+ {
+ successFull=CopyFileExW(TransferThread::toFinalPath(source).c_str(),TransferThread::toFinalPath(destination).c_str(),
+ (LPPROGRESS_ROUTINE)progressRoutine,this,&stopItWin,COPY_FILE_ALLOW_DECRYPTED_DESTINATION | 0x00000800);//0x00000800 is COPY_FILE_COPY_SYMLINK
+ if(successFull==FALSE)
+ {
+ const std::string &strError=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error: "+
+ GetLastErrorStdStr()+" "+TransferThread::internalStringTostring(source)+"->"+TransferThread::internalStringTostring(destination)+
+ " "+strError
+ );
+ readError=true;
+ writeError=true;
+ emit errorOnFile(destination,strError);
+ }
+ }
+ else
+ #endif
+ {
+ openRead(source,mode);
+ openWrite(destination,0);
+ return;
+ }
+ }
+ }
+ if(!successFull)
+ {
+ #ifdef Q_OS_WIN32
+ const std::string &strError=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error: "+
+ GetLastErrorStdStr()+" "+TransferThread::internalStringTostring(source)+"->"+TransferThread::internalStringTostring(destination)+
+ " "+strError
+ );
+ #else
+ const int terr=errno;
+ const std::string &strError=strerror(terr);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stop copy in error "+
+ TransferThread::internalStringTostring(source)+"->"+TransferThread::internalStringTostring(destination)+
+ " "+strError+"("+std::to_string(terr)+")"
+ );
+ #endif
+ if(stopIt)
+ {
+ if(!source.empty())
+ if(exists(source) && source!=destination)
+ unlink(destination);
+ resetExtraVariable();
+ return;//and reset?
+ }
+ #ifdef Q_OS_WIN32
+ readError=true;
+ writeError=true;
+ emit errorOnFile(destination,strError);
+ #else
+ if(readError)
+ emit errorOnFile(source,strError);
+ else
+ emit errorOnFile(destination,strError);
+ #endif
+ return;
+ }
+ readIsClosedVariable=true;
+ writeIsClosedVariable=true;
+ checkIfAllIsClosedAndDoOperations();
+}
+
+void TransferThreadAsync::checkIfAllIsClosedAndDoOperations()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop copy");
+ if((readError || writeError) && !needSkip && !stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] resolve error before progress");
+ return;
+ }
+ if(remainFileOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] remainFileOpen()");
+ return;
+ }
+ if(!source.empty() && needRemove && (stopIt || needSkip))
+ if(is_file(source) && source!=destination)
+ unlink(destination);
+ transfer_stat=TransferStat_Idle;
+
+ transferSize=readThread.getLastGoodPosition();
+
+ if(mode==Ultracopier::Move && !realMove)
+ if(exists(destination))
+ if(!unlink(source))
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] move and unable to remove: "+
+ TransferThread::internalStringTostring(source)+
+ #ifdef Q_OS_WIN32
+ GetLastErrorStdStr()
+ #else
+ strerror(errno)
+ #endif
+ );
+ transfer_stat=TransferStat_PostTransfer;
+ emit pushStat(transfer_stat,transferId);
+ transfer_stat=TransferStat_PostOperation;
+ emit pushStat(transfer_stat,transferId);
+ doFilePostOperation();
+
+ source.clear();
+ destination.clear();
+ resetExtraVariable();
+ //don't need remove because have correctly finish (it's not in: have started)
+ needRemove=false;
+ needSkip=false;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit postOperationStopped() transfer_stat=TransferStat_Idle");
+ transfer_stat=TransferStat_Idle;
+ emit postOperationStopped();
+}
+
+//stop the current copy
+void TransferThreadAsync::stop()
+{
+ #ifdef Q_OS_WIN32
+ stopItWin=1;
+ #endif
+ stopIt=true;
+ haveStartTime=false;
+ if(transfer_stat==TransferStat_Idle)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] transfer_stat==TransferStat_Idle");
+ return;
+ }
+ if(transfer_stat==TransferStat_PreOperation)
+ {
+ transfer_stat=TransferStat_Idle;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] transfer_stat==TransferStat_PreOperation");
+ return;
+ }
+ if(realMove)
+ {
+ if(readError || writeError)
+ transfer_stat=TransferStat_Idle;
+ return;
+ }
+ readThread.stop();
+ writeThread.stop();
+}
+
+//retry after error
+void TransferThreadAsync::retryAfterError()
+{
+ /// \warning skip the resetExtraVariable(); to be more exact and resolv some bug
+ if(transfer_stat==TransferStat_Idle)
+ {
+ if(transferId==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+
+ ("] seam have bug, source: ")+TransferThread::internalStringTostring(source)+", destination: "+TransferThread::internalStringTostring(destination));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+
+ "] restart all, source: "+TransferThread::internalStringTostring(source)+", destination: "+TransferThread::internalStringTostring(destination));
+ readError=false;
+ //writeError=false;
+ emit internalStartPreOperation();
+ return;
+ }
+ //opening error
+ if(transfer_stat==TransferStat_PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+
+ "] is not idle, source: "+TransferThread::internalStringTostring(source)+", destination: "+TransferThread::internalStringTostring(destination)+
+ ", stat: "+std::to_string(transfer_stat));
+ readError=false;
+ //writeError=false;
+ emit internalStartPreOperation();
+ //tryOpen();-> recheck all, because can be an error into isSame(), rename(), ...
+ return;
+ }
+ //data streaming error
+ if(transfer_stat!=TransferStat_PostOperation && transfer_stat!=TransferStat_Transfer && transfer_stat!=TransferStat_PostTransfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] is not in right stat, source: ")+
+ TransferThread::internalStringTostring(source)+", destination: "+TransferThread::internalStringTostring(destination)+", stat: "+std::to_string(transfer_stat));
+ return;
+ }
+ if(transfer_stat==TransferStat_PostOperation)
+ {
+ emit internalStartPostOperation();
+ return;
+ }
+ emit internalTryStartTheTransfer();
+}
+
+//skip the copy
+void TransferThreadAsync::skip()
+{
+ #ifdef Q_OS_WIN32
+ stopItWin=1;
+ #endif
+ stopIt=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start with stat: "+std::to_string(transfer_stat));
+ switch(static_cast<TransferStat>(transfer_stat))
+ {
+ case TransferStat_WaitForTheTransfer:
+ //needRemove=true;never put that's here, can product destruction of the file
+ case TransferStat_PreOperation:
+ if(needSkip)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] skip already in progress");
+ return;
+ }
+ needSkip=true;
+ //check if all is source and destination is closed
+ if(remainFileOpen())
+ {
+ if(remainSourceOpen())
+ readThread.stop();
+ if(remainDestinationOpen())
+ writeThread.stop();
+ }
+ else // wait nothing, just quit
+ {
+ transfer_stat=TransferStat_PostOperation;
+ emit internalStartPostOperation();
+ }
+ resetExtraVariable();
+ break;
+ case TransferStat_Transfer:
+ if(needSkip)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] skip already in progress");
+ return;
+ }
+ //needRemove=true;never put that's here, can product destruction of the file
+ needSkip=true;
+ if(realMove)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+
+ "] Do the direct FS fake close, realMove: "+std::to_string(realMove));
+ /*readThread.fakeReadIsStarted();
+ writeThread.fakeWriteIsStarted();
+ readThread.fakeReadIsStopped();
+ writeThread.fakeWriteIsStopped();*/
+ emit readStopped();
+ emit postOperationStopped();
+ transfer_stat=TransferStat_Idle;
+ emit pushStat(transfer_stat,transferId);
+ return;
+ }
+ writeThread.flushBuffer();
+ if(remainFileOpen())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] remainFileOpen");
+ if(remainSourceOpen())
+ readThread.stop();
+ if(remainDestinationOpen())
+ writeThread.stop();
+ }
+ else // wait nothing, just quit
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] wait nothing, just quit");
+ transfer_stat=TransferStat_PostOperation;
+ emit internalStartPostOperation();
+ }
+ if(!source.empty() && needRemove)
+ if(exists(source) && source!=destination)
+ unlink(destination);
+ break;
+ case TransferStat_PostTransfer:
+ if(needSkip)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] skip already in progress");
+ return;
+ }
+ //needRemove=true;never put that's here, can product destruction of the file
+ needSkip=true;
+ if(realMove)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] Do the direct FS fake close, realMove: "+std::to_string(realMove));
+ readThread.fakeReadIsStarted();
+ writeThread.fakeWriteIsStarted();
+ readThread.fakeReadIsStopped();
+ writeThread.fakeWriteIsStopped();
+ return;
+ }
+ writeThread.flushBuffer();
+ if(remainFileOpen())
+ {
+ if(remainSourceOpen())
+ readThread.stop();
+ if(remainDestinationOpen())
+ writeThread.stop();
+ }
+ else // wait nothing, just quit
+ {
+ transfer_stat=TransferStat_PostOperation;
+ emit internalStartPostOperation();
+ }
+ break;
+ case TransferStat_PostOperation:
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] can skip in this state: "+std::to_string(transfer_stat));
+ return;
+ }
+ //can be reset
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transfer_stat=TransferStat_Idle");
+ transfer_stat=TransferStat_Idle;
+ //emit to manager with List Thread
+ emit postOperationStopped();
+}
+
+//return info about the copied size
+int64_t TransferThreadAsync::copiedSize()
+{
+ switch(static_cast<TransferStat>(transfer_stat))
+ {
+ case TransferStat_Transfer:
+ case TransferStat_PostOperation:
+ case TransferStat_PostTransfer:
+ return (readThread.getLastGoodPosition()+writeThread.getLastGoodPosition())/2;
+ default:
+ return 0;
+ }
+}
+
+//retry after error
+void TransferThreadAsync::putAtBottom()
+{
+ emit tryPutAtBottom();
+}
+
+#ifdef ULTRACOPIER_PLUGIN_RSYNC
+/// \brief set rsync
+void TransferThreadAsync::setRsync(const bool rsync)
+{
+ this->rsync=rsync;
+}
+#endif
+
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+//to set the id
+void TransferThreadAsync::setId(int id)
+{
+ TransferThread::setId(id);
+}
+
+char TransferThreadAsync::readingLetter() const
+{
+ switch(static_cast<TransferStat>(readThread.status))
+ {
+ case TransferStat_Idle:
+ return '_';
+ break;
+ case TransferStat_PreOperation:
+ return 'I';
+ break;
+ case TransferStat_WaitForTheTransfer:
+ return 'W';
+ break;
+ case TransferStat_Transfer:
+ return 'C';
+ break;
+ case TransferStat_PostTransfer:
+ return 'R';
+ break;
+ case TransferStat_PostOperation:
+ return 'P';
+ break;
+ default:
+ return '?';
+ }
+}
+
+char TransferThreadAsync::writingLetter() const
+{
+ switch(static_cast<TransferStat>(writeThread.status))
+ {
+ case TransferStat_Idle:
+ return '_';
+ break;
+ case TransferStat_PreOperation:
+ return 'I';
+ break;
+ case TransferStat_WaitForTheTransfer:
+ return 'W';
+ break;
+ case TransferStat_Transfer:
+ return 'C';
+ break;
+ case TransferStat_PostTransfer:
+ return 'R';
+ break;
+ case TransferStat_PostOperation:
+ return 'P';
+ break;
+ default:
+ return '?';
+ }
+}
+#endif
+
+//not copied size, ...
+uint64_t TransferThreadAsync::realByteTransfered() const
+{
+ const uint64_t &l=readThread.getLastGoodPosition();
+ switch(static_cast<TransferStat>(transfer_stat))
+ {
+ case TransferStat_Transfer:
+ case TransferStat_PostTransfer:
+ return l;
+ case TransferStat_PostOperation:
+ return l;
+ default:
+ return 0;
+ }
+}
+
+//first is read, second is write
+std::pair<uint64_t, uint64_t> TransferThreadAsync::progression() const
+{
+ std::pair<uint64_t,uint64_t> returnVar;
+ switch(static_cast<TransferStat>(transfer_stat))
+ {
+ case TransferStat_Transfer:
+ returnVar.first=readThread.getLastGoodPosition();
+ returnVar.second=writeThread.getLastGoodPosition();
+ /*if(returnVar.first<returnVar.second)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+QStringLiteral("] read is smaller than write"));*/
+ break;
+ case TransferStat_PostTransfer:
+ returnVar.first=transferSize;
+ returnVar.second=transferSize;
+ /*if(returnVar.first<returnVar.second)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+QStringLiteral("] read is smaller than write"));*/
+ break;
+ case TransferStat_PostOperation:
+ returnVar.first=transferSize;
+ returnVar.second=transferSize;
+ break;
+ default:
+ returnVar.first=0;
+ returnVar.second=0;
+ }
+ return returnVar;
+}
+
+void TransferThreadAsync::setFileExistsAction(const FileExistsAction &action)
+{
+ if(transfer_stat!=TransferStat_PreOperation)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+
+ TransferThread::internalStringTostring(source)+(", destination: ")+TransferThread::internalStringTostring(destination));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] action: ")+std::to_string(action));
+ if(action!=FileExists_Rename)
+ fileExistsAction = action;
+ else
+ {
+ //always rename pass here
+ fileExistsAction = action;
+ alwaysDoFileExistsAction=action;
+ }
+ if(action==FileExists_Skip)
+ {
+ skip();
+ return;
+ }
+ resetExtraVariable();
+ emit internalStartPreOperation();
+}
+
+#ifndef Q_OS_WIN32
+/*bool TransferThreadAsync::copy(const char *from,const char *to)
+{
+ transferProgression=0;
+ int fd_to, fd_from;
+ char buf[4096];
+ ssize_t nread;
+ int saved_errno;
+
+ fd_from = open(from, O_RDONLY);
+ if (fd_from < 0)
+ {
+ readError=true;
+ return false;
+ }
+ #ifdef Q_OS_LINUX
+ posix_fadvise(fd_from, 0, 0, POSIX_FADV_WILLNEED);
+ posix_fadvise(fd_from, 0, 0, POSIX_FADV_SEQUENTIAL);
+ posix_fadvise(fd_from, 0, 0, POSIX_FADV_NOREUSE);
+ #endif
+
+ // | O_DSYNC slow down
+ // | O_SYNC slow down
+ // O_DIRECT Invalid argument
+ int flags=O_WRONLY | O_CREAT;
+ //if(!buffer) flags|=??;
+ fd_to = open(to, flags, 0666);
+ if (fd_to < 0)
+ {
+ writeError=true;
+ goto out_error;
+ }
+ #ifdef Q_OS_LINUX
+ posix_fadvise(fd_to, 0, 0, POSIX_FADV_WILLNEED);
+ posix_fadvise(fd_to, 0, 0, POSIX_FADV_SEQUENTIAL);
+ posix_fadvise(fd_to, 0, 0, POSIX_FADV_NOREUSE);
+ #endif
+
+ while (nread = read(fd_from, buf, sizeof buf), nread > 0)
+ {
+ if(stopIt)
+ {
+ close(fd_to);
+ close(fd_from);
+ return false;
+ }
+ char *out_ptr = buf;
+ ssize_t nwritten;
+
+ do {
+ nwritten = write(fd_to, out_ptr, nread);
+ if(stopIt)
+ {
+ close(fd_to);
+ close(fd_from);
+ return false;
+ }
+
+ if (nwritten >= 0)
+ {
+ nread -= nwritten;
+ out_ptr += nwritten;
+ transferProgression += nwritten;
+ }
+ else if (errno != EINTR)
+ {
+ writeError=true;
+ goto out_error;
+ }
+ } while (nread > 0);
+ }
+
+ if (nread == 0)
+ {
+ ftruncate(fd_to,transferProgression);
+ if (close(fd_to) < 0)
+ {
+ fd_to = -1;
+ readError=true;
+ goto out_error;
+ }
+ if (close(fd_from) < 0)
+ return -1;
+ if(stopIt)
+ return -1;
+
+ emit readStopped();
+ return true;
+ }
+
+ out_error:
+ saved_errno = errno;
+
+ close(fd_from);
+ if (fd_to >= 0)
+ close(fd_to);
+
+ errno = saved_errno;
+ return false;
+}*/
+#endif
+
+//implemente to connect async
+void TransferThreadAsync::read_error()
+{
+ if(readError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] already in read error!");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ fileContentError = true;
+ readError = true;
+ //writeIsReadyVariable = false;//wrong because write can be ready here
+ if(!writeError)//already display error for the write
+ emit errorOnFile(source,readThread.errorString());
+}
+
+void TransferThreadAsync::read_readIsStopped()
+{
+ if(realMove)
+ return;
+ if(!sended_state_readStopped)
+ {
+ sended_state_readStopped=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit readIsStopped()");
+ emit readStopped();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] drop dual read stopped");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ canStartTransfer=false;
+ //check here if need start checksuming or not
+ transfer_stat=TransferStat_PostTransfer;
+ emit pushStat(transfer_stat,transferId);
+}
+
+void TransferThreadAsync::read_closed()
+{
+ if(realMove)
+ return;
+ if(readIsClosedVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] double event dropped"));
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ readIsClosedVariable=true;
+ checkIfAllIsClosedAndDoOperations();
+}
+
+void TransferThreadAsync::write_error()
+{
+ if(writeError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] already in write error!");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ fileContentError = true;
+ writeError = true;
+ if(!readError)//already display error for the read
+ emit errorOnFile(destination,writeThread.errorString());
+}
+
+void TransferThreadAsync::write_closed()
+{
+ if(realMove)
+ return;
+ if(writeIsClosedVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ writeIsClosedVariable=true;
+ if(stopIt && needRemove && source!=destination)
+ {
+ if(is_file(source))
+ unlink(destination);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] try destroy the destination when the source don't exists"));
+ }
+ checkIfAllIsClosedAndDoOperations();
+}
+
+#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+
+
+//set block size in Bytes for speed limitation
+bool TransferThreadAsync::setBlockSize(const unsigned int blockSize)
+{
+ bool read=readThread.setBlockSize(blockSize);
+ bool write=writeThread.setBlockSize(blockSize);
+ return (read && write);
+}
+
+//set the current max speed in KB/s
+void TransferThreadAsync::setMultiForBigSpeed(const int &multiForBigSpeed)
+{
+ readThread.setMultiForBigSpeed(multiForBigSpeed);
+ writeThread.setMultiForBigSpeed(multiForBigSpeed);
+}
+
+void TransferThreadAsync::timeOfTheBlockCopyFinished()
+{
+ readThread.timeOfTheBlockCopyFinished();
+ writeThread.timeOfTheBlockCopyFinished();
+}
+#endif
+
+//pause the copy
+void TransferThreadAsync::pause()
+{
+ //only pause/resume during the transfer of file data
+ //from transfer_stat!=TransferStat_Idle because it resume at wrong order
+ if(transfer_stat!=TransferStat_Transfer && transfer_stat!=TransferStat_PostTransfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] wrong stat to put in pause");
+ return;
+ }
+ haveStartTime=false;
+ readThread.pause();
+ writeThread.pause();
+}
+
+//resume the copy
+void TransferThreadAsync::resume()
+{
+ //only pause/resume during the transfer of file data
+ //from transfer_stat!=TransferStat_Idle because it resume at wrong order
+ if(transfer_stat!=TransferStat_Transfer && transfer_stat!=TransferStat_PostTransfer)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] wrong stat to put in pause");
+ return;
+ }
+ readThread.resume();
+ writeThread.resume();
+}
+
+//when both is ready, startRead()
+void TransferThreadAsync::read_opened()
+{
+ if(readIsOpenVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] already readIsOpenVariable=true");
+ return;
+ }
+ readIsOpenVariable=true;
+ transferSize=readThread.size();
+ if(writeIsOpenVariable)
+ readThread.startRead();
+}
+
+void TransferThreadAsync::write_opened()
+{
+ if(writeIsOpenVariable)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] already writeIsOpenVariable=true");
+ return;
+ }
+ writeIsOpenVariable=true;
+ if(readIsOpenVariable)
+ readThread.startRead();
+}
+
+#ifdef Q_OS_WIN32
+bool TransferThreadAsync::mkJunction(LPCWSTR szJunction, LPCWSTR szPath)
+{
+ BYTE buf[sizeof(REPARSE_DATA_BUFFER) + MAX_PATH * sizeof(WCHAR)];
+ REPARSE_DATA_BUFFER& ReparseBuffer = (REPARSE_DATA_BUFFER&)buf;
+
+ if (!::CreateDirectoryW(szJunction, NULL))
+ return false;
+ HANDLE hDir = ::CreateFileW(szJunction, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OPEN_REPARSE_POINT | FILE_FLAG_BACKUP_SEMANTICS, NULL);
+ if (hDir == INVALID_HANDLE_VALUE)
+ return false;
+
+ memset(buf, 0, sizeof(buf));
+ ReparseBuffer.ReparseTag = IO_REPARSE_TAG_MOUNT_POINT;
+ int len = wcslen(szPath)+1;
+ ReparseBuffer.MountPointReparseBuffer.PrintNameOffset = (len--) * sizeof(WCHAR);
+ ReparseBuffer.MountPointReparseBuffer.SubstituteNameLength = len * sizeof(WCHAR);
+ ReparseBuffer.ReparseDataLength = ReparseBuffer.MountPointReparseBuffer.SubstituteNameLength + 12;
+ wcscpy(ReparseBuffer.MountPointReparseBuffer.PathBuffer, szPath);
+
+ DWORD dwRet;
+ if (!::DeviceIoControl(hDir, FSCTL_SET_REPARSE_POINT, &ReparseBuffer,
+ ReparseBuffer.ReparseDataLength+REPARSE_MOUNTPOINT_HEADER_SIZE, NULL, 0, &dwRet, NULL))
+ {
+ ::CloseHandle(hDir);
+ ::RemoveDirectoryW(szJunction);
+ return false;
+ }
+
+ ::CloseHandle(hDir);
+ return true;
+}
+#endif
+
+void TransferThreadAsync::setOsSpecFlags(bool os_spec_flags)
+{
+ readThread.setOsSpecFlags(os_spec_flags);
+ writeThread.setOsSpecFlags(os_spec_flags);
+}
+
+void TransferThreadAsync::setNativeCopy(bool native_copy)
+{
+ this->native_copy=native_copy;
+}
diff --git a/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.h b/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.h
new file mode 100755
index 0000000..83ddb91
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/async/TransferThreadAsync.h
@@ -0,0 +1,153 @@
+/** \file TransferThreadAsync.h
+\brief Thread changed to manage the inode operation, the signals, canceling, pre and post operations
+\author alpha_one_x86
+\licence GPL3, see the file COPYING */
+
+#include <QObject>
+#include <QTime>
+
+#include <regex>
+#include <vector>
+#include <string>
+#include <utility>
+#include <dirent.h>
+
+//defore the next define
+#include "../CopyEngineUltracopier-SpecVariable.h"
+
+#include "ReadThread.h"
+#include "WriteThread.h"
+
+#ifdef Q_OS_UNIX
+ #include <utime.h>
+ #include <time.h>
+ #include <unistd.h>
+ #include <sys/stat.h>
+#endif
+#ifdef Q_OS_WIN32
+ #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
+ #include <utime.h>
+ #include <time.h>
+ #include <unistd.h>
+ #include <sys/stat.h>
+ #endif
+#endif
+
+#ifdef Q_OS_WIN32
+#include <windows.h>
+#endif
+
+#include "../TransferThread.h"
+#include "../Environment.h"
+#include "../DriveManagement.h"
+#include "../StructEnumDefinition_CopyEngine.h"
+
+#ifndef TransferThreadAsync_H
+#define TransferThreadAsync_H
+
+/// \brief Thread changed to manage the inode operation, the signals, canceling, pre and post operations
+class TransferThreadAsync : public TransferThread
+{
+ Q_OBJECT
+public:
+ explicit TransferThreadAsync();
+ ~TransferThreadAsync();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ /// \brief to set the id
+ void setId(int id);
+ /// \brief get the reading letter
+ char readingLetter() const;
+ /// \brief get the writing letter
+ char writingLetter() const;
+ #endif
+
+ //not copied size, ...
+ uint64_t realByteTransfered() const;
+ std::pair<uint64_t, uint64_t> progression() const;
+ /** \brief to set the speed limitation
+ * -1 if not able, 0 if disabled */
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ //set block size in Bytes for speed limitation
+ bool setBlockSize(const unsigned int blockSize);
+ void setMultiForBigSpeed(const int &multiForBigSpeed);
+ void timeOfTheBlockCopyFinished();
+ void setOsSpecFlags(bool os_spec_flags);
+ void setNativeCopy(bool native_copy);
+ #endif
+ /// \brief pause the copy
+ void pause();
+ /// \brief resume the copy
+ void resume();
+
+ bool haveStartTime;
+ ReadThread readThread;
+ WriteThread writeThread;
+ bool native_copy;
+ void setBuffer(const bool buffer);
+
+ #ifdef Q_OS_WIN32
+ static bool mkJunction(LPCWSTR szJunction, LPCWSTR szPath);
+ #endif
+protected:
+ void run();
+private slots:
+ void preOperation();
+ void postOperation();
+ //force into the right thread
+ void internalStartTheTransfer();
+
+ //implemente to connect async
+ void read_error();
+ void read_readIsStopped();
+ void read_closed();
+ void write_error();
+ void write_closed();
+ void read_opened();
+ void write_opened();
+signals:
+ //internal signal
+ void internalStartResumeAfterErrorAndSeek() const;
+ void internalStartPostOperation() const;
+ //async due to tread conflict on from, if(from>=0) {do something, abort() -> on abort from =-1}
+ void openRead(const INTERNALTYPEPATH &file, const Ultracopier::CopyMode &mode);
+ //async due to tread conflict on to, if(to>=0) {do something, abort() -> on abort to =-1}
+ void openWrite(const INTERNALTYPEPATH &file,const uint64_t &startSize);
+public slots:
+ /// \brief to start the transfer of data
+ void startTheTransfer();
+ /// \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
+ int64_t copiedSize();
+ /// \brief put the current file at bottom
+ void putAtBottom();
+ /// \brief to set files to transfer
+ bool setFiles(const INTERNALTYPEPATH &source, const int64_t &size, const INTERNALTYPEPATH &destination, const Ultracopier::CopyMode &mode);
+ /// \brief to set file exists action to do
+ void setFileExistsAction(const FileExistsAction &action);
+ #ifdef Q_OS_WIN32
+ void setProgression(const uint64_t &pos,const uint64_t &size);
+ #endif
+private:
+ //ready = open + ready to operation (no error to resolv)
+ bool transferIsReadyVariable;
+ uint64_t transferProgression;
+ bool sended_state_readStopped;
+ bool readIsClosedVariable;
+ bool writeIsClosedVariable;
+ bool readIsOpenVariable;
+ bool writeIsOpenVariable;
+ bool realMove;
+ bool remainFileOpen() const;
+ bool remainSourceOpen() const;
+ bool remainDestinationOpen() const;
+ void resetExtraVariable();
+ void ifCanStartTransfer();
+ void checkIfAllIsClosedAndDoOperations();
+};
+
+#endif // TransferThreadAsync_H
diff --git a/plugins/CopyEngine/Ultracopier-Spec/async/WriteThread.cpp b/plugins/CopyEngine/Ultracopier-Spec/async/WriteThread.cpp
new file mode 100755
index 0000000..2d6748e
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/async/WriteThread.cpp
@@ -0,0 +1,1164 @@
+#include "WriteThread.h"
+
+#ifdef Q_OS_LINUX
+#include <fcntl.h>
+#endif
+#include "../TransferThread.h"
+
+#ifdef Q_OS_UNIX
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include <fcntl.h>
+#endif
+
+unsigned int WriteThread::numberOfBlock=ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
+
+WriteThread::WriteThread()
+{
+ deletePartiallyTransferredFiles = true;
+ lastGoodPosition = 0;
+ stopIt = false;
+ isOpen.release();
+ moveToThread(this);
+ setObjectName(QStringLiteral("write"));
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status = Idle;
+ #endif
+ putInPause = false;
+ needRemoveTheFile = false;
+ start();
+
+ #ifdef Q_OS_UNIX
+ to=-1;
+ #else
+ to=nullptr;
+ #endif
+}
+
+WriteThread::~WriteThread()
+{
+ stopIt=true;
+ needRemoveTheFile=true;
+ pauseMutex.release();
+ writeFull.release();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ waitNewClockForSpeed.release();
+ waitNewClockForSpeed2.release();
+ #endif
+ writeFull.release();
+ pauseMutex.release();
+ // useless because stopIt will close all thread, but if thread not runing run it
+ //endIsDetected();
+ emit internalStartClose();
+ isOpen.acquire();
+ if(!file.empty())
+ resumeNotStarted();
+ //disconnect(this);//-> do into ~TransferThread()
+ quit();
+ wait();
+}
+
+void WriteThread::run()
+{
+ if(!connect(this,&WriteThread::internalStartOpen, this,&WriteThread::internalOpen, Qt::QueuedConnection))
+ abort();
+ if(!connect(this,&WriteThread::internalStartReopen, this,&WriteThread::internalReopen, Qt::QueuedConnection))
+ abort();
+ if(!connect(this,&WriteThread::internalStartWrite, this,&WriteThread::internalWrite, Qt::QueuedConnection))
+ abort();
+ if(!connect(this,&WriteThread::internalStartClose, this,&WriteThread::internalCloseSlot, Qt::QueuedConnection))
+ abort();
+ if(!connect(this,&WriteThread::internalStartEndOfFile, this,&WriteThread::internalEndOfFile, Qt::QueuedConnection))
+ abort();
+ if(!connect(this,&WriteThread::internalStartFlushAndSeekToZero, this,&WriteThread::internalFlushAndSeekToZero, Qt::QueuedConnection))
+ abort();
+ exec();
+}
+
+//internal function
+bool WriteThread::seek(const int64_t &position)/// \todo search if is use full
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start with: "+std::to_string(position));
+ if((int64_t)position>size())
+ return false;
+
+ #ifdef Q_OS_UNIX
+ if(to<0)
+ abort();//internal failure
+ return lseek(to,position,SEEK_SET)==position;
+ #else
+ if(to==NULL)
+ abort();//internal failure
+ LARGE_INTEGER liSize;
+ liSize.QuadPart=position;
+ return SetFilePointerEx(to,liSize,NULL,FILE_BEGIN);
+ #endif
+}
+
+int64_t WriteThread::size() const
+{
+ #ifdef Q_OS_UNIX
+ struct stat st;
+ fstat(to, &st);
+ return st.st_size;
+ #else
+ LARGE_INTEGER lpFileSize;
+ if(!GetFileSizeEx(to,&lpFileSize))
+ return -1;
+ else
+ return lpFileSize.QuadPart;
+ #endif
+}
+
+bool WriteThread::internalOpen()
+{
+ //do a bug
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] internalOpen destination: "+TransferThread::internalStringTostring(file));
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ emit closed();
+ return false;
+ }
+ #ifdef Q_OS_UNIX
+ if(to>=0)
+ #else
+ if(to!=NULL)
+ #endif
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] already open! destination: "+TransferThread::internalStringTostring(file));
+ return false;
+ }
+ if(file.empty())
+ {
+ errorString_internal=tr("Path resolution error (Empty path)").toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+"Unable to open: "+TransferThread::internalStringTostring(file)+", error: Empty path");
+ emit error();
+ return false;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] before the mutex");
+ //set to LISTBLOCKSIZE
+ while(writeFull.available()<(int)numberOfBlock)
+ writeFull.release();
+ if(writeFull.available()>(int)numberOfBlock)
+ writeFull.acquire(writeFull.available()-numberOfBlock);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the mutex");
+ stopIt=false;
+ endDetected=false;
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=InodeOperation;
+ #endif
+ //mkpath check if exists and return true if already exists
+ {
+ INTERNALTYPEPATH destination=file;
+ #ifdef WIDESTRING
+ const size_t destinationIndex=destination.rfind(L'/');
+ if(destinationIndex!=std::string::npos && destinationIndex<destination.size())
+ {
+ const std::wstring &path=destination.substr(0,destinationIndex);
+ if(!TransferThread::is_dir(path))
+ if(!TransferThread::mkpath(path))
+ {
+ #ifdef Q_OS_WIN32
+ errorString_internal=tr("Unable to create the destination folder: ").toStdString()+TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable create the folder: "+
+ TransferThread::internalStringTostring(destination)+", error: "+
+ errorString_internal);
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Idle;
+ #endif
+ return false;
+ #else
+ /// \todo do real folder error here
+ errorString_internal=tr("Unable to create the destination folder, errno: %1").arg(QString::number(errno)).toStdString();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+"Unable create the folder: "+
+ TransferThread::internalStringTostring(destination)+", error: "+
+ errorString_internal);
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Idle;
+ #endif
+ return false;
+ #endif
+ }
+ }
+ #else
+ const size_t destinationIndex=destination.rfind('/');
+ if(destinationIndex!=std::string::npos && destinationIndex<destination.size())
+ {
+ const std::string &path=destination.substr(0,destinationIndex);
+ if(!TransferThread::is_dir(path))
+ if(!TransferThread::mkpath(path))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to create the destination folder: "+path);
+ #ifdef Q_OS_WIN32
+ errorString_internal=tr("Unable to create the destination folder: ")+TransferThread::GetLastErrorStdStr();
+ #else
+ errorString_internal=tr("Unable to create the destination folder, errno: %1").arg(QString::number(errno)).toStdString();
+ #endif
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Idle;
+ #endif
+ return false;
+ }
+ }
+ #endif
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the mkpath");
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ emit closed();
+ return false;
+ }
+ //try open it
+ {
+ QMutexLocker lock_mutex(writeFileListMutex);
+ #ifdef WIDESTRING
+ QString qtFile=QString::fromStdWString(file);
+ #else
+ QString qtFile=QString::fromStdString(file);
+ #endif
+ if(writeFileList->count(qtFile,this)==0)
+ {
+ writeFileList->insert(qtFile,this);
+ if(writeFileList->count(qtFile)>1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] in waiting because same file is found");
+ return false;
+ }
+ }
+ }
+ bool fileWasExists=TransferThread::is_file(file);
+ #ifdef Q_OS_UNIX
+ // The last parameter (0755) does nothing. It is simply accepted for compatibility with the UNIX "open" function.
+ // Needed for major build compatibility
+ to = ::open(TransferThread::internalStringTostring(file).c_str(), O_WRONLY | O_CREAT, 0755);
+ #else
+ DWORD flags=FILE_ATTRIBUTE_NORMAL;
+ if(os_spec_flags)
+ flags|=FILE_FLAG_SEQUENTIAL_SCAN;
+ /*if(!buffer)
+ //FILE_FLAG_NO_BUFFERING Under Windows 10 do The parameter is incorrect. (87)
+ flags|=FILE_FLAG_NO_BUFFERING;//FILE_FLAG_WRITE_THROUGH |*/
+ to=CreateFileW(file.c_str(),GENERIC_WRITE,0,NULL,CREATE_ALWAYS,
+ flags,NULL);
+ #endif
+ #ifdef Q_OS_UNIX
+ if(to>=0)
+ #else
+ if(to!=INVALID_HANDLE_VALUE)
+ #endif
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the open");
+ {
+ QMutexLocker lock_mutex(&accessList);
+ if(!theBlockList.empty())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] General file corruption detected");
+ stopIt=true;
+ #ifdef Q_OS_UNIX
+ if(::close(to)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ to=-1;
+ #else
+ if(CloseHandle(to)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ to=NULL;
+ #endif
+ resumeNotStarted();
+ this->file.clear();
+ return false;
+ }
+ }
+ pauseMutex.tryAcquire(pauseMutex.available());
+ #ifdef Q_OS_LINUX
+ if(os_spec_flags)
+ {
+ posix_fadvise(to, 0, 0, POSIX_FADV_NOREUSE);
+ posix_fadvise(to, 0, 0, POSIX_FADV_SEQUENTIAL);
+ }
+ #endif
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the pause mutex");
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ #ifdef Q_OS_UNIX
+ if(::close(to)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ to=-1;
+ #else
+ if(CloseHandle(to)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ to=NULL;
+ #endif
+ resumeNotStarted();
+ this->file.clear();
+ emit closed();
+ return false;
+ }
+ if(destTruncate(startSize)!=0)
+ {
+ #ifdef Q_OS_UNIX
+ if(::close(to)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ to=-1;
+ #else
+ if(CloseHandle(to)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ to=NULL;
+ #endif
+ resumeNotStarted();
+ this->file.clear();
+ #ifdef Q_OS_WIN32
+ errorString_internal=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to seek after resize: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal
+ );
+ #else
+ int t=errno;
+ errorString_internal=strerror(t);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to seek after resize: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal+" ("+std::to_string(t)+")"
+ );
+ #endif
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Idle;
+ #endif
+ return false;
+ }
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ #ifdef Q_OS_UNIX
+ if(::close(to)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ to=-1;
+ #else
+ if(CloseHandle(to)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ to=NULL;
+ #endif
+ resumeNotStarted();
+ this->file.clear();
+ emit closed();
+ return false;
+ }
+ if(!seek(0))
+ {
+ #ifdef Q_OS_UNIX
+ if(::close(to)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ to=-1;
+ #else
+ if(CloseHandle(to)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ to=NULL;
+ #endif
+ resumeNotStarted();
+ this->file.clear();
+ #ifdef Q_OS_WIN32
+ errorString_internal=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to seek after open: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal
+ );
+ #else
+ int t=errno;
+ errorString_internal=strerror(t);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to seek after open: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal+" ("+std::to_string(t)+")"
+ );
+ #endif
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Idle;
+ #endif
+ return false;
+ }
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ #ifdef Q_OS_UNIX
+ if(::close(to)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ to=-1;
+ #else
+ if(CloseHandle(to)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ to=NULL;
+ #endif
+ resumeNotStarted();
+ this->file.clear();
+ emit closed();
+ return false;
+ }
+ isOpen.acquire();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit opened()");
+ emit opened();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Idle;
+ #endif
+ needRemoveTheFile=false;
+ postOperationRequested=false;
+ return true;
+ }
+ else
+ {
+ #ifdef Q_OS_WIN32
+ errorString_internal=TransferThread::GetLastErrorStdStr();
+ #else
+ int t=errno;
+ #endif
+ if(!fileWasExists && TransferThread::is_file(file))
+ if(unlink(TransferThread::internalStringTostring(file).c_str())!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] file created but can't be removed");
+ if(stopIt)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
+ resumeNotStarted();
+ this->file.clear();
+ emit closed();
+ return false;
+ }
+ #ifdef Q_OS_WIN32
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to open: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal
+ );
+ #else
+ errorString_internal=strerror(t);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to open: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal+" ("+std::to_string(t)+")"
+ );
+ #endif
+ emit error();
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Idle;
+ #endif
+ return false;
+ }
+}
+
+void WriteThread::openWrite(const INTERNALTYPEPATH &file, const uint64_t &startSize)
+{
+ if(!isRunning())
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] the thread not running to open destination: "+TransferThread::internalStringTostring(file)+", numberOfBlock: "+std::to_string(numberOfBlock));
+ errorString_internal=tr("Internal error, please report it!").toStdString();
+ emit error();
+ return;
+ }
+ #ifdef Q_OS_WIN32
+ if(to!=NULL)
+ #else
+ if(to>=0)
+ #endif
+ {
+ if(file==this->file)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Try reopen already opened same file: "+TransferThread::internalStringTostring(file));
+ else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already open: "+TransferThread::internalStringTostring(file));
+ //emit internalStartClose();
+ internalCloseSlot();
+ isOpen.acquire();
+ isOpen.release();
+ }
+ if(numberOfBlock<1 || (numberOfBlock>ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK && numberOfBlock>ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK))
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] numberOfBlock wrong, set to default");
+ this->numberOfBlock=ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
+ }
+ /*else
+ this->numberOfBlock=numberOfBlock;*/
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+"open destination: "+TransferThread::internalStringTostring(file));
+ stopIt=false;
+ fakeMode=false;
+ lastGoodPosition=0;
+ this->file=file;
+ this->startSize=startSize;
+ endDetected=false;
+ writeFullBlocked=false;
+ emit internalStartOpen();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ numberOfBlockCopied=0;
+ #endif
+}
+
+void WriteThread::endIsDetected()
+{
+ if(endDetected)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ endDetected=true;
+ pauseMutex.release();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ emit internalStartEndOfFile();
+}
+
+std::string WriteThread::errorString() const
+{
+ return errorString_internal;
+}
+
+void WriteThread::stop()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop()");
+ needRemoveTheFile=true;
+ stopIt=true;
+ if(isOpen.available()>0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] isOpen.available()>0");
+
+ #ifdef Q_OS_WIN32
+ if(to!=NULL)
+ #else
+ if(to>=0)
+ #endif
+ {
+ #ifdef Q_OS_UNIX
+ if(::close(to)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ to=-1;
+ #else
+ if(CloseHandle(to)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ to=NULL;
+ #endif
+ }
+
+ return;
+ }
+ writeFull.release();
+ pauseMutex.release();
+ pauseMutex.release();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ waitNewClockForSpeed.release();
+ waitNewClockForSpeed2.release();
+ #endif
+ // useless because stopIt will close all thread, but if thread not runing run it
+ endIsDetected();
+ //for the stop for skip: void TransferThread::skip()
+ emit internalStartClose();
+}
+
+void WriteThread::flushBuffer()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ writeFull.release();
+ writeFull.acquire();
+ pauseMutex.release();
+ {
+ QMutexLocker lock_mutex(&accessList);
+ while(!theBlockList.empty())
+ {
+ free(theBlockList.front().data);
+ theBlockList.pop();
+ }
+ }
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop");
+}
+
+/// \brief buffer is empty
+bool WriteThread::bufferIsEmpty()
+{
+ bool returnVal;
+ {
+ QMutexLocker lock_mutex(&accessList);
+ returnVal=theBlockList.empty();
+ }
+ return returnVal;
+}
+
+void WriteThread::internalEndOfFile()
+{
+ if(!bufferIsEmpty())
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] buffer is not empty!");
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] writeIsStopped");
+ postOperation();
+ emit writeIsStopped();
+ }
+}
+
+#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+/*! \brief Set the max speed
+\param tempMaxSpeed Set the max speed in KB/s, 0 for no limit */
+void WriteThread::setMultiForBigSpeed(const int &multiForBigSpeed)
+{
+ this->multiForBigSpeed=multiForBigSpeed;
+ waitNewClockForSpeed.release();
+ waitNewClockForSpeed2.release();
+}
+
+/// \brief For give timer every X ms
+void WriteThread::timeOfTheBlockCopyFinished()
+{
+ /* this is the old way to limit the speed, it product blocking
+ *if(waitNewClockForSpeed.available()<ULTRACOPIER_PLUGIN_NUMSEMSPEEDMANAGEMENT)
+ waitNewClockForSpeed.release();*/
+
+ //try this new way:
+ /* only if speed limited, else will accumulate waitNewClockForSpeed
+ * Disabled because: Stop call of this method when no speed limit
+ if(this->maxSpeed>0)*/
+ if(waitNewClockForSpeed.available()<=1)
+ waitNewClockForSpeed.release();
+ if(waitNewClockForSpeed2.available()<=1)
+ waitNewClockForSpeed2.release();
+}
+#endif
+
+void WriteThread::resumeNotStarted()
+{
+ QMutexLocker lock_mutex(writeFileListMutex);
+ #ifdef WIDESTRING
+ QString qtFile=QString::fromStdWString(file);
+ #else
+ QString qtFile=QString::fromStdString(file);
+ #endif
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ if(!writeFileList->contains(qtFile))
+ {
+ /*ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] file: \""+
+ TransferThread::internalStringTostring(file)+
+ "\" for similar inode is not located into the list of "+
+ std::to_string(writeFileList.size())+" items!");*/
+ return;
+ }
+ #endif
+ writeFileList->remove(qtFile,this);
+ if(writeFileList->contains(qtFile))
+ {
+ QList<WriteThread *> writeList=writeFileList->values(qtFile);
+ if(!writeList.isEmpty())
+ writeList.first()->reemitStartOpen();
+ return;
+ }
+}
+
+void WriteThread::pause()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] try put read thread in pause");
+ pauseMutex.tryAcquire(pauseMutex.available());
+ putInPause=true;
+ return;
+}
+
+void WriteThread::resume()
+{
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ putInPause=false;
+ stopIt=false;
+ }
+ else
+ return;
+ #ifdef Q_OS_WIN32
+ if(to==NULL)
+ #else
+ if(to<0)
+ #endif
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] file is not open");
+ return;
+ }
+ pauseMutex.release();
+}
+
+void WriteThread::reemitStartOpen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] start");
+ emit internalStartOpen();
+}
+
+void WriteThread::postOperation()
+{
+ if(postOperationRequested)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] double event dropped");
+ return;
+ }
+ postOperationRequested=true;
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ emit internalStartClose();
+}
+
+void WriteThread::internalCloseSlot()
+{
+ internalClose();
+}
+
+void WriteThread::internalClose(bool emitSignal)
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close for file: "+TransferThread::internalStringTostring(file));
+ /// \note never send signal here, because it's called by the destructor
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Close;
+ #endif
+ bool emit_closed=false;
+ if(!fakeMode)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] !fakeMode: "+TransferThread::internalStringTostring(file));
+ #ifdef Q_OS_WIN32
+ if(to!=NULL)
+ #else
+ if(to>=0)
+ #endif
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] to>=0: "+TransferThread::internalStringTostring(file));
+ if(!needRemoveTheFile)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] !needRemoveTheFile: "+TransferThread::internalStringTostring(file));
+ if(startSize!=lastGoodPosition)
+ if(destTruncate(lastGoodPosition)!=0)
+ {
+ if(emitSignal)
+ {
+ #ifdef Q_OS_WIN32
+ errorString_internal=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to resize: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal
+ );
+ #else
+ int t=errno;
+ errorString_internal=strerror(t);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to resize: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal+" ("+std::to_string(t)+")"
+ );
+ #endif
+ emit error();
+ }
+ else
+ needRemoveTheFile=true;
+ }
+ }
+ #ifdef Q_OS_UNIX
+ if(::close(to)!=0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+std::to_string(errno));
+ to=-1;
+ #else
+ if(CloseHandle(to)==0)
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to close: "+TransferThread::GetLastErrorStdStr());
+ to=NULL;
+ #endif
+ this->file.clear();
+ if(needRemoveTheFile || stopIt)
+ {
+ if(deletePartiallyTransferredFiles)
+ {
+ if(unlink(TransferThread::internalStringTostring(file).c_str())!=0)
+ if(emitSignal)
+ {
+ #ifdef Q_OS_UNIX
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] unable to remove the destination file: "+std::to_string(errno));
+ #else
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] unable to remove the destination file: "+TransferThread::GetLastErrorStdStr());
+ #endif
+ }
+ }
+ }
+ //here and not after, because the transferThread don't need try close if not open
+ if(emitSignal)
+ emit_closed=true;
+ }
+ }
+ else
+ {
+ //here and not after, because the transferThread don't need try close if not open
+
+ if(emitSignal)
+ emit_closed=true;
+ }
+ needRemoveTheFile=false;
+ resumeNotStarted();
+ this->file.clear();
+ if(emit_closed)
+ emit closed();
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Idle;
+ #endif
+
+ /// \note always the last of this function
+ if(!fakeMode)
+ isOpen.release();
+}
+
+void WriteThread::internalReopen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ INTERNALTYPEPATH tempFile=file;
+ internalClose(false);
+ flushBuffer();
+ stopIt=false;
+ lastGoodPosition=0;
+ file=tempFile;
+ if(internalOpen())
+ emit reopened();
+}
+
+void WriteThread::reopen()
+{
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
+ stopIt=true;
+ endDetected=false;
+ 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;
+ postOperationRequested=false;
+ emit opened();
+}
+
+/// \brief do the fake writeIsStarted
+void WriteThread::fakeWriteIsStarted()
+{
+ emit writeIsStarted();
+}
+
+/// \brief do the fake writeIsStopped
+void WriteThread::fakeWriteIsStopped()
+{
+ postOperation();
+ emit writeIsStopped();
+}
+
+/** \brief set block size
+\param block the new block size in B
+\return Return true if succes */
+bool WriteThread::setBlockSize(const int blockSize)
+{
+ //can be smaller than min block size to do correct speed limitation
+ if(blockSize>1 && blockSize<ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE*1024)
+ {
+ //this->blockSize=blockSize;
+ return true;
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"block size out of range: "+std::to_string(blockSize));
+ return false;
+ }
+}
+
+/// \brief get the last good position
+int64_t WriteThread::getLastGoodPosition() const
+{
+ return lastGoodPosition;
+}
+
+void WriteThread::flushAndSeekToZero()
+{
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"flushAndSeekToZero: "+std::to_string(blockSize));
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"flushAndSeekToZero");
+ stopIt=true;
+ emit internalStartFlushAndSeekToZero();
+}
+
+void WriteThread::internalFlushAndSeekToZero()
+{
+ flushBuffer();
+ if(!seek(0))
+ {
+ #ifdef Q_OS_WIN32
+ errorString_internal=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to seek: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal
+ );
+ #else
+ int t=errno;
+ errorString_internal=strerror(t);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to seek: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal+" ("+std::to_string(t)+")"
+ );
+ #endif
+ emit error();
+ return;
+ }
+ stopIt=false;
+ emit flushedAndSeekedToZero();
+}
+
+void WriteThread::setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles)
+{
+ this->deletePartiallyTransferredFiles=deletePartiallyTransferredFiles;
+}
+
+bool WriteThread::write(char * data, const unsigned int size)
+{
+ if(stopIt)
+ return false;
+ bool atMax;
+ if(stopIt)
+ return false;
+ {
+ QMutexLocker lock_mutex(&accessList);
+ DataBlock d;
+ d.data=data;
+ d.size=size;
+ theBlockList.push(d);
+ atMax=(theBlockList.size()>=numberOfBlock);
+ }
+ emit internalStartWrite();
+ if(atMax)
+ {
+ writeFullBlocked=true;
+ writeFull.acquire();
+ writeFullBlocked=false;
+ }
+ if(stopIt)
+ return false;
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ //wait for limitation speed if stop not query
+ if(multiForBigSpeed>0)
+ {
+ numberOfBlockCopied2++;
+ if(numberOfBlockCopied2>=multiForBigSpeed)
+ {
+ numberOfBlockCopied2=0;
+ waitNewClockForSpeed2.acquire();
+ }
+ }
+ #endif
+ if(stopIt)
+ return false;
+ return true;
+}
+
+void WriteThread::internalWrite()
+{
+ bool haveBlock;
+ do
+ {
+ if(putInPause)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+"] write put in pause");
+ if(stopIt)
+ return;
+ pauseMutex.acquire();
+ if(stopIt)
+ return;
+ }
+ if(stopIt)
+ {
+// ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stopIt");
+ return;
+ }
+ if(stopIt)
+ return;
+ //read one block
+ {
+ QMutexLocker lock_mutex(&accessList);
+ if(theBlockList.empty())
+ haveBlock=false;
+ else
+ {
+ blockArray=theBlockList.front();
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ if(multiForBigSpeed>0)
+ {
+ theBlockList.pop();
+ //if remove one block
+ writeFull.release();
+ }
+ else
+ #endif
+ {
+ theBlockList.pop();
+ //if remove one block
+ writeFull.release();
+ }
+ haveBlock=true;
+ }
+ }
+ if(stopIt)
+ {
+ if(blockArray.data!=NULL)
+ {
+ free(blockArray.data);
+ blockArray.data=NULL;
+ }
+ return;
+ }
+ if(!haveBlock)
+ {
+ //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] End detected of the file");
+ if(blockArray.data!=NULL)
+ {
+ free(blockArray.data);
+ blockArray.data=NULL;
+ }
+ return;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
+ //wait for limitation speed if stop not query
+ if(multiForBigSpeed>0)
+ {
+ numberOfBlockCopied++;
+ if(writeFullBlocked)
+ {
+ if(numberOfBlockCopied>=(multiForBigSpeed*2))
+ {
+ numberOfBlockCopied=0;
+ waitNewClockForSpeed.acquire();
+ if(stopIt)
+ {
+ free(blockArray.data);
+ break;
+ }
+ }
+ }
+ else
+ {
+ if(numberOfBlockCopied>=multiForBigSpeed)
+ {
+ numberOfBlockCopied=0;
+ waitNewClockForSpeed.acquire();
+ if(stopIt)
+ {
+ if(blockArray.data!=NULL)
+ {
+ free(blockArray.data);
+ blockArray.data=NULL;
+ }
+ break;
+ }
+ }
+ }
+ }
+ #endif
+ if(stopIt)
+ {
+ if(blockArray.data!=NULL)
+ {
+ free(blockArray.data);
+ blockArray.data=NULL;
+ }
+ return;
+ }
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Write;
+ #endif
+
+ #ifdef Q_OS_WIN32
+ BOOL retRead=TRUE;
+ #endif
+ if(blockArray.size<=0)
+ bytesWriten=0;
+ else
+ {
+ #ifdef Q_OS_WIN32
+ DWORD lpNumberOfBytesWrite=0;
+ retRead=WriteFile(to,blockArray.data,blockArray.size,
+ &lpNumberOfBytesWrite,NULL);
+ bytesWriten=lpNumberOfBytesWrite;
+ #else
+ bytesWriten=::write(to,blockArray.data,blockArray.size);
+ #endif
+ }
+ if(blockArray.data!=NULL)
+ {
+ free(blockArray.data);
+ blockArray.data=NULL;
+ }
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ status=Idle;
+ #endif
+ //mutex for stream this data
+ if(lastGoodPosition==0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit writeIsStarted()");
+ emit writeIsStarted();
+ }
+ if(stopIt)
+ return;
+ #ifdef Q_OS_WIN32
+ if(retRead==FALSE)
+ #else
+ if(bytesWriten<0)
+ #endif
+ {
+ #ifdef Q_OS_WIN32
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ DWORD e = GetLastError();
+ #endif
+ errorString_internal=TransferThread::GetLastErrorStdStr();
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to write: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal+" ("+std::to_string(e)+") to write "+std::to_string(blockArray.size)+"B at "+std::to_string(lastGoodPosition)+"B"
+ );
+ #else
+ int t=errno;
+ errorString_internal=strerror(t);
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+
+ "Unable to write: "+TransferThread::internalStringTostring(file)+
+ ", error: "+errorString_internal+" ("+std::to_string(t)+") to write "+std::to_string(blockArray.size)+"B at "+std::to_string(lastGoodPosition)+"B"
+ );
+ #endif
+ stopIt=true;
+ emit error();
+ return;
+ }
+ if(bytesWriten!=blockArray.size)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Error in writing, bytesWriten: %1, blockArray.size(): %2").arg(bytesWriten).arg(blockArray.size).toStdString());
+ errorString_internal=QStringLiteral("Error in writing, bytesWriten: %1, blockArray.size(): %2").arg(bytesWriten).arg(blockArray.size).toStdString();
+ stopIt=true;
+ emit error();
+ return;
+ }
+ lastGoodPosition+=bytesWriten;
+ } while(true);
+}
+
+//return 0 if sucess
+int WriteThread::destTruncate(const uint64_t &startSize)
+{
+ #ifdef Q_OS_WIN32
+ if(to==NULL)
+ abort();
+ seek(startSize);
+ if(SetEndOfFile(to)!=0)
+ return 0;
+ else
+ return 1;
+ #else
+ if(to<0)
+ abort();
+ return ::ftruncate(to,startSize);
+ #endif
+}
+
+void WriteThread::setOsSpecFlags(bool os_spec_flags)
+{
+ this->os_spec_flags=os_spec_flags;
+}
diff --git a/plugins/CopyEngine/Ultracopier/WriteThread.h b/plugins/CopyEngine/Ultracopier-Spec/async/WriteThread.h
index cadd022..5e0b265 100644..100755
--- a/plugins/CopyEngine/Ultracopier/WriteThread.h
+++ b/plugins/CopyEngine/Ultracopier-Spec/async/WriteThread.h
@@ -8,14 +8,26 @@
#include <QThread>
#include <QByteArray>
-#include <QString>
#include <QMutex>
#include <QSemaphore>
#include <QCryptographicHash>
+#include <queue>
-#include "Environment.h"
-#include "StructEnumDefinition_CopyEngine.h"
-#include "AvancedQFile.h"
+#ifdef Q_OS_WIN32
+#include <windows.h>
+#endif
+
+#include "../Environment.h"
+#include "../StructEnumDefinition_CopyEngine.h"
+#include "../CopyEngineUltracopier-SpecVariable.h"
+
+#ifdef WIDESTRING
+#define INTERNALTYPEPATH std::wstring
+#define INTERNALTYPECHAR wchar_t
+#else
+#define INTERNALTYPEPATH std::string
+#define INTERNALTYPECHAR char
+#endif
/// \brief Thread changed to open/close and write the destination file
class WriteThread : public QThread
@@ -24,19 +36,27 @@ class WriteThread : public QThread
public:
explicit WriteThread();
~WriteThread();
- /// \brief to have semaphore to do mkpath one by one
- void setMkpathTransfer(QSemaphore *mkpathTransfer);
+ //internal function
+ bool seek(const int64_t &position);/// \todo search if is use full
+ /// \brief get the size of the destination file
+ int64_t size() const;
+
+ //can't be static into WriteThread, linked by instance then by ListThread
+ QMultiHash<QString,WriteThread *> *writeFileList;
+ QMutex *writeFileListMutex;
+ bool buffer;
+ static unsigned int numberOfBlock;
protected:
void run();
public:
/// \brief open the destination to open it
- void open(const QFileInfo &file,const uint64_t &startSize,const bool &buffer,const int &numberOfBlock,const bool &sequential);
+ void openWrite(const INTERNALTYPEPATH &file,const uint64_t &startSize);
/// \brief to return the error string
std::string errorString() const;
/// \brief to stop all
void stop();
/// \brief to write data
- bool write(const QByteArray &data);
+ bool write(char *data, const unsigned int size);
#ifdef ULTRACOPIER_PLUGIN_DEBUG
/// \brief to set the id
void setId(int id);
@@ -47,10 +67,9 @@ public:
InodeOperation=1,
Write=2,
Close=3,
- Read=5,
- Checksum=6
+ Read=5
};
- WriteStat stat;
+ WriteStat status;
#endif
/// \brief do the fake open
void fakeOpen();
@@ -58,9 +77,7 @@ public:
void fakeWriteIsStarted();
/// \brief do the fake writeIsStopped
void fakeWriteIsStopped();
- /// do the checksum
- void startCheckSum();
- /// \brief set block size in KB
+ /// \brief set block size in KB mostly for speed
bool setBlockSize(const int blockSize);
/// \brief get the last good position
int64_t getLastGoodPosition() const;
@@ -73,6 +90,9 @@ public:
void pause();
void resume();
void reemitStartOpen();
+ //return 0 if sucess
+ int destTruncate(const uint64_t &startSize);
+ void setOsSpecFlags(bool os_spec_flags);
public slots:
/// \brief start the operation
void postOperation();
@@ -84,8 +104,6 @@ public slots:
void reopen();
/// \brief flush and seek to zero
void flushAndSeekToZero();
- /// do the checksum
- void checkSum();
void setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles);
/// \brief executed at regular interval to do a speed throling
void timeOfTheBlockCopyFinished();
@@ -99,10 +117,8 @@ signals:
void writeIsStopped() const;
void flushedAndSeekedToZero() const;
void closed() const;
- void checksumFinish(const QByteArray&) const;
//internal signals
void internalStartOpen() const;
- void internalStartChecksum() const;
void internalStartReopen() const;
void internalStartWrite() const;
void internalStartClose() const;
@@ -111,15 +127,16 @@ signals:
/// \brief To debug source
void debugInformation(const Ultracopier::DebugLevel &level,const std::string &fonction,const std::string &text,const std::string &file,const int &ligne) const;
private:
+ struct DataBlock
+ {
+ char * data;
+ unsigned int size;
+ };
std::string errorString_internal;
- AvancedQFile file;
volatile bool stopIt;
volatile bool postOperationRequested;
- volatile int blockSize;//only used in checksum
- int numberOfBlock;
+ bool os_spec_flags;
QMutex accessList; ///< For use the list
- static QMultiHash<QString,WriteThread *> writeFileList;
- static QMutex writeFileListMutex;
#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
QSemaphore waitNewClockForSpeed,waitNewClockForSpeed2;
volatile int numberOfBlockCopied,numberOfBlockCopied2; ///< Multiple for count the number of block copied
@@ -131,22 +148,26 @@ private:
QSemaphore isOpen;
QSemaphore pauseMutex;
volatile bool putInPause;
- QList<QByteArray> theBlockList; ///< Store the block list
+ std::queue<DataBlock> theBlockList; ///< Store the block list
uint64_t lastGoodPosition;
- QByteArray blockArray; ///< temp data for block writing, the data
+ DataBlock blockArray; ///< temp data for block writing, the data
int64_t bytesWriten; ///< temp data for block writing, the bytes writen
int id;
volatile bool endDetected;
uint64_t startSize;
- QSemaphore *mkpathTransfer;
bool fakeMode;
- bool buffer;
bool needRemoveTheFile;
- volatile bool sequential;
bool deletePartiallyTransferredFiles;
#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
volatile int multiForBigSpeed; ///< Multiple for count the number of block needed
#endif
+
+ #ifdef Q_OS_UNIX
+ int to;
+ #else
+ HANDLE to;
+ #endif
+ INTERNALTYPEPATH file;
private slots:
bool internalOpen();
void internalWrite();
diff --git a/plugins/CopyEngine/Ultracopier/copyEngineOptions.ui b/plugins/CopyEngine/Ultracopier-Spec/copyEngineOptions.ui
index 73e57f9..e646a2d 100644..100755
--- a/plugins/CopyEngine/Ultracopier/copyEngineOptions.ui
+++ b/plugins/CopyEngine/Ultracopier-Spec/copyEngineOptions.ui
@@ -29,40 +29,46 @@
<item>
<widget class="QToolBox" name="toolBox">
<property name="currentIndex">
- <number>3</number>
+ <number>2</number>
</property>
<widget class="QWidget" name="page_trasnfer">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
- <width>791</width>
- <height>349</height>
+ <width>801</width>
+ <height>376</height>
</rect>
</property>
<attribute name="label">
<string>Transfer</string>
</attribute>
<layout class="QGridLayout" name="gridLayout_5">
- <item row="3" column="2">
- <widget class="QCheckBox" name="moveTheWholeFolder"/>
+ <item row="7" column="1">
+ <spacer name="verticalSpacer_6">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>278</height>
+ </size>
+ </property>
+ </spacer>
</item>
- <item row="3" column="0">
+ <item row="2" column="0">
<widget class="QLabel" name="label_18">
<property name="text">
<string>Move the whole folder</string>
</property>
</widget>
</item>
- <item row="0" column="0">
- <widget class="QLabel" name="label">
- <property name="text">
- <string>Transfer the file rights</string>
- </property>
- </widget>
+ <item row="2" column="2">
+ <widget class="QCheckBox" name="moveTheWholeFolder"/>
</item>
- <item row="0" column="2">
- <widget class="QCheckBox" name="doRightTransfer"/>
+ <item row="1" column="2">
+ <widget class="QCheckBox" name="keepDate"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_2">
@@ -71,59 +77,68 @@
</property>
</widget>
</item>
- <item row="2" column="2">
- <widget class="QCheckBox" name="autoStart"/>
- </item>
- <item row="1" column="2">
- <widget class="QCheckBox" name="keepDate"/>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_5">
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_9">
<property name="text">
- <string>Autostart the transfer</string>
+ <string>Auto start</string>
</property>
</widget>
</item>
- <item row="4" column="2">
- <widget class="QCheckBox" name="followTheStrictOrder">
- <property name="toolTip">
- <string>Less performance if checked</string>
+ <item row="5" column="2">
+ <widget class="QCheckBox" name="checksum">
+ <property name="text">
+ <string/>
</property>
</widget>
</item>
- <item row="6" column="1">
- <spacer name="verticalSpacer_6">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Transfer the file rights</string>
</property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>278</height>
- </size>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QCheckBox" name="doRightTransfer"/>
+ </item>
+ <item row="6" column="2">
+ <widget class="QCheckBox" name="autoStart">
+ <property name="text">
+ <string/>
</property>
- </spacer>
+ </widget>
</item>
<item row="4" column="0">
- <widget class="QLabel" name="label_19">
- <property name="toolTip">
- <string>Less performance if checked</string>
- </property>
+ <widget class="QLabel" name="label_3">
<property name="text">
- <string>Follow the strict order</string>
+ <string>Create full path if not exists</string>
</property>
</widget>
</item>
- <item row="5" column="0">
+ <item row="3" column="0">
<widget class="QLabel" name="label_rsync">
<property name="text">
<string notr="true">Rsync</string>
</property>
</widget>
</item>
- <item row="5" column="2">
+ <item row="4" column="2">
+ <widget class="QCheckBox" name="mkpath">
+ <property name="text">
+ <string/>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
<widget class="QCheckBox" name="rsync"/>
</item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Checksum</string>
+ </property>
+ </widget>
+ </item>
</layout>
</widget>
<widget class="QWidget" name="page_error_collision">
@@ -131,8 +146,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>791</width>
- <height>349</height>
+ <width>801</width>
+ <height>376</height>
</rect>
</property>
<attribute name="label">
@@ -201,7 +216,7 @@
</item>
<item>
<property name="text">
- <string notr="true">Overwrite if different</string>
+ <string notr="true">Overwrite if not same size and date</string>
</property>
</item>
<item>
@@ -219,6 +234,16 @@
<string notr="true">Rename</string>
</property>
</item>
+ <item>
+ <property name="text">
+ <string>Overwrite if not same size</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Overwrite if modification date differs</string>
+ </property>
+ </item>
</widget>
</item>
<item row="2" column="2">
@@ -330,210 +355,89 @@
<zorder>renameTheOriginalDestination</zorder>
<zorder>label_22</zorder>
</widget>
- <widget class="QWidget" name="page_control">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>791</width>
- <height>349</height>
- </rect>
- </property>
- <attribute name="label">
- <string>Control</string>
- </attribute>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <item>
- <widget class="QGroupBox" name="groupBox">
- <property name="title">
- <string>Checksum</string>
- </property>
- <layout class="QGridLayout" name="gridLayout_2">
- <item row="1" column="1">
- <widget class="QCheckBox" name="checksumOnlyOnError"/>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_9">
- <property name="text">
- <string>Only after error</string>
- </property>
- </widget>
- </item>
- <item row="2" column="0">
- <widget class="QLabel" name="label_10">
- <property name="text">
- <string>Ignore if impossible</string>
- </property>
- </widget>
- </item>
- <item row="2" column="1">
- <widget class="QCheckBox" name="checksumIgnoreIfImpossible"/>
- </item>
- <item row="0" column="1">
- <widget class="QCheckBox" name="doChecksum">
- <property name="checked">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_11">
- <property name="text">
- <string>Verify checksums</string>
- </property>
- </widget>
- </item>
- </layout>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_4">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>242</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
<widget class="QWidget" name="page_performance">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
- <width>791</width>
- <height>349</height>
+ <width>801</width>
+ <height>376</height>
</rect>
</property>
<attribute name="label">
<string>Performance</string>
</attribute>
<layout class="QGridLayout" name="gridLayout">
- <item row="5" column="0">
- <widget class="QLabel" name="label_16">
- <property name="text">
- <string>Parallel buffer</string>
- </property>
- </widget>
- </item>
- <item row="4" column="1">
- <widget class="QSpinBox" name="sequentialBuffer">
- <property name="suffix">
- <string>KB</string>
- </property>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="inodeThreads">
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
- <number>999999999</number>
+ <number>32</number>
+ </property>
+ <property name="value">
+ <number>16</number>
</property>
</widget>
</item>
- <item row="0" column="1">
- <widget class="QSpinBox" name="blockSize">
- <property name="suffix">
- <string>KB</string>
- </property>
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="maximum">
- <number>65536</number>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_21">
+ <property name="text">
+ <string>Inode threads</string>
</property>
</widget>
</item>
- <item row="5" column="1">
- <widget class="QSpinBox" name="parallelBuffer">
+ <item row="2" column="1">
+ <widget class="QCheckBox" name="followTheStrictOrder"/>
+ </item>
+ <item row="3" column="1">
+ <widget class="QSpinBox" name="spinBox">
<property name="suffix">
- <string>KB</string>
+ <string>MB</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
- <number>999999999</number>
- </property>
- </widget>
- </item>
- <item row="1" column="1">
- <widget class="QCheckBox" name="osBuffer"/>
- </item>
- <item row="0" column="0">
- <widget class="QLabel" name="label_4">
- <property name="text">
- <string>Block size</string>
- </property>
- </widget>
- </item>
- <item row="4" column="0">
- <widget class="QLabel" name="label_15">
- <property name="text">
- <string>Sequential buffer</string>
+ <number>1024</number>
</property>
- </widget>
- </item>
- <item row="1" column="0">
- <widget class="QLabel" name="label_3">
- <property name="text">
- <string>Enable OS buffer</string>
+ <property name="value">
+ <number>300</number>
</property>
</widget>
</item>
- <item row="2" column="1">
- <widget class="QSpinBox" name="osBufferLimit">
+ <item row="4" column="1">
+ <widget class="QSpinBox" name="spinBox_2">
<property name="suffix">
- <string>KB</string>
+ <string>MB</string>
</property>
<property name="minimum">
<number>1</number>
</property>
<property name="maximum">
- <number>2048</number>
+ <number>1024</number>
</property>
<property name="value">
- <number>512</number>
+ <number>100</number>
</property>
</widget>
</item>
- <item row="2" column="0">
- <widget class="QCheckBox" name="osBufferLimited">
- <property name="text">
- <string>OS buffer only if smaller than</string>
+ <item row="1" column="1">
+ <widget class="QCheckBox" name="buffer">
+ <property name="toolTip">
+ <string>Uncheck this under Windows create problem</string>
</property>
</widget>
</item>
- <item row="3" column="0">
- <widget class="QLabel" name="label_14">
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_4">
<property name="text">
- <string>Transfer algorithm</string>
+ <string>OS Buffer</string>
</property>
</widget>
</item>
- <item row="3" column="1">
- <widget class="QComboBox" name="transferAlgorithm">
- <item>
- <property name="text">
- <string notr="true">Automatic</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string notr="true">Sequential</string>
- </property>
- </item>
- <item>
- <property name="text">
- <string notr="true">Parallel</string>
- </property>
- </item>
- </widget>
- </item>
- <item row="9" column="1">
+ <item row="7" column="1">
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
@@ -546,60 +450,52 @@
</property>
</spacer>
</item>
- <item row="6" column="0">
- <widget class="QLabel" name="label_17">
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_10">
<property name="text">
- <string>Parallelize if smaller than</string>
+ <string>Disable parallel transfer when are different devices</string>
</property>
</widget>
</item>
- <item row="6" column="1">
- <widget class="QSpinBox" name="parallelizeIfSmallerThan">
- <property name="suffix">
- <string>KB</string>
- </property>
- <property name="maximum">
- <number>1024</number>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_14">
+ <property name="text">
+ <string>Buffer for different device</string>
</property>
</widget>
</item>
- <item row="7" column="1">
- <widget class="QSpinBox" name="inodeThreads">
- <property name="minimum">
- <number>1</number>
- </property>
- <property name="maximum">
- <number>32</number>
- </property>
- <property name="value">
- <number>16</number>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_15">
+ <property name="text">
+ <string>OS FLags</string>
</property>
</widget>
</item>
- <item row="7" column="0">
- <widget class="QLabel" name="label_21">
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_11">
<property name="text">
- <string>Inode threads (unsafe &gt; 1)</string>
+ <string>Buffer for same device</string>
</property>
</widget>
</item>
- <item row="8" column="1">
- <widget class="QCheckBox" name="copyListOrder">
- <property name="toolTip">
- <string>More cpu, but better organisation on the disk</string>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_16">
+ <property name="text">
+ <string>OS native copy (disable speed limitation)</string>
</property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QCheckBox" name="os_spec_flags">
<property name="text">
<string/>
</property>
</widget>
</item>
- <item row="8" column="0">
- <widget class="QLabel" name="label_25">
- <property name="toolTip">
- <string>More cpu, but better organisation on the disk</string>
- </property>
+ <item row="6" column="1">
+ <widget class="QCheckBox" name="native_copy">
<property name="text">
- <string>Order the list</string>
+ <string/>
</property>
</widget>
</item>
@@ -610,8 +506,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>791</width>
- <height>349</height>
+ <width>801</width>
+ <height>376</height>
</rect>
</property>
<attribute name="label">
@@ -702,70 +598,5 @@
</layout>
</widget>
<resources/>
- <connections>
- <connection>
- <sender>doChecksum</sender>
- <signal>clicked(bool)</signal>
- <receiver>label_9</receiver>
- <slot>setEnabled(bool)</slot>
- <hints>
- <hint type="sourcelabel">
- <x>583</x>
- <y>136</y>
- </hint>
- <hint type="destinationlabel">
- <x>109</x>
- <y>161</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>doChecksum</sender>
- <signal>clicked(bool)</signal>
- <receiver>checksumOnlyOnError</receiver>
- <slot>setEnabled(bool)</slot>
- <hints>
- <hint type="sourcelabel">
- <x>594</x>
- <y>136</y>
- </hint>
- <hint type="destinationlabel">
- <x>586</x>
- <y>161</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>doChecksum</sender>
- <signal>clicked(bool)</signal>
- <receiver>label_10</receiver>
- <slot>setEnabled(bool)</slot>
- <hints>
- <hint type="sourcelabel">
- <x>641</x>
- <y>136</y>
- </hint>
- <hint type="destinationlabel">
- <x>132</x>
- <y>186</y>
- </hint>
- </hints>
- </connection>
- <connection>
- <sender>doChecksum</sender>
- <signal>clicked(bool)</signal>
- <receiver>checksumIgnoreIfImpossible</receiver>
- <slot>setEnabled(bool)</slot>
- <hints>
- <hint type="sourcelabel">
- <x>665</x>
- <y>136</y>
- </hint>
- <hint type="destinationlabel">
- <x>609</x>
- <y>186</y>
- </hint>
- </hints>
- </connection>
- </connections>
+ <connections/>
</ui>
diff --git a/plugins/CopyEngine/Ultracopier/copyEngineResources.qrc b/plugins/CopyEngine/Ultracopier-Spec/copyEngineResources.qrc
index 0228c74..7ae0fdc 100644..100755
--- a/plugins/CopyEngine/Ultracopier/copyEngineResources.qrc
+++ b/plugins/CopyEngine/Ultracopier-Spec/copyEngineResources.qrc
@@ -1,5 +1,5 @@
<RCC>
- <qresource prefix="/CopyEngine/Ultracopier">
+ <qresource prefix="/CopyEngine/Ultracopier-Spec">
<file>resources/add.png</file>
<file>resources/edit.png</file>
<file>resources/remove.png</file>
diff --git a/plugins/CopyEngine/Ultracopier/debugDialog.ui b/plugins/CopyEngine/Ultracopier-Spec/debugDialog.ui
index 80fde7e..5803f99 100644..100755
--- a/plugins/CopyEngine/Ultracopier/debugDialog.ui
+++ b/plugins/CopyEngine/Ultracopier-Spec/debugDialog.ui
@@ -4,6 +4,8 @@
<widget class="QWidget" name="debugDialog">
<property name="geometry">
<rect>
+ <x>0</x>
+ <y>0</y>
<width>665</width>
<height>392</height>
</rect>
@@ -61,6 +63,19 @@
</property>
</widget>
</item>
+ <item row="2" column="1">
+ <widget class="QSpinBox" name="alreadyExistsQueue"/>
+ </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>
<item row="0" column="1">
<widget class="QSpinBox" name="spinBoxActiveTransfer">
<property name="readOnly">
@@ -78,13 +93,20 @@
</property>
</widget>
</item>
- <item row="1" column="1">
- <widget class="QSpinBox" name="spinBoxNumberOfInode">
- <property name="readOnly">
- <bool>true</bool>
+ <item row="3" column="1">
+ <widget class="QSpinBox" name="errorQueue"/>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string notr="true">alreadyExistsQueueItem:</string>
</property>
- <property name="maximum">
- <number>9999</number>
+ </widget>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string notr="true">errorQueueItem:</string>
</property>
</widget>
</item>
diff --git a/plugins/CopyEngine/Ultracopier/documentation.dox b/plugins/CopyEngine/Ultracopier-Spec/documentation.dox
index 5a0fbf6..5a0fbf6 100644..100755
--- a/plugins/CopyEngine/Ultracopier/documentation.dox
+++ b/plugins/CopyEngine/Ultracopier-Spec/documentation.dox
diff --git a/plugins/CopyEngine/Ultracopier/fileErrorDialog.ui b/plugins/CopyEngine/Ultracopier-Spec/fileErrorDialog.ui
index b603924..b603924 100644..100755
--- a/plugins/CopyEngine/Ultracopier/fileErrorDialog.ui
+++ b/plugins/CopyEngine/Ultracopier-Spec/fileErrorDialog.ui
diff --git a/plugins/CopyEngine/Ultracopier/fileExistsDialog.ui b/plugins/CopyEngine/Ultracopier-Spec/fileExistsDialog.ui
index 0c38a57..2ca480b 100644..100755
--- a/plugins/CopyEngine/Ultracopier/fileExistsDialog.ui
+++ b/plugins/CopyEngine/Ultracopier-Spec/fileExistsDialog.ui
@@ -6,8 +6,8 @@
<rect>
<x>0</x>
<y>0</y>
- <width>469</width>
- <height>162</height>
+ <width>615</width>
+ <height>222</height>
</rect>
</property>
<property name="windowTitle">
@@ -357,6 +357,22 @@
<string>Overwrite if older</string>
</property>
</action>
+ <action name="actionOverwrite_if_not_same_size">
+ <property name="text">
+ <string>Overwrite if not same size</string>
+ </property>
+ <property name="toolTip">
+ <string>Overwrite if not same size</string>
+ </property>
+ </action>
+ <action name="actionOverwrite_if_not_same_size_and_date">
+ <property name="text">
+ <string>Overwrite if not same size and date</string>
+ </property>
+ <property name="toolTip">
+ <string>Overwrite if not same size and date</string>
+ </property>
+ </action>
</widget>
<resources/>
<connections>
diff --git a/plugins/CopyEngine/Ultracopier/fileIsSameDialog.ui b/plugins/CopyEngine/Ultracopier-Spec/fileIsSameDialog.ui
index c019a63..c019a63 100644..100755
--- a/plugins/CopyEngine/Ultracopier/fileIsSameDialog.ui
+++ b/plugins/CopyEngine/Ultracopier-Spec/fileIsSameDialog.ui
diff --git a/plugins/CopyEngine/Ultracopier/folderExistsDialog.ui b/plugins/CopyEngine/Ultracopier-Spec/folderExistsDialog.ui
index 440b5ca..440b5ca 100644..100755
--- a/plugins/CopyEngine/Ultracopier/folderExistsDialog.ui
+++ b/plugins/CopyEngine/Ultracopier-Spec/folderExistsDialog.ui
diff --git a/plugins/CopyEngine/Ultracopier/informations.xml b/plugins/CopyEngine/Ultracopier-Spec/informations.xml
index fcb8c8f..7281da3 100644..100755
--- a/plugins/CopyEngine/Ultracopier/informations.xml
+++ b/plugins/CopyEngine/Ultracopier-Spec/informations.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<package>
- <title xml:lang="en"><![CDATA[Copy engine of Ultracopier]]></title><!-- english is required -->
- <title xml:lang="fr"><![CDATA[Moteur de copie d'ultracopier]]></title>
+ <title xml:lang="en"><![CDATA[Copy engine OS Specific of Ultracopier]]></title><!-- english is required -->
+ <title xml:lang="fr"><![CDATA[Moteur de copie spécifique à l'OS d'ultracopier]]></title>
<!-- What kind of plugin this is -->
<category>CopyEngine</category>
<!-- Who wrote this plugin -->
@@ -14,13 +14,13 @@
<!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
<architecture>windows-x86</architecture>
<!-- Detailed description -->
- <description xml:lang="en"><![CDATA[Copy engine of Ultracopier, do in Qt for all platform, and copy by stream]]></description>
- <description xml:lang="fr"><![CDATA[Moteur de copie d'ultracopier, fait en Qt pour toutes les plateformes, et copie par stream]]></description>
+ <description xml:lang="en"><![CDATA[Copy engine of Ultracopier, OS Specific, Posix for Unix, Win32API for windows]]></description>
+ <description xml:lang="fr"><![CDATA[Moteur de copie d'ultracopier, spécifique à l'OS, Posix pour Unix, Win32API pour windows]]></description>
<!-- Version of this release of this plugin, need be like that's: A.B.C.D, where A, B, C and D is number -->
- <version>1.6.1.3</version>
+ <version>2.2.4.4</version>
<!-- This internal name should never change, because it is used to detect when a particular plugin is updated. It must comprise only lower case ASCII characters (a-z), numerical digits (0-9), "-", "." or "_", and it must be be unique within the category. And have size lower than 64 char. -->
- <name>Ultracopier</name>
+ <name>Ultracopier Spec</name>
<!-- Dependency checking. This is used to check when a plugin may not be compatible with an updated version of either Ultracopier or another plugin. This example only checks Ultracopier. -->
<dependencies><![CDATA[
]]></dependencies>
-</package> \ No newline at end of file
+</package>
diff --git a/plugins/CopyEngine/Ultracopier-Spec/plugin.json b/plugins/CopyEngine/Ultracopier-Spec/plugin.json
new file mode 100755
index 0000000..9e26dfe
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/plugin.json
@@ -0,0 +1 @@
+{} \ No newline at end of file
diff --git a/plugins/CopyEngine/Ultracopier-Spec/ports.h b/plugins/CopyEngine/Ultracopier-Spec/ports.h
new file mode 100755
index 0000000..f888794
--- /dev/null
+++ b/plugins/CopyEngine/Ultracopier-Spec/ports.h
@@ -0,0 +1,6 @@
+#if defined(PLATFORM_MAC) || defined(PLATFORM_HAIKU)
+ #define fseeko64 stat
+ #define ftruncate64 ftruncate
+ #define off64_t off_t
+ #define O_LARGEFILE 0
+#endif
diff --git a/plugins/CopyEngine/Ultracopier/resources/add.png b/plugins/CopyEngine/Ultracopier-Spec/resources/add.png
index 7932127..7932127 100644..100755
--- a/plugins/CopyEngine/Ultracopier/resources/add.png
+++ b/plugins/CopyEngine/Ultracopier-Spec/resources/add.png
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/resources/edit.png b/plugins/CopyEngine/Ultracopier-Spec/resources/edit.png
index 5464856..5464856 100644..100755
--- a/plugins/CopyEngine/Ultracopier/resources/edit.png
+++ b/plugins/CopyEngine/Ultracopier-Spec/resources/edit.png
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/resources/filter.png b/plugins/CopyEngine/Ultracopier-Spec/resources/filter.png
index 9bb3164..9bb3164 100644..100755
--- a/plugins/CopyEngine/Ultracopier/resources/filter.png
+++ b/plugins/CopyEngine/Ultracopier-Spec/resources/filter.png
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/resources/remove.png b/plugins/CopyEngine/Ultracopier-Spec/resources/remove.png
index b711740..b711740 100644..100755
--- a/plugins/CopyEngine/Ultracopier/resources/remove.png
+++ b/plugins/CopyEngine/Ultracopier-Spec/resources/remove.png
Binary files differ
diff --git a/plugins/CopyEngine/Ultracopier/AvancedQFile.cpp b/plugins/CopyEngine/Ultracopier/AvancedQFile.cpp
deleted file mode 100644
index 3d867fb..0000000
--- a/plugins/CopyEngine/Ultracopier/AvancedQFile.cpp
+++ /dev/null
@@ -1,208 +0,0 @@
-/** \file AvancedQFile.cpp
-\brief Define the QFile herited class to set file date/time
-\author alpha_one_x86 */
-
-#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(const 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(const 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(const 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
-}
-
-#ifdef ULTRACOPIER_OVERLAPPED_FILE
-AvancedQFile::avancedQFile()
-{
- handle=INVALID_HANDLE_VALUE;
- fileError=QFileDevice::NoError;
- fileErrorString.clear();
-}
-
-AvancedQFile::~avancedQFile()
-{
- close();
-}
-
-QString AvancedQFile::getLastWindowsError()
-{
- WCHAR ErrorStringW[65535];
- DWORD dw = GetLastError();
-
- int size=FormatMessage(
- FORMAT_MESSAGE_ALLOCATE_BUFFER |
- FORMAT_MESSAGE_FROM_SYSTEM |
- FORMAT_MESSAGE_IGNORE_INSERTS,
- NULL,
- dw,
- MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
- ErrorStringW,
- 0, NULL );
- if(size<0)
- tr("Unknown error: %1").arg(dw);
- return QString::fromWCharArray(ErrorStringW,size);
-}
-
-bool AvancedQFile::open(OpenMode mode)
-{
- fileError=QFileDevice::NoError;
- fileErrorString.clear();
- WCHAR fileNameW[fileName().size()+1];
- if(QDir::toNativeSeparators("\\\\?\\"+fileName()).toWCharArray(fileNameW)!=fileName().size())
- {
- fileError=QFileDevice::OpenError;
- fileErrorString=tr("Path conversion error");
- return false;
- }
- fileNameW[fileName().size()]='\0';
-
- DWORD dwDesiredAccess=0;
- if(mode & QIODevice::ReadOnly)
- dwDesiredAccess|=GENERIC_READ;
- if(mode & QIODevice::WriteOnly)
- dwDesiredAccess|=GENERIC_Write;
-
- DWORD dwCreationDisposition;
- if(mode & QIODevice::WriteOnly)
- dwCreationDisposition=CREATE_ALWAYS;
- else
- dwCreationDisposition=OPEN_EXISTING;
-
- handle=CreateFile(
- fileNameW,
- dwDesiredAccess,
- 0,
- 0,
- dwCreationDisposition,
- FILE_FLAG_WRITE_THROUGH | FILE_FLAG_SEQUENTIAL_SCAN,
- 0
- );
- if(handle==INVALID_HANDLE_VALUE)
- {
- fileError=QFileDevice::OpenError;
- fileErrorString=getLastWindowsError();
- }
- return (handle!=INVALID_HANDLE_VALUE);
-}
-
-void AvancedQFile::close()
-{
- if(handle==INVALID_HANDLE_VALUE)
- return;
- CloseHandle(handle);
-}
-
-bool AvancedQFile::seek(qint64 pos)
-{
- toto
-}
-
-bool AvancedQFile::resize(qint64 size)
-{
- toto
-}
-
-QString AvancedQFile::errorString() const
-{
- if(fileErrorString.isEmpty())
- return tr("Unknown error");
- return fileErrorString;
-}
-
-bool AvancedQFile::isOpen() const
-{
- return (handle!=INVALID_HANDLE_VALUE);
-}
-
-qint64 AvancedQFile::write(const QByteArray &data)
-{
-}
-
-QByteArray AvancedQFile::read(qint64 maxlen)
-{
-}
-
-QFileDevice::FileError AvancedQFile::error() const
-{
- return fileError;
-}
-#endif
diff --git a/plugins/CopyEngine/Ultracopier/AvancedQFile.h b/plugins/CopyEngine/Ultracopier/AvancedQFile.h
deleted file mode 100644
index 8c3dc4a..0000000
--- a/plugins/CopyEngine/Ultracopier/AvancedQFile.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/** \file AvancedQFile.h
-\brief Define the QFile herited class to set file date/time
-\author alpha_one_x86
-\licence GPL3, see the file COPYING */
-
-#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(const QDateTime &time);
- /// \brief set last modification date
- bool setLastModified(const QDateTime &time);
- /// \brief set last read date
- bool setLastRead(const QDateTime &time);
-
- #ifdef ULTRACOPIER_OVERLAPPED_FILE
- explicit AvancedQFile();
- ~AvancedQFile();
- bool open(OpenMode mode);
- void close();
- bool seek(qint64 pos);
- bool resize(qint64 size);
- QString errorString() const;
- bool isOpen() const;
- qint64 write(const QByteArray &data);
- QByteArray read(qint64 maxlen);
- FileError error() const;
- QString getLastWindowsError();
-private:
- HANDLE handle;
- FileError fileError;
- QString fileErrorString;
- #endif
-};
-
-#endif // AVANCEDQFILE_H
diff --git a/plugins/CopyEngine/Ultracopier/DriveManagement.cpp b/plugins/CopyEngine/Ultracopier/DriveManagement.cpp
deleted file mode 100644
index 27fc9cb..0000000
--- a/plugins/CopyEngine/Ultracopier/DriveManagement.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-#include "DriveManagement.h"
-
-#include <QDir>
-#include <QFileInfoList>
-#include <QStorageInfo>
-
-#include "../../../cpp11addition.h"
-
-DriveManagement::DriveManagement()
-{
- tryUpdate();
- #ifdef Q_OS_WIN32
- reg1=std::regex("^(\\\\\\\\|//)[^\\\\\\\\/]+(\\\\|/)[^\\\\\\\\/]+.*");
- reg2=std::regex("^((\\\\\\\\|//)[^\\\\\\\\/]+(\\\\|/)[^\\\\\\\\/]+).*$");
- reg3=std::regex("^[a-zA-Z]:[\\\\/].*");
- reg4=std::regex("^([a-zA-Z]:[\\\\/]).*$");
- #endif
- /// \warn ULTRACOPIER_DEBUGCONSOLE() don't work here because the sinal slot is not connected!
-}
-
-//get drive of an file or folder
-/// \todo do network drive support for windows
-std::string DriveManagement::getDrive(const std::string &fileOrFolder) const
-{
- const std::string &inode=QDir::toNativeSeparators(QString::fromStdString(fileOrFolder)).toStdString();
- int size=mountSysPoint.size();
- for (int i = 0; i < size; ++i) {
- if(stringStartWith(inode,mountSysPoint.at(i)))
- return QDir::toNativeSeparators(QString::fromStdString(mountSysPoint.at(i))).toStdString();
- }
- #ifdef Q_OS_WIN32
- if(std::regex_match(fileOrFolder,reg1))
- {
- std::string returnString=fileOrFolder;
- std::regex_replace(returnString,reg2,"$1");
- return returnString;
- }
- //due to lack of WMI support into mingw, the new drive event is never called, this is a workaround
- if(std::regex_match(fileOrFolder,reg3))
- {
- std::string returnString=fileOrFolder;
- std::regex_replace(returnString,reg4,"$1");
- return QDir::toNativeSeparators(QString::fromStdString(returnString)).toUpper().toStdString();
- }
- #endif
- //if unable to locate the right mount point
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"unable to locate the right mount point for: "+inode+", mount point: "+stringimplode(mountSysPoint,";"));
- return std::string();
-}
-
-QByteArray DriveManagement::getDriveType(const std::string &drive) const
-{
- int index=vectorindexOf(mountSysPoint,drive);
- if(index!=-1)
- return driveType.at(index);
- return QByteArray();
-}
-
-bool DriveManagement::isSameDrive(const std::string &file1,const std::string &file2) const
-{
- if(mountSysPoint.size()==0)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"no mount point found");
- return false;
- }
- const std::string &drive1=getDrive(file1);
- if(drive1.empty())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"drive for the file1 not found: "+file1);
- return false;
- }
- const std::string &drive2=getDrive(file2);
- if(drive2.empty())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"drive for the file2 not found: "+file2);
- return false;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,drive1+" is egal to "+drive2);
- if(drive1==drive2)
- return true;
- else
- return false;
-}
-
-void DriveManagement::tryUpdate()
-{
- mountSysPoint.clear();
- driveType.clear();
- const QList<QStorageInfo> mountedVolumesList=QStorageInfo::mountedVolumes();
- int index=0;
- while(index<mountedVolumesList.size())
- {
- mountSysPoint.push_back(QDir::toNativeSeparators(mountedVolumesList.at(index).rootPath()).toStdString());
- #ifdef Q_OS_WIN32
- if(mountSysPoint.back()!="A:\\" && mountSysPoint.back()!="A:/" && mountSysPoint.back()!="A:" && mountSysPoint.back()!="A" &&
- mountSysPoint.back()!="a:\\" && mountSysPoint.back()!="a:/" && mountSysPoint.back()!="a:" && mountSysPoint.back()!="a")
- driveType.push_back(mountedVolumesList.at(index).fileSystemType());
- else
- driveType.push_back(QByteArray());
- #else
- driveType.push_back(mountedVolumesList.at(index).fileSystemType());
- #endif
- index++;
- }
-}
diff --git a/plugins/CopyEngine/Ultracopier/Languages/ja/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/ja/translation.ts
deleted file mode 100644
index 19bfabd..0000000
--- a/plugins/CopyEngine/Ultracopier/Languages/ja/translation.ts
+++ /dev/null
@@ -1,1291 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1">
-<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngine</name>
- <message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
- <source>The engine is forced to move, you can&apos;t copy with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
- <source>The engine is forced to copy, you can&apos;t move with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Use the actual destination &quot;%1&quot;?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="732"/>
- <source>The mode has been forced previously. This is an internal error, please report it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngineFactory</name>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
- <location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options engine is not loaded, can&apos;t access to the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>DiskSpace</name>
- <message>
- <location filename="../../DiskSpace.ui" line="14"/>
- <source>Disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="24"/>
- <source>You need more space on this drive to finish this transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="49"/>
- <source>Continue</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="56"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.cpp" line="23"/>
- <source>Drives %1 have %2 available but need %3</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileErrorDialog</name>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
- <source>Error on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileExistsDialog</name>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
- <source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileIsSameDialog</name>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FilterRules</name>
- <message>
- <location filename="../../FilterRules.ui" line="17"/>
- <source>Filters dialog</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="33"/>
- <source>Search:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="43"/>
- <source>Search type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="51"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="56"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="61"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="69"/>
- <source>Apply on:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="77"/>
- <source>File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="82"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="87"/>
- <source>File and folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="95"/>
- <source>Whole string must match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="125"/>
- <source>The test string matches with the regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="102"/>
- <source>Checking</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="108"/>
- <source>The regex is valid</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="115"/>
- <source>Test string:</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Filters</name>
- <message>
- <location filename="../../Filters.ui" line="14"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="30"/>
- <source>Exclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="93"/>
- <source>Inclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="105"/>
- <source>None = Include all</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
- <source>Only on file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
- <source>Only on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
- <source>Full match</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FolderExistsDialog</name>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
- <source>Folder already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ListThread</name>
- <message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
- <source>Unable do to move or copy item into wrong forced mode: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
- <source>Unable to save the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1510"/>
- <source>Problem reading file, or file-size is 0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1517"/>
- <source>Wrong header: &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1526"/>
- <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1535"/>
- <source>The transfer list is in copy mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1541"/>
- <source>The transfer list is in move mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1604"/>
- <source>Some errors have been found during the line parsing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1612"/>
- <source>Unable to open the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>MkPath</name>
- <message>
- <location filename="../../MkPath.cpp" line="142"/>
- <source>Unable to create the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="155"/>
- <source>The source folder don&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="183"/>
- <source>Unable to temporary rename the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="206"/>
- <source>Unable to do the final real move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="233"/>
- <source>Unable to move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
- <source>Unable to remove</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ReadThread</name>
- <message>
- <location filename="../../ReadThread.cpp" line="59"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
- <source>File truncated during the read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>RenamingRules</name>
- <message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="35"/>
- <source>First renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="41"/>
- <source>%name% - copy%suffix%</source>
- <extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="57"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="67"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="51"/>
- <source>Second renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ScanFileOrFolder</name>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>TransferThread</name>
- <message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>WriteThread</name>
- <message>
- <location filename="../../WriteThread.cpp" line="83"/>
- <source>Path resolution error (Empty path)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>copyEngineOptions</name>
- <message>
- <location filename="../../copyEngineOptions.ui" line="44"/>
- <source>Transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
- <source>Move the whole folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
- <source>Transfer the file rights</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
- <source>Keep the file date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
- <source>Error and collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
- <source>When folder error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
- <source>When file error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
- <source>When file collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
- <source>Performance</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
- <source>Misc</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
- <source>Check the disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
- <source>Use this folder when destination is not set</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
- <source>Browse</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileErrorDialog</name>
- <message>
- <location filename="../../fileErrorDialog.ui" line="14"/>
- <source>Error with file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="20"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="59"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="76"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="93"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="110"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="127"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="173"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="193"/>
- <source>Try in with elevated privileges</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="200"/>
- <source>Put to bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="207"/>
- <source>Retry</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="214"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="221"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileExistsDialog</name>
- <message>
- <location filename="../../fileExistsDialog.ui" line="14"/>
- <source>The file exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="82"/>
- <location filename="../../fileExistsDialog.ui" line="170"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="99"/>
- <location filename="../../fileExistsDialog.ui" line="187"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="116"/>
- <location filename="../../fileExistsDialog.ui" line="204"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="133"/>
- <location filename="../../fileExistsDialog.ui" line="221"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="277"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="288"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="346"/>
- <location filename="../../fileExistsDialog.ui" line="349"/>
- <source>Overwrite if modification date differs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="308"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="315"/>
- <source>&amp;Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="325"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="332"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="341"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="354"/>
- <location filename="../../fileExistsDialog.ui" line="357"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileIsSameDialog</name>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="40"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="110"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="70"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="14"/>
- <source>The source and destination are same</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="90"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="159"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="170"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="190"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="197"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="204"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>folderExistsDialog</name>
- <message>
- <location filename="../../folderExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="14"/>
- <source>The source and destination is identical</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="82"/>
- <location filename="../../folderExistsDialog.ui" line="150"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="99"/>
- <location filename="../../folderExistsDialog.ui" line="160"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="116"/>
- <location filename="../../folderExistsDialog.ui" line="184"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="227"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="238"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="245"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="252"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="259"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="266"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/nl/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/nl/translation.ts
deleted file mode 100644
index e17b3f2..0000000
--- a/plugins/CopyEngine/Ultracopier/Languages/nl/translation.ts
+++ /dev/null
@@ -1,1291 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1">
-<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngine</name>
- <message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
- <source>The engine is forced to move, you can&apos;t copy with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
- <source>The engine is forced to copy, you can&apos;t move with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Use the actual destination &quot;%1&quot;?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="732"/>
- <source>The mode has been forced previously. This is an internal error, please report it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngineFactory</name>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
- <location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options engine is not loaded, can&apos;t access to the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>DiskSpace</name>
- <message>
- <location filename="../../DiskSpace.ui" line="14"/>
- <source>Disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="24"/>
- <source>You need more space on this drive to finish this transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="49"/>
- <source>Continue</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="56"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.cpp" line="23"/>
- <source>Drives %1 have %2 available but need %3</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileErrorDialog</name>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
- <source>Error on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileExistsDialog</name>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
- <source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileIsSameDialog</name>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FilterRules</name>
- <message>
- <location filename="../../FilterRules.ui" line="33"/>
- <source>Search:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="43"/>
- <source>Search type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="51"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="56"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="61"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="69"/>
- <source>Apply on:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="77"/>
- <source>File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="82"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="87"/>
- <source>File and folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="125"/>
- <source>The test string matches with the regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="102"/>
- <source>Checking</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="115"/>
- <source>Test string:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="17"/>
- <source>Filters dialog</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="95"/>
- <source>Whole string must match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="108"/>
- <source>The regex is valid</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Filters</name>
- <message>
- <location filename="../../Filters.ui" line="14"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="30"/>
- <source>Exclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="93"/>
- <source>Inclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="105"/>
- <source>None = Include all</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
- <source>Only on file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
- <source>Only on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
- <source>Full match</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FolderExistsDialog</name>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
- <source>Folder already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ListThread</name>
- <message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
- <source>Unable do to move or copy item into wrong forced mode: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
- <source>Unable to save the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1510"/>
- <source>Problem reading file, or file-size is 0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1517"/>
- <source>Wrong header: &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1526"/>
- <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1535"/>
- <source>The transfer list is in copy mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1541"/>
- <source>The transfer list is in move mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1604"/>
- <source>Some errors have been found during the line parsing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1612"/>
- <source>Unable to open the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>MkPath</name>
- <message>
- <location filename="../../MkPath.cpp" line="142"/>
- <source>Unable to create the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="155"/>
- <source>The source folder don&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="183"/>
- <source>Unable to temporary rename the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="206"/>
- <source>Unable to do the final real move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="233"/>
- <source>Unable to move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
- <source>Unable to remove</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ReadThread</name>
- <message>
- <location filename="../../ReadThread.cpp" line="59"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
- <source>File truncated during the read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>RenamingRules</name>
- <message>
- <location filename="../../RenamingRules.ui" line="35"/>
- <source>First renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="41"/>
- <source>%name% - copy%suffix%</source>
- <extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="57"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="67"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="51"/>
- <source>Second renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ScanFileOrFolder</name>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>TransferThread</name>
- <message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>WriteThread</name>
- <message>
- <location filename="../../WriteThread.cpp" line="83"/>
- <source>Path resolution error (Empty path)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>copyEngineOptions</name>
- <message>
- <location filename="../../copyEngineOptions.ui" line="44"/>
- <source>Transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
- <source>Move the whole folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
- <source>Transfer the file rights</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
- <source>Keep the file date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
- <source>Error and collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
- <source>When folder error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
- <source>When file error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
- <source>When file collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
- <source>Performance</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
- <source>Misc</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
- <source>Check the disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
- <source>Use this folder when destination is not set</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
- <source>Browse</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileErrorDialog</name>
- <message>
- <location filename="../../fileErrorDialog.ui" line="14"/>
- <source>Error with file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="20"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="59"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="76"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="93"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="110"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="127"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="173"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="193"/>
- <source>Try in with elevated privileges</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="200"/>
- <source>Put to bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="207"/>
- <source>Retry</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="214"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="221"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileExistsDialog</name>
- <message>
- <location filename="../../fileExistsDialog.ui" line="14"/>
- <source>The file exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="82"/>
- <location filename="../../fileExistsDialog.ui" line="170"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="99"/>
- <location filename="../../fileExistsDialog.ui" line="187"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="116"/>
- <location filename="../../fileExistsDialog.ui" line="204"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="133"/>
- <location filename="../../fileExistsDialog.ui" line="221"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="277"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="288"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="346"/>
- <location filename="../../fileExistsDialog.ui" line="349"/>
- <source>Overwrite if modification date differs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="308"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="315"/>
- <source>&amp;Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="325"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="332"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="341"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="354"/>
- <location filename="../../fileExistsDialog.ui" line="357"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileIsSameDialog</name>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="40"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="110"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="70"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="14"/>
- <source>The source and destination are same</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="90"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="159"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="170"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="190"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="197"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="204"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>folderExistsDialog</name>
- <message>
- <location filename="../../folderExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="14"/>
- <source>The source and destination is identical</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="82"/>
- <location filename="../../folderExistsDialog.ui" line="150"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="99"/>
- <location filename="../../folderExistsDialog.ui" line="160"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="116"/>
- <location filename="../../folderExistsDialog.ui" line="184"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="227"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="238"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="245"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="252"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="259"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="266"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/no/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/no/translation.ts
deleted file mode 100644
index e17b3f2..0000000
--- a/plugins/CopyEngine/Ultracopier/Languages/no/translation.ts
+++ /dev/null
@@ -1,1291 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1">
-<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngine</name>
- <message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
- <source>The engine is forced to move, you can&apos;t copy with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
- <source>The engine is forced to copy, you can&apos;t move with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Use the actual destination &quot;%1&quot;?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="732"/>
- <source>The mode has been forced previously. This is an internal error, please report it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngineFactory</name>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
- <location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options engine is not loaded, can&apos;t access to the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>DiskSpace</name>
- <message>
- <location filename="../../DiskSpace.ui" line="14"/>
- <source>Disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="24"/>
- <source>You need more space on this drive to finish this transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="49"/>
- <source>Continue</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="56"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.cpp" line="23"/>
- <source>Drives %1 have %2 available but need %3</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileErrorDialog</name>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
- <source>Error on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileExistsDialog</name>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
- <source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileIsSameDialog</name>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FilterRules</name>
- <message>
- <location filename="../../FilterRules.ui" line="33"/>
- <source>Search:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="43"/>
- <source>Search type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="51"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="56"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="61"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="69"/>
- <source>Apply on:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="77"/>
- <source>File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="82"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="87"/>
- <source>File and folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="125"/>
- <source>The test string matches with the regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="102"/>
- <source>Checking</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="115"/>
- <source>Test string:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="17"/>
- <source>Filters dialog</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="95"/>
- <source>Whole string must match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="108"/>
- <source>The regex is valid</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Filters</name>
- <message>
- <location filename="../../Filters.ui" line="14"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="30"/>
- <source>Exclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="93"/>
- <source>Inclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="105"/>
- <source>None = Include all</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
- <source>Only on file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
- <source>Only on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
- <source>Full match</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FolderExistsDialog</name>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
- <source>Folder already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ListThread</name>
- <message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
- <source>Unable do to move or copy item into wrong forced mode: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
- <source>Unable to save the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1510"/>
- <source>Problem reading file, or file-size is 0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1517"/>
- <source>Wrong header: &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1526"/>
- <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1535"/>
- <source>The transfer list is in copy mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1541"/>
- <source>The transfer list is in move mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1604"/>
- <source>Some errors have been found during the line parsing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1612"/>
- <source>Unable to open the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>MkPath</name>
- <message>
- <location filename="../../MkPath.cpp" line="142"/>
- <source>Unable to create the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="155"/>
- <source>The source folder don&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="183"/>
- <source>Unable to temporary rename the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="206"/>
- <source>Unable to do the final real move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="233"/>
- <source>Unable to move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
- <source>Unable to remove</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ReadThread</name>
- <message>
- <location filename="../../ReadThread.cpp" line="59"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
- <source>File truncated during the read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>RenamingRules</name>
- <message>
- <location filename="../../RenamingRules.ui" line="35"/>
- <source>First renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="41"/>
- <source>%name% - copy%suffix%</source>
- <extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="57"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="67"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="51"/>
- <source>Second renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ScanFileOrFolder</name>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>TransferThread</name>
- <message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>WriteThread</name>
- <message>
- <location filename="../../WriteThread.cpp" line="83"/>
- <source>Path resolution error (Empty path)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>copyEngineOptions</name>
- <message>
- <location filename="../../copyEngineOptions.ui" line="44"/>
- <source>Transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
- <source>Move the whole folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
- <source>Transfer the file rights</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
- <source>Keep the file date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
- <source>Error and collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
- <source>When folder error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
- <source>When file error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
- <source>When file collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
- <source>Performance</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
- <source>Misc</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
- <source>Check the disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
- <source>Use this folder when destination is not set</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
- <source>Browse</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileErrorDialog</name>
- <message>
- <location filename="../../fileErrorDialog.ui" line="14"/>
- <source>Error with file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="20"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="59"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="76"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="93"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="110"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="127"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="173"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="193"/>
- <source>Try in with elevated privileges</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="200"/>
- <source>Put to bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="207"/>
- <source>Retry</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="214"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="221"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileExistsDialog</name>
- <message>
- <location filename="../../fileExistsDialog.ui" line="14"/>
- <source>The file exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="82"/>
- <location filename="../../fileExistsDialog.ui" line="170"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="99"/>
- <location filename="../../fileExistsDialog.ui" line="187"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="116"/>
- <location filename="../../fileExistsDialog.ui" line="204"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="133"/>
- <location filename="../../fileExistsDialog.ui" line="221"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="277"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="288"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="346"/>
- <location filename="../../fileExistsDialog.ui" line="349"/>
- <source>Overwrite if modification date differs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="308"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="315"/>
- <source>&amp;Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="325"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="332"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="341"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="354"/>
- <location filename="../../fileExistsDialog.ui" line="357"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileIsSameDialog</name>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="40"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="110"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="70"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="14"/>
- <source>The source and destination are same</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="90"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="159"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="170"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="190"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="197"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="204"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>folderExistsDialog</name>
- <message>
- <location filename="../../folderExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="14"/>
- <source>The source and destination is identical</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="82"/>
- <location filename="../../folderExistsDialog.ui" line="150"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="99"/>
- <location filename="../../folderExistsDialog.ui" line="160"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="116"/>
- <location filename="../../folderExistsDialog.ui" line="184"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="227"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="238"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="245"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="252"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="259"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="266"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/pl/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/pl/translation.ts
deleted file mode 100644
index e17b3f2..0000000
--- a/plugins/CopyEngine/Ultracopier/Languages/pl/translation.ts
+++ /dev/null
@@ -1,1291 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1">
-<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngine</name>
- <message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
- <source>The engine is forced to move, you can&apos;t copy with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
- <source>The engine is forced to copy, you can&apos;t move with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Use the actual destination &quot;%1&quot;?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="732"/>
- <source>The mode has been forced previously. This is an internal error, please report it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngineFactory</name>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
- <location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options engine is not loaded, can&apos;t access to the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>DiskSpace</name>
- <message>
- <location filename="../../DiskSpace.ui" line="14"/>
- <source>Disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="24"/>
- <source>You need more space on this drive to finish this transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="49"/>
- <source>Continue</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="56"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.cpp" line="23"/>
- <source>Drives %1 have %2 available but need %3</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileErrorDialog</name>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
- <source>Error on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileExistsDialog</name>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
- <source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileIsSameDialog</name>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FilterRules</name>
- <message>
- <location filename="../../FilterRules.ui" line="33"/>
- <source>Search:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="43"/>
- <source>Search type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="51"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="56"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="61"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="69"/>
- <source>Apply on:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="77"/>
- <source>File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="82"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="87"/>
- <source>File and folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="125"/>
- <source>The test string matches with the regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="102"/>
- <source>Checking</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="115"/>
- <source>Test string:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="17"/>
- <source>Filters dialog</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="95"/>
- <source>Whole string must match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="108"/>
- <source>The regex is valid</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Filters</name>
- <message>
- <location filename="../../Filters.ui" line="14"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="30"/>
- <source>Exclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="93"/>
- <source>Inclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="105"/>
- <source>None = Include all</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
- <source>Only on file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
- <source>Only on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
- <source>Full match</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FolderExistsDialog</name>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
- <source>Folder already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ListThread</name>
- <message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
- <source>Unable do to move or copy item into wrong forced mode: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
- <source>Unable to save the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1510"/>
- <source>Problem reading file, or file-size is 0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1517"/>
- <source>Wrong header: &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1526"/>
- <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1535"/>
- <source>The transfer list is in copy mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1541"/>
- <source>The transfer list is in move mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1604"/>
- <source>Some errors have been found during the line parsing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1612"/>
- <source>Unable to open the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>MkPath</name>
- <message>
- <location filename="../../MkPath.cpp" line="142"/>
- <source>Unable to create the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="155"/>
- <source>The source folder don&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="183"/>
- <source>Unable to temporary rename the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="206"/>
- <source>Unable to do the final real move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="233"/>
- <source>Unable to move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
- <source>Unable to remove</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ReadThread</name>
- <message>
- <location filename="../../ReadThread.cpp" line="59"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
- <source>File truncated during the read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>RenamingRules</name>
- <message>
- <location filename="../../RenamingRules.ui" line="35"/>
- <source>First renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="41"/>
- <source>%name% - copy%suffix%</source>
- <extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="57"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="67"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="51"/>
- <source>Second renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ScanFileOrFolder</name>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>TransferThread</name>
- <message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>WriteThread</name>
- <message>
- <location filename="../../WriteThread.cpp" line="83"/>
- <source>Path resolution error (Empty path)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>copyEngineOptions</name>
- <message>
- <location filename="../../copyEngineOptions.ui" line="44"/>
- <source>Transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
- <source>Move the whole folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
- <source>Transfer the file rights</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
- <source>Keep the file date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
- <source>Error and collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
- <source>When folder error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
- <source>When file error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
- <source>When file collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
- <source>Performance</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
- <source>Misc</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
- <source>Check the disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
- <source>Use this folder when destination is not set</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
- <source>Browse</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileErrorDialog</name>
- <message>
- <location filename="../../fileErrorDialog.ui" line="14"/>
- <source>Error with file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="20"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="59"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="76"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="93"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="110"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="127"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="173"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="193"/>
- <source>Try in with elevated privileges</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="200"/>
- <source>Put to bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="207"/>
- <source>Retry</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="214"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="221"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileExistsDialog</name>
- <message>
- <location filename="../../fileExistsDialog.ui" line="14"/>
- <source>The file exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="82"/>
- <location filename="../../fileExistsDialog.ui" line="170"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="99"/>
- <location filename="../../fileExistsDialog.ui" line="187"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="116"/>
- <location filename="../../fileExistsDialog.ui" line="204"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="133"/>
- <location filename="../../fileExistsDialog.ui" line="221"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="277"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="288"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="346"/>
- <location filename="../../fileExistsDialog.ui" line="349"/>
- <source>Overwrite if modification date differs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="308"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="315"/>
- <source>&amp;Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="325"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="332"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="341"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="354"/>
- <location filename="../../fileExistsDialog.ui" line="357"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileIsSameDialog</name>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="40"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="110"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="70"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="14"/>
- <source>The source and destination are same</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="90"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="159"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="170"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="190"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="197"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="204"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>folderExistsDialog</name>
- <message>
- <location filename="../../folderExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="14"/>
- <source>The source and destination is identical</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="82"/>
- <location filename="../../folderExistsDialog.ui" line="150"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="99"/>
- <location filename="../../folderExistsDialog.ui" line="160"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="116"/>
- <location filename="../../folderExistsDialog.ui" line="184"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="227"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="238"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="245"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="252"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="259"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="266"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/pt/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/pt/translation.ts
deleted file mode 100644
index e17b3f2..0000000
--- a/plugins/CopyEngine/Ultracopier/Languages/pt/translation.ts
+++ /dev/null
@@ -1,1291 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1">
-<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngine</name>
- <message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
- <source>The engine is forced to move, you can&apos;t copy with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
- <source>The engine is forced to copy, you can&apos;t move with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Use the actual destination &quot;%1&quot;?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="732"/>
- <source>The mode has been forced previously. This is an internal error, please report it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngineFactory</name>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
- <location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options engine is not loaded, can&apos;t access to the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>DiskSpace</name>
- <message>
- <location filename="../../DiskSpace.ui" line="14"/>
- <source>Disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="24"/>
- <source>You need more space on this drive to finish this transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="49"/>
- <source>Continue</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="56"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.cpp" line="23"/>
- <source>Drives %1 have %2 available but need %3</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileErrorDialog</name>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
- <source>Error on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileExistsDialog</name>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
- <source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileIsSameDialog</name>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FilterRules</name>
- <message>
- <location filename="../../FilterRules.ui" line="33"/>
- <source>Search:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="43"/>
- <source>Search type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="51"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="56"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="61"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="69"/>
- <source>Apply on:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="77"/>
- <source>File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="82"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="87"/>
- <source>File and folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="125"/>
- <source>The test string matches with the regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="102"/>
- <source>Checking</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="115"/>
- <source>Test string:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="17"/>
- <source>Filters dialog</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="95"/>
- <source>Whole string must match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="108"/>
- <source>The regex is valid</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Filters</name>
- <message>
- <location filename="../../Filters.ui" line="14"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="30"/>
- <source>Exclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="93"/>
- <source>Inclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="105"/>
- <source>None = Include all</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
- <source>Only on file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
- <source>Only on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
- <source>Full match</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FolderExistsDialog</name>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
- <source>Folder already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ListThread</name>
- <message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
- <source>Unable do to move or copy item into wrong forced mode: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
- <source>Unable to save the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1510"/>
- <source>Problem reading file, or file-size is 0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1517"/>
- <source>Wrong header: &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1526"/>
- <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1535"/>
- <source>The transfer list is in copy mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1541"/>
- <source>The transfer list is in move mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1604"/>
- <source>Some errors have been found during the line parsing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1612"/>
- <source>Unable to open the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>MkPath</name>
- <message>
- <location filename="../../MkPath.cpp" line="142"/>
- <source>Unable to create the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="155"/>
- <source>The source folder don&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="183"/>
- <source>Unable to temporary rename the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="206"/>
- <source>Unable to do the final real move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="233"/>
- <source>Unable to move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
- <source>Unable to remove</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ReadThread</name>
- <message>
- <location filename="../../ReadThread.cpp" line="59"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
- <source>File truncated during the read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>RenamingRules</name>
- <message>
- <location filename="../../RenamingRules.ui" line="35"/>
- <source>First renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="41"/>
- <source>%name% - copy%suffix%</source>
- <extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="57"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="67"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="51"/>
- <source>Second renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ScanFileOrFolder</name>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>TransferThread</name>
- <message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>WriteThread</name>
- <message>
- <location filename="../../WriteThread.cpp" line="83"/>
- <source>Path resolution error (Empty path)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>copyEngineOptions</name>
- <message>
- <location filename="../../copyEngineOptions.ui" line="44"/>
- <source>Transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
- <source>Move the whole folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
- <source>Transfer the file rights</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
- <source>Keep the file date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
- <source>Error and collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
- <source>When folder error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
- <source>When file error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
- <source>When file collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
- <source>Performance</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
- <source>Misc</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
- <source>Check the disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
- <source>Use this folder when destination is not set</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
- <source>Browse</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileErrorDialog</name>
- <message>
- <location filename="../../fileErrorDialog.ui" line="14"/>
- <source>Error with file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="20"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="59"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="76"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="93"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="110"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="127"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="173"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="193"/>
- <source>Try in with elevated privileges</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="200"/>
- <source>Put to bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="207"/>
- <source>Retry</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="214"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="221"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileExistsDialog</name>
- <message>
- <location filename="../../fileExistsDialog.ui" line="14"/>
- <source>The file exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="82"/>
- <location filename="../../fileExistsDialog.ui" line="170"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="99"/>
- <location filename="../../fileExistsDialog.ui" line="187"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="116"/>
- <location filename="../../fileExistsDialog.ui" line="204"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="133"/>
- <location filename="../../fileExistsDialog.ui" line="221"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="277"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="288"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="346"/>
- <location filename="../../fileExistsDialog.ui" line="349"/>
- <source>Overwrite if modification date differs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="308"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="315"/>
- <source>&amp;Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="325"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="332"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="341"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="354"/>
- <location filename="../../fileExistsDialog.ui" line="357"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileIsSameDialog</name>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="40"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="110"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="70"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="14"/>
- <source>The source and destination are same</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="90"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="159"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="170"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="190"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="197"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="204"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>folderExistsDialog</name>
- <message>
- <location filename="../../folderExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="14"/>
- <source>The source and destination is identical</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="82"/>
- <location filename="../../folderExistsDialog.ui" line="150"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="99"/>
- <location filename="../../folderExistsDialog.ui" line="160"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="116"/>
- <location filename="../../folderExistsDialog.ui" line="184"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="227"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="238"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="245"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="252"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="259"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="266"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/th/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/th/translation.ts
deleted file mode 100644
index e17b3f2..0000000
--- a/plugins/CopyEngine/Ultracopier/Languages/th/translation.ts
+++ /dev/null
@@ -1,1291 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1">
-<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngine</name>
- <message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
- <source>The engine is forced to move, you can&apos;t copy with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
- <source>The engine is forced to copy, you can&apos;t move with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Use the actual destination &quot;%1&quot;?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="732"/>
- <source>The mode has been forced previously. This is an internal error, please report it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngineFactory</name>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
- <location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options engine is not loaded, can&apos;t access to the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>DiskSpace</name>
- <message>
- <location filename="../../DiskSpace.ui" line="14"/>
- <source>Disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="24"/>
- <source>You need more space on this drive to finish this transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="49"/>
- <source>Continue</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="56"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.cpp" line="23"/>
- <source>Drives %1 have %2 available but need %3</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileErrorDialog</name>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
- <source>Error on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileExistsDialog</name>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
- <source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileIsSameDialog</name>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FilterRules</name>
- <message>
- <location filename="../../FilterRules.ui" line="33"/>
- <source>Search:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="43"/>
- <source>Search type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="51"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="56"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="61"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="69"/>
- <source>Apply on:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="77"/>
- <source>File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="82"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="87"/>
- <source>File and folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="125"/>
- <source>The test string matches with the regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="102"/>
- <source>Checking</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="115"/>
- <source>Test string:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="17"/>
- <source>Filters dialog</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="95"/>
- <source>Whole string must match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="108"/>
- <source>The regex is valid</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Filters</name>
- <message>
- <location filename="../../Filters.ui" line="14"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="30"/>
- <source>Exclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="93"/>
- <source>Inclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="105"/>
- <source>None = Include all</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
- <source>Only on file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
- <source>Only on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
- <source>Full match</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FolderExistsDialog</name>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
- <source>Folder already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ListThread</name>
- <message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
- <source>Unable do to move or copy item into wrong forced mode: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
- <source>Unable to save the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1510"/>
- <source>Problem reading file, or file-size is 0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1517"/>
- <source>Wrong header: &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1526"/>
- <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1535"/>
- <source>The transfer list is in copy mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1541"/>
- <source>The transfer list is in move mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1604"/>
- <source>Some errors have been found during the line parsing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1612"/>
- <source>Unable to open the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>MkPath</name>
- <message>
- <location filename="../../MkPath.cpp" line="142"/>
- <source>Unable to create the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="155"/>
- <source>The source folder don&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="183"/>
- <source>Unable to temporary rename the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="206"/>
- <source>Unable to do the final real move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="233"/>
- <source>Unable to move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
- <source>Unable to remove</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ReadThread</name>
- <message>
- <location filename="../../ReadThread.cpp" line="59"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
- <source>File truncated during the read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>RenamingRules</name>
- <message>
- <location filename="../../RenamingRules.ui" line="35"/>
- <source>First renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="41"/>
- <source>%name% - copy%suffix%</source>
- <extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="57"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="67"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="51"/>
- <source>Second renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ScanFileOrFolder</name>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>TransferThread</name>
- <message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>WriteThread</name>
- <message>
- <location filename="../../WriteThread.cpp" line="83"/>
- <source>Path resolution error (Empty path)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>copyEngineOptions</name>
- <message>
- <location filename="../../copyEngineOptions.ui" line="44"/>
- <source>Transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
- <source>Move the whole folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
- <source>Transfer the file rights</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
- <source>Keep the file date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
- <source>Error and collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
- <source>When folder error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
- <source>When file error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
- <source>When file collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
- <source>Performance</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
- <source>Misc</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
- <source>Check the disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
- <source>Use this folder when destination is not set</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
- <source>Browse</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileErrorDialog</name>
- <message>
- <location filename="../../fileErrorDialog.ui" line="14"/>
- <source>Error with file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="20"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="59"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="76"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="93"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="110"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="127"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="173"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="193"/>
- <source>Try in with elevated privileges</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="200"/>
- <source>Put to bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="207"/>
- <source>Retry</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="214"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="221"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileExistsDialog</name>
- <message>
- <location filename="../../fileExistsDialog.ui" line="14"/>
- <source>The file exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="82"/>
- <location filename="../../fileExistsDialog.ui" line="170"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="99"/>
- <location filename="../../fileExistsDialog.ui" line="187"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="116"/>
- <location filename="../../fileExistsDialog.ui" line="204"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="133"/>
- <location filename="../../fileExistsDialog.ui" line="221"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="277"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="288"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="346"/>
- <location filename="../../fileExistsDialog.ui" line="349"/>
- <source>Overwrite if modification date differs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="308"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="315"/>
- <source>&amp;Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="325"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="332"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="341"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="354"/>
- <location filename="../../fileExistsDialog.ui" line="357"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileIsSameDialog</name>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="40"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="110"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="70"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="14"/>
- <source>The source and destination are same</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="90"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="159"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="170"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="190"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="197"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="204"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>folderExistsDialog</name>
- <message>
- <location filename="../../folderExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="14"/>
- <source>The source and destination is identical</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="82"/>
- <location filename="../../folderExistsDialog.ui" line="150"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="99"/>
- <location filename="../../folderExistsDialog.ui" line="160"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="116"/>
- <location filename="../../folderExistsDialog.ui" line="184"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="227"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="238"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="245"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="252"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="259"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="266"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/tr/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/tr/translation.ts
deleted file mode 100644
index e17b3f2..0000000
--- a/plugins/CopyEngine/Ultracopier/Languages/tr/translation.ts
+++ /dev/null
@@ -1,1291 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1">
-<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngine</name>
- <message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
- <source>The engine is forced to move, you can&apos;t copy with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
- <source>The engine is forced to copy, you can&apos;t move with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Use the actual destination &quot;%1&quot;?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="732"/>
- <source>The mode has been forced previously. This is an internal error, please report it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngineFactory</name>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
- <location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options engine is not loaded, can&apos;t access to the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>DiskSpace</name>
- <message>
- <location filename="../../DiskSpace.ui" line="14"/>
- <source>Disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="24"/>
- <source>You need more space on this drive to finish this transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="49"/>
- <source>Continue</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="56"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.cpp" line="23"/>
- <source>Drives %1 have %2 available but need %3</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileErrorDialog</name>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
- <source>Error on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileExistsDialog</name>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
- <source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileIsSameDialog</name>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FilterRules</name>
- <message>
- <location filename="../../FilterRules.ui" line="33"/>
- <source>Search:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="43"/>
- <source>Search type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="51"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="56"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="61"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="69"/>
- <source>Apply on:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="77"/>
- <source>File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="82"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="87"/>
- <source>File and folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="125"/>
- <source>The test string matches with the regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="102"/>
- <source>Checking</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="115"/>
- <source>Test string:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="17"/>
- <source>Filters dialog</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="95"/>
- <source>Whole string must match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="108"/>
- <source>The regex is valid</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Filters</name>
- <message>
- <location filename="../../Filters.ui" line="14"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="30"/>
- <source>Exclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="93"/>
- <source>Inclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="105"/>
- <source>None = Include all</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
- <source>Only on file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
- <source>Only on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
- <source>Full match</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FolderExistsDialog</name>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
- <source>Folder already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ListThread</name>
- <message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
- <source>Unable do to move or copy item into wrong forced mode: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
- <source>Unable to save the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1510"/>
- <source>Problem reading file, or file-size is 0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1517"/>
- <source>Wrong header: &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1526"/>
- <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1535"/>
- <source>The transfer list is in copy mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1541"/>
- <source>The transfer list is in move mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1604"/>
- <source>Some errors have been found during the line parsing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1612"/>
- <source>Unable to open the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>MkPath</name>
- <message>
- <location filename="../../MkPath.cpp" line="142"/>
- <source>Unable to create the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="155"/>
- <source>The source folder don&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="183"/>
- <source>Unable to temporary rename the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="206"/>
- <source>Unable to do the final real move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="233"/>
- <source>Unable to move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
- <source>Unable to remove</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ReadThread</name>
- <message>
- <location filename="../../ReadThread.cpp" line="59"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
- <source>File truncated during the read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>RenamingRules</name>
- <message>
- <location filename="../../RenamingRules.ui" line="35"/>
- <source>First renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="41"/>
- <source>%name% - copy%suffix%</source>
- <extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="57"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="67"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="51"/>
- <source>Second renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ScanFileOrFolder</name>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>TransferThread</name>
- <message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>WriteThread</name>
- <message>
- <location filename="../../WriteThread.cpp" line="83"/>
- <source>Path resolution error (Empty path)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>copyEngineOptions</name>
- <message>
- <location filename="../../copyEngineOptions.ui" line="44"/>
- <source>Transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
- <source>Move the whole folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
- <source>Transfer the file rights</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
- <source>Keep the file date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
- <source>Error and collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
- <source>When folder error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
- <source>When file error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
- <source>When file collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
- <source>Performance</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
- <source>Misc</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
- <source>Check the disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
- <source>Use this folder when destination is not set</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
- <source>Browse</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileErrorDialog</name>
- <message>
- <location filename="../../fileErrorDialog.ui" line="14"/>
- <source>Error with file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="20"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="59"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="76"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="93"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="110"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="127"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="173"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="193"/>
- <source>Try in with elevated privileges</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="200"/>
- <source>Put to bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="207"/>
- <source>Retry</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="214"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="221"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileExistsDialog</name>
- <message>
- <location filename="../../fileExistsDialog.ui" line="14"/>
- <source>The file exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="82"/>
- <location filename="../../fileExistsDialog.ui" line="170"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="99"/>
- <location filename="../../fileExistsDialog.ui" line="187"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="116"/>
- <location filename="../../fileExistsDialog.ui" line="204"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="133"/>
- <location filename="../../fileExistsDialog.ui" line="221"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="277"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="288"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="346"/>
- <location filename="../../fileExistsDialog.ui" line="349"/>
- <source>Overwrite if modification date differs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="308"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="315"/>
- <source>&amp;Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="325"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="332"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="341"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="354"/>
- <location filename="../../fileExistsDialog.ui" line="357"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileIsSameDialog</name>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="40"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="110"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="70"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="14"/>
- <source>The source and destination are same</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="90"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="159"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="170"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="190"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="197"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="204"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>folderExistsDialog</name>
- <message>
- <location filename="../../folderExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="14"/>
- <source>The source and destination is identical</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="82"/>
- <location filename="../../folderExistsDialog.ui" line="150"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="99"/>
- <location filename="../../folderExistsDialog.ui" line="160"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="116"/>
- <location filename="../../folderExistsDialog.ui" line="184"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="227"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="238"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="245"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="252"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="259"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="266"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/plugins/CopyEngine/Ultracopier/Languages/zh/translation.ts b/plugins/CopyEngine/Ultracopier/Languages/zh/translation.ts
deleted file mode 100644
index 19bfabd..0000000
--- a/plugins/CopyEngine/Ultracopier/Languages/zh/translation.ts
+++ /dev/null
@@ -1,1291 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1">
-<context>
- <name>AvancedQFile</name>
- <message>
- <location filename="../../AvancedQFile.cpp" line="26"/>
- <location filename="../../AvancedQFile.cpp" line="57"/>
- <location filename="../../AvancedQFile.cpp" line="88"/>
- <source>Not supported on this platform</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="40"/>
- <source>Last modified date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="71"/>
- <source>Last access date is wrong</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="121"/>
- <source>Unknown error: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="187"/>
- <source>Unknown error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../AvancedQFile.cpp" line="133"/>
- <source>Path conversion error</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngine</name>
- <message>
- <location filename="../../CopyEngine.cpp" line="429"/>
- <location filename="../../CopyEngine.cpp" line="451"/>
- <source>The engine is forced to move, you can&apos;t copy with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="462"/>
- <location filename="../../CopyEngine.cpp" line="484"/>
- <source>The engine is forced to copy, you can&apos;t move with it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="508"/>
- <source>Use the actual destination &quot;%1&quot;?</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="732"/>
- <source>The mode has been forced previously. This is an internal error, please report it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1062"/>
- <location filename="../../CopyEngine.cpp" line="1065"/>
- <location filename="../../CopyEngine.cpp" line="1070"/>
- <location filename="../../CopyEngine.cpp" line="1074"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1063"/>
- <location filename="../../CopyEngine.cpp" line="1067"/>
- <location filename="../../CopyEngine.cpp" line="1071"/>
- <location filename="../../CopyEngine.cpp" line="1075"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1066"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1068"/>
- <location filename="../../CopyEngine.cpp" line="1080"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1072"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1076"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1077"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1078"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1079"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1082"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1083"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1084"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngine.cpp" line="1185"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>CopyEngineFactory</name>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="427"/>
- <location filename="../../CopyEngineFactory.cpp" line="430"/>
- <location filename="../../CopyEngineFactory.cpp" line="435"/>
- <location filename="../../CopyEngineFactory.cpp" line="439"/>
- <source>Ask</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="428"/>
- <location filename="../../CopyEngineFactory.cpp" line="432"/>
- <location filename="../../CopyEngineFactory.cpp" line="436"/>
- <location filename="../../CopyEngineFactory.cpp" line="440"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="431"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="433"/>
- <location filename="../../CopyEngineFactory.cpp" line="445"/>
- <source>Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="437"/>
- <source>Put at the end</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="441"/>
- <source>Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="442"/>
- <source>Overwrite if different</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="443"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="444"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="447"/>
- <source>Automatic</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="448"/>
- <source>Sequential</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="449"/>
- <source>Parallel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="500"/>
- <source>Options engine is not loaded. Unable to access the filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../CopyEngineFactory.cpp" line="539"/>
- <source>Options engine is not loaded, can&apos;t access to the filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>DiskSpace</name>
- <message>
- <location filename="../../DiskSpace.ui" line="14"/>
- <source>Disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="24"/>
- <source>You need more space on this drive to finish this transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="49"/>
- <source>Continue</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.ui" line="56"/>
- <source>Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../DiskSpace.cpp" line="23"/>
- <source>Drives %1 have %2 available but need %3</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileErrorDialog</name>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="54"/>
- <source>Error on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileErrorDialog.cpp" line="57"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileExistsDialog</name>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="137"/>
- <source>%name% - copy%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="144"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileExistsDialog.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FileIsSameDialog</name>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="111"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="118"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FileIsSameDialog.cpp" line="184"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FilterRules</name>
- <message>
- <location filename="../../FilterRules.ui" line="17"/>
- <source>Filters dialog</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="33"/>
- <source>Search:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="43"/>
- <source>Search type:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="51"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="56"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="61"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="69"/>
- <source>Apply on:</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="77"/>
- <source>File</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="82"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="87"/>
- <source>File and folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="95"/>
- <source>Whole string must match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="125"/>
- <source>The test string matches with the regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="102"/>
- <source>Checking</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="108"/>
- <source>The regex is valid</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FilterRules.ui" line="115"/>
- <source>Test string:</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>Filters</name>
- <message>
- <location filename="../../Filters.ui" line="14"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="30"/>
- <source>Exclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="93"/>
- <source>Inclusion filters</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.ui" line="105"/>
- <source>None = Include all</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="93"/>
- <location filename="../../Filters.cpp" line="131"/>
- <source>Raw text</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="96"/>
- <location filename="../../Filters.cpp" line="134"/>
- <source>Simplified regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="99"/>
- <location filename="../../Filters.cpp" line="137"/>
- <source>Perl&apos;s regex</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="107"/>
- <location filename="../../Filters.cpp" line="145"/>
- <source>Only on file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="110"/>
- <location filename="../../Filters.cpp" line="148"/>
- <source>Only on folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../Filters.cpp" line="116"/>
- <location filename="../../Filters.cpp" line="154"/>
- <location filename="../../Filters.cpp" line="216"/>
- <location filename="../../Filters.cpp" line="255"/>
- <source>Full match</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>FolderExistsDialog</name>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="57"/>
- <source>Folder already exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="122"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="131"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../FolderExistsDialog.cpp" line="190"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ListThread</name>
- <message>
- <location filename="../../ListThread.cpp" line="1487"/>
- <location filename="../../ListThread.cpp" line="2419"/>
- <source>Unable do to move or copy item into wrong forced mode: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1494"/>
- <location filename="../../ListThread.cpp" line="2426"/>
- <source>Unable to save the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1510"/>
- <source>Problem reading file, or file-size is 0</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1517"/>
- <source>Wrong header: &quot;%1&quot;</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1526"/>
- <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1535"/>
- <source>The transfer list is in copy mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1541"/>
- <source>The transfer list is in move mode, but this instance is not in this mode</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1604"/>
- <source>Some errors have been found during the line parsing</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ListThread.cpp" line="1612"/>
- <source>Unable to open the transfer list: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>MkPath</name>
- <message>
- <location filename="../../MkPath.cpp" line="142"/>
- <source>Unable to create the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="155"/>
- <source>The source folder don&apos;t exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="183"/>
- <source>Unable to temporary rename the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="206"/>
- <source>Unable to do the final real move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="233"/>
- <source>Unable to move the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../MkPath.cpp" line="93"/>
- <location filename="../../MkPath.cpp" line="276"/>
- <source>Unable to remove</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ReadThread</name>
- <message>
- <location filename="../../ReadThread.cpp" line="59"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="188"/>
- <source>Internal error reading the source file:block size out of range</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="196"/>
- <location filename="../../ReadThread.cpp" line="420"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ReadThread.cpp" line="237"/>
- <location filename="../../ReadThread.cpp" line="468"/>
- <source>File truncated during the read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>RenamingRules</name>
- <message>
- <location filename="../../RenamingRules.ui" line="14"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="35"/>
- <source>First renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="41"/>
- <source>%name% - copy%suffix%</source>
- <extracomment>%name% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="57"/>
- <source>%name% - copy (%number%)%suffix%</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="67"/>
- <source>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variables: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; for the original file name, &lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number, &lt;span style=&quot; font-weight:600;&quot;&gt;%suffix%&lt;/span&gt; file suffix&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
- <extracomment>%name%, %number% should not be translated</extracomment>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.ui" line="51"/>
- <source>Second renaming</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="39"/>
- <location filename="../../RenamingRules.cpp" line="62"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../RenamingRules.cpp" line="43"/>
- <location filename="../../RenamingRules.cpp" line="73"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>ScanFileOrFolder</name>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="274"/>
- <source>Blacklisted folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="338"/>
- <source>%1 - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="345"/>
- <source>%1 - copy (%2)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="401"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="408"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="444"/>
- <source>This is not a folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="446"/>
- <source>The folder does exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="448"/>
- <source>The folder is not readable</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../ScanFileOrFolder.cpp" line="459"/>
- <source>Problem with name encoding</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>TransferThread</name>
- <message>
- <location filename="../../TransferThread.cpp" line="244"/>
- <location filename="../../TransferThread.cpp" line="673"/>
- <location filename="../../TransferThread.cpp" line="745"/>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <source>File not found</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="346"/>
- <location filename="../../TransferThread.cpp" line="363"/>
- <source>Wrong modification date or unable to get it, you can disable time transfer to do it</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="421"/>
- <location filename="../../TransferThread.cpp" line="444"/>
- <source>Internal error: Already opening</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="586"/>
- <source>Drive %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="588"/>
- <source>Unknown folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="592"/>
- <source>root</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="645"/>
- <source>%name% - copy</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="652"/>
- <source>%name% - copy (%number%)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="711"/>
- <location filename="../../TransferThread.cpp" line="826"/>
- <source>The source file doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="751"/>
- <location filename="../../TransferThread.cpp" line="838"/>
- <source>Unable to do the folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="787"/>
- <source>The source doesn&apos;t exist</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="832"/>
- <source>Another file exists at same place</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1134"/>
- <source>The checksums do not match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1224"/>
- <source>Internal error: The destination is not closed</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1239"/>
- <source>Internal error: The size transfered doesn&apos;t match</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1250"/>
- <source>Internal error: The buffer is not empty</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="1315"/>
- <location filename="../../TransferThread.cpp" line="1333"/>
- <location filename="../../TransferThread.cpp" line="1348"/>
- <source>Unable to change the date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../TransferThread.cpp" line="228"/>
- <source>Try rename with using special characters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>WriteThread</name>
- <message>
- <location filename="../../WriteThread.cpp" line="83"/>
- <source>Path resolution error (Empty path)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="277"/>
- <source>Internal error, please report it!</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="680"/>
- <source>Unable to read the source file: </source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../WriteThread.cpp" line="705"/>
- <source>File truncated during read, possible data change</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>copyEngineOptions</name>
- <message>
- <location filename="../../copyEngineOptions.ui" line="44"/>
- <source>Transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="53"/>
- <source>Move the whole folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="60"/>
- <source>Transfer the file rights</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="70"/>
- <source>Keep the file date</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="83"/>
- <source>Autostart the transfer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="90"/>
- <location filename="../../copyEngineOptions.ui" line="110"/>
- <source>Less performance if checked</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="113"/>
- <source>Follow the strict order</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="139"/>
- <source>Error and collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="145"/>
- <source>When folder error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="155"/>
- <source>When file error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="181"/>
- <source>When file collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="241"/>
- <source>When folder collision</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="272"/>
- <source>Check if destination folder exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="279"/>
- <source>Renaming rules</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="299"/>
- <source>Delete partially transferred files</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="312"/>
- <source>Rename the original destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="343"/>
- <source>Control</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="349"/>
- <source>Checksum</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="358"/>
- <source>Only after error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="365"/>
- <source>Ignore if impossible</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="382"/>
- <source>Verify checksums</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="414"/>
- <source>Performance</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="420"/>
- <source>Parallel buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="427"/>
- <location filename="../../copyEngineOptions.ui" line="440"/>
- <location filename="../../copyEngineOptions.ui" line="453"/>
- <location filename="../../copyEngineOptions.ui" line="490"/>
- <location filename="../../copyEngineOptions.ui" line="559"/>
- <source>KB</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="469"/>
- <source>Block size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="476"/>
- <source>Sequential buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="483"/>
- <source>Enable OS buffer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="506"/>
- <source>OS buffer only if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="513"/>
- <source>Transfer algorithm</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="552"/>
- <source>Parallelize if smaller than</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="582"/>
- <source>Inode threads (unsafe &gt; 1)</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="589"/>
- <location filename="../../copyEngineOptions.ui" line="599"/>
- <source>More cpu, but better organisation on the disk</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="602"/>
- <source>Order the list</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="618"/>
- <source>Misc</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="624"/>
- <source>Check the disk space</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="634"/>
- <source>Use this folder when destination is not set</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="646"/>
- <source>Browse</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../copyEngineOptions.ui" line="668"/>
- <source>Filters</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileErrorDialog</name>
- <message>
- <location filename="../../fileErrorDialog.ui" line="14"/>
- <source>Error with file</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="20"/>
- <source>Error</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="59"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="76"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="93"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="110"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="127"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="173"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="193"/>
- <source>Try in with elevated privileges</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="200"/>
- <source>Put to bottom</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="207"/>
- <source>Retry</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="214"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileErrorDialog.ui" line="221"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileExistsDialog</name>
- <message>
- <location filename="../../fileExistsDialog.ui" line="14"/>
- <source>The file exists</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="82"/>
- <location filename="../../fileExistsDialog.ui" line="170"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="99"/>
- <location filename="../../fileExistsDialog.ui" line="187"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="116"/>
- <location filename="../../fileExistsDialog.ui" line="204"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="133"/>
- <location filename="../../fileExistsDialog.ui" line="221"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="277"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="288"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="346"/>
- <location filename="../../fileExistsDialog.ui" line="349"/>
- <source>Overwrite if modification date differs</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="308"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="315"/>
- <source>&amp;Overwrite</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="325"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="332"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="341"/>
- <source>Overwrite if newer</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileExistsDialog.ui" line="354"/>
- <location filename="../../fileExistsDialog.ui" line="357"/>
- <source>Overwrite if older</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>fileIsSameDialog</name>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="40"/>
- <source>Size</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="110"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="70"/>
- <source>File name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="14"/>
- <source>The source and destination are same</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="90"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="159"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="170"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="190"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="197"/>
- <source>&amp;Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../fileIsSameDialog.ui" line="204"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-<context>
- <name>folderExistsDialog</name>
- <message>
- <location filename="../../folderExistsDialog.ui" line="34"/>
- <source>Source</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="50"/>
- <source>Destination</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="14"/>
- <source>The source and destination is identical</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="82"/>
- <location filename="../../folderExistsDialog.ui" line="150"/>
- <source>Modified</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="99"/>
- <location filename="../../folderExistsDialog.ui" line="160"/>
- <source>Folder name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="116"/>
- <location filename="../../folderExistsDialog.ui" line="184"/>
- <source>Folder</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="227"/>
- <source>Suggest new &amp;name</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="238"/>
- <source>&amp;Always perform this action</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="245"/>
- <source>&amp;Rename</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="252"/>
- <source>Merge</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="259"/>
- <source>Skip</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../../folderExistsDialog.ui" line="266"/>
- <source>&amp;Cancel</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/plugins/CopyEngine/Ultracopier/ListThread.cpp b/plugins/CopyEngine/Ultracopier/ListThread.cpp
deleted file mode 100644
index bb0bce6..0000000
--- a/plugins/CopyEngine/Ultracopier/ListThread.cpp
+++ /dev/null
@@ -1,2429 +0,0 @@
-#include "ListThread.h"
-#include <QStorageInfo>
-#include <QMutexLocker>
-#include <QtGlobal>
-#include "../../../cpp11addition.h"
-
-ListThread::ListThread(FacilityInterface * facilityInterface)
-{
- moveToThread(this);
- start(HighPriority);
- this->facilityInterface = facilityInterface;
- putInPause = false;
- sourceDriveMultiple = false;
- destinationDriveMultiple = false;
- destinationFolderMultiple = false;
- stopIt = false;
- bytesToTransfer = 0;
- bytesTransfered = 0;
- idIncrementNumber = 1;
- actualRealByteTransfered = 0;
- numberOfTransferIntoToDoList = 0;
- numberOfInodeOperation = 0;
- putAtBottom = 0;
- maxSpeed = 0;
- inodeThreads = 1;
- renameTheOriginalDestination = false;
- doRightTransfer = false;
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- rsync = false;
- #endif
- keepDate = false;
- checkDiskSpace = true;
- blockSize = ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*1024;
- sequentialBuffer = ULTRACOPIER_PLUGIN_DEFAULT_SEQUENTIAL_NUMBER_OF_BLOCK;
- parallelBuffer = ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- blockSizeAfterSpeedLimitation = blockSize;
- #endif
- osBufferLimit = 512;
- alwaysDoThisActionForFileExists = FileExists_NotSet;
- doChecksum = false;
- checksumIgnoreIfImpossible = true;
- checksumOnlyOnError = true;
- osBuffer = false;
- osBufferLimited = false;
- forcedMode = false;
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- clockForTheCopySpeed = NULL;
- multiForBigSpeed = 0;
- #endif
-
- #ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
- connect(&timerUpdateDebugDialog,&QTimer::timeout,this,&ListThread::timedUpdateDebugDialog);
- timerUpdateDebugDialog.start(ULTRACOPIER_PLUGIN_DEBUG_WINDOW_TIMER);
- #endif
- connect(this, &ListThread::tryCancel, this,&ListThread::cancel, Qt::QueuedConnection);
- connect(this, &ListThread::askNewTransferThread, this,&ListThread::createTransferThread, Qt::QueuedConnection);
- connect(&mkPathQueue, &MkPath::firstFolderFinish, this,&ListThread::mkPathFirstFolderFinish, Qt::QueuedConnection);
- connect(&mkPathQueue, &MkPath::errorOnFolder, this,&ListThread::mkPathErrorOnFolder, Qt::QueuedConnection);
- connect(this, &ListThread::send_syncTransferList, this,&ListThread::syncTransferList_internal, Qt::QueuedConnection);
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- connect(&mkPathQueue, &MkPath::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection);
- connect(&driveManagement,&DriveManagement::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection);
- #endif // ULTRACOPIER_PLUGIN_DEBUG
-
- emit askNewTransferThread();
- mkpathTransfer.release();
-}
-
-ListThread::~ListThread()
-{
- emit tryCancel();
- waitCancel.acquire();
- quit();
- wait();
-}
-
-//transfer is finished
-void ListThread::transferInodeIsClosed()
-{
- numberOfInodeOperation--;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
- #endif
- TransferThread *temp_transfer_thread=qobject_cast<TransferThread *>(QObject::sender());
- if(temp_transfer_thread==NULL)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not located!");
- return;
- }
- bool isFound=false;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- int countLocalParse=0;
- #endif
- if(temp_transfer_thread->getStat()!=TransferStat_Idle)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not idle!");
- return;
- }
- int int_for_internal_loop=0;
- const int &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(Ultracopier::DebugLevel_Notice,QStringLiteral("[%1] have finish, put at idle; for id: %2").arg(int_for_internal_loop).arg(temp_transfer_thread->transferId).toStdString());
- Ultracopier::ReturnActionOnCopyList newAction;
- newAction.type=Ultracopier::RemoveItem;
- newAction.userAction.moveAt=0;
- newAction.addAction=actionToDoTransferToItemOfCopyList(actionToDoListTransfer.at(int_for_internal_loop));
- newAction.userAction.position=int_for_internal_loop;
- actionDone.push_back(newAction);
- /// \todo check if item is at the right thread
- actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+int_for_internal_loop);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
- if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
- updateTheStatus();
-
- //add the current size of file, to general size because it's finish
- copiedSize=temp_transfer_thread->copiedSize();
- if(copiedSize>(qint64)temp_transfer_thread->transferSize)
- {
- oversize=copiedSize-temp_transfer_thread->transferSize;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"add oversize of: "+std::to_string(oversize));
- bytesToTransfer+=oversize;
- bytesTransfered+=oversize;
- }
- bytesTransfered+=temp_transfer_thread->transferSize;
-
- if(temp_transfer_thread->haveStartTime)
- {
- timeToTransfer.push_back(std::pair<uint64_t,uint32_t>(temp_transfer_thread->transferSize,temp_transfer_thread->startTransferTime.elapsed()));
- temp_transfer_thread->haveStartTime=false;
- }
- temp_transfer_thread->transferId=0;
- temp_transfer_thread->transferSize=0;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- countLocalParse++;
- #endif
- isFound=true;
- if(actionToDoListTransfer.empty())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionToDoListTransfer==0");
- actionToDoListInode.insert(actionToDoListInode.cbegin(),actionToDoListInode_afterTheTransfer.cbegin(),actionToDoListInode_afterTheTransfer.cend());
- actionToDoListInode_afterTheTransfer.clear();
- doNewActions_inode_manipulation();
- }
- break;
- }
- int_for_internal_loop++;
- }
- if(isFound)
- deleteTransferThread();
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,QStringLiteral("unable to found item into the todo list, id: %1, index: %2").arg(temp_transfer_thread->transferId).arg(int_for_internal_loop).toStdString());
- temp_transfer_thread->transferId=0;
- temp_transfer_thread->transferSize=0;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("countLocalParse: %1, actionToDoList.size(): %2").arg(countLocalParse).arg(actionToDoListTransfer.size()).toStdString());
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- if(countLocalParse!=1)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"countLocalParse != 1");
- #endif
- doNewActions_inode_manipulation();
-}
-
-/** \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(Ultracopier::DebugLevel_Critical,"transfer thread not located!");
- return;
- }
- bool isFound=false;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- int countLocalParse=0;
- #endif
- unsigned int indexAction=0;
- while(indexAction<actionToDoListTransfer.size())
- {
- if(actionToDoListTransfer.at(indexAction).id==transfer->transferId)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Put at the end: "+std::to_string(transfer->transferId));
- //push for interface at the end
- Ultracopier::ReturnActionOnCopyList newAction;
- newAction.type=Ultracopier::MoveItem;
- newAction.addAction.id=transfer->transferId;
- newAction.userAction.position=actionToDoListTransfer.size()-1;
- actionDone.push_back(newAction);
- //do the wait stat
- actionToDoListTransfer[indexAction].isRunning=false;
- //move at the end
- actionToDoListTransfer.push_back(actionToDoListTransfer.at(indexAction));
- actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+indexAction);
- //reset the thread list stat
- transfer->transferId=0;
- transfer->transferSize=0;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- countLocalParse++;
- #endif
- isFound=true;
- break;
- }
- indexAction++;
- }
- if(!isFound)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,QStringLiteral("unable to found item into the todo list, id: %1, index: %2").arg(transfer->transferId).toStdString());
- transfer->transferId=0;
- transfer->transferSize=0;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"countLocalParse: "+std::to_string(countLocalParse));
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- if(countLocalParse!=1)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"countLocalParse != 1");
- #endif
- transfer->skip();
-}
-
-//set the copy info and options before runing
-void ListThread::setRightTransfer(const bool doRightTransfer)
-{
- mkPathQueue.setRightTransfer(doRightTransfer);
- this->doRightTransfer=doRightTransfer;
- int index=0;
- int 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)
-{
- mkPathQueue.setKeepDate(keepDate);
- this->keepDate=keepDate;
- int index=0;
- int 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*1024;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- transferThreadList.at(index)->setBlockSize(this->blockSize);
- index++;
- }
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- setSpeedLimitation(maxSpeed);
- #endif
-}
-
-//set auto start
-void ListThread::setAutoStart(const bool autoStart)
-{
- this->autoStart=autoStart;
-}
-
-#ifdef ULTRACOPIER_PLUGIN_RSYNC
-/// \brief set rsync
-void ListThread::setRsync(const bool rsync)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"set rsync: "+std::to_string(rsync));
- this->rsync=rsync;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- transferThreadList.at(index)->setRsync(rsync);
- index++;
- }
- for(unsigned int i=0;i<scanFileOrFolderThreadsPool.size();i++)
- scanFileOrFolderThreadsPool.at(i)->setRsync(rsync);
-}
-#endif
-
-//set check destination folder
-void ListThread::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
-{
- this->checkDestinationFolderExists=checkDestinationFolderExists;
- for(unsigned 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 Ultracopier::CopyMode &mode)
-{
- if(stopIt)
- return;
- addToTransfer(sourceFileInfo,destinationFileInfo,mode);
-}
-
-// -> add thread safe, by Qt::BlockingQueuedConnection
-bool ListThread::haveSameSource(const std::vector<std::string> &sources)
-{
- if(stopIt)
- return false;
- if(sourceDriveMultiple)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sourceDriveMultiple");
- return false;
- }
- if(sourceDrive.empty())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sourceDrive.isEmpty()");
- return true;
- }
- unsigned int index=0;
- while(index<sources.size())
- {
- if(driveManagement.getDrive(sources.at(index))!=sourceDrive)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sources.at(index))!=sourceDrive");
- return false;
- }
- index++;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"seam have same source");
- return true;
-}
-
-// -> add thread safe, by Qt::BlockingQueuedConnection
-bool ListThread::haveSameDestination(const std::string &destination)
-{
- if(stopIt)
- return false;
- if(destinationDriveMultiple)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destinationDriveMultiple");
- return false;
- }
- if(destinationDrive.empty())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destinationDrive.isEmpty()");
- return true;
- }
- if(driveManagement.getDrive(destination)!=destinationDrive)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination!=destinationDrive");
- return false;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"seam have same destination");
- return true;
-}
-
-/// \return empty if multiple or no destination
-std::string ListThread::getUniqueDestinationFolder() const
-{
- if(stopIt)
- return std::string();
- if(destinationFolderMultiple)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destinationDriveMultiple");
- return std::string();
- }
- return destinationFolder;
-}
-
-ScanFileOrFolder * ListThread::newScanThread(Ultracopier::CopyMode mode)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start with: "+std::to_string(mode));
-
- //create new thread because is auto-detroyed
- scanFileOrFolderThreadsPool.push_back(new ScanFileOrFolder(mode));
- connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::finishedTheListing, this,&ListThread::scanThreadHaveFinishSlot, Qt::QueuedConnection);
- connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::fileTransfer, this,&ListThread::fileTransfer, Qt::QueuedConnection);
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection);
- #endif
- connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::newFolderListing, this,&ListThread::newFolderListing);
- connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::addToMovePath, this,&ListThread::addToMovePath, Qt::QueuedConnection);
- connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::addToRealMove, this,&ListThread::addToRealMove, Qt::QueuedConnection);
- connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::addToMkPath, this,&ListThread::addToMkPath, Qt::QueuedConnection);
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::addToRmForRsync, this,&ListThread::addToRmForRsync, Qt::QueuedConnection);
- #endif
-
- connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::errorOnFolder, this,&ListThread::errorOnFolder, Qt::QueuedConnection);
- connect(scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::folderAlreadyExists, this,&ListThread::folderAlreadyExists, Qt::QueuedConnection);
-
- connect(this,&ListThread::send_updateMount, scanFileOrFolderThreadsPool.back(),&ScanFileOrFolder::set_updateMount, Qt::QueuedConnection);
-
- scanFileOrFolderThreadsPool.back()->setFilters(include,exclude);
- scanFileOrFolderThreadsPool.back()->setCheckDestinationFolderExists(checkDestinationFolderExists && alwaysDoThisActionForFolderExists!=FolderExists_Merge);
- scanFileOrFolderThreadsPool.back()->setMoveTheWholeFolder(moveTheWholeFolder);
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- scanFileOrFolderThreadsPool.back()->setRsync(rsync);
- #endif
- if(scanFileOrFolderThreadsPool.size()==1)
- updateTheStatus();
- scanFileOrFolderThreadsPool.back()->setRenamingRules(firstRenamingRule,otherRenamingRule);
- return scanFileOrFolderThreadsPool.back();
-}
-
-void ListThread::scanThreadHaveFinishSlot()
-{
- scanThreadHaveFinish();
-}
-
-void ListThread::scanThreadHaveFinish(bool skipFirstRemove)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"listing thread have finish, skipFirstRemove: "+std::to_string(skipFirstRemove));
- if(!skipFirstRemove)
- {
- ScanFileOrFolder * senderThread = qobject_cast<ScanFileOrFolder *>(QObject::sender());
- if(senderThread==NULL)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"sender pointer null (plugin copy engine)");
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start the next thread, scanFileOrFolderThreadsPool.size(): "+std::to_string(scanFileOrFolderThreadsPool.size()));
- delete senderThread;
- vectorremoveOne(scanFileOrFolderThreadsPool,senderThread);
- if(scanFileOrFolderThreadsPool.empty())
- updateTheStatus();
- }
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start the next thread, scanFileOrFolderThreadsPool.size(): "+std::to_string(scanFileOrFolderThreadsPool.size()));
- if(scanFileOrFolderThreadsPool.size()>0)
- {
- //then start the next listing threads
- if(scanFileOrFolderThreadsPool.front()->isFinished())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Start listing thread");
- scanFileOrFolderThreadsPool.front()->start();
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"The listing thread is already running");
- }
- else
- autoStartAndCheckSpace();
-}
-
-void ListThread::autoStartAndCheckSpace()
-{
- if(needMoreSpace())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Need more space");
- return;
- }
- autoStartIfNeeded();
-}
-
-void ListThread::autoStartIfNeeded()
-{
- if(autoStart)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Auto start the copy");
- startGeneralTransfer();
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"Put the copy engine in pause");
- putInPause=true;
- emit isInPause(true);
- }
-}
-
-void ListThread::startGeneralTransfer()
-{
- doNewActions_inode_manipulation();
-}
-
-// -> add thread safe, by Qt::BlockingQueuedConnection
-bool ListThread::newCopy(const std::vector<std::string> &sources,const std::string &destination)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start: "+stringimplode(sources,";")+", destination: "+destination);
- ScanFileOrFolder * scanFileOrFolderThread = newScanThread(Ultracopier::Copy);
- if(scanFileOrFolderThread==NULL)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to get new thread");
- return false;
- }
- std::regex base_regex("^[a-z][a-z][a-z]*:/.*");
- std::smatch base_match;
- std::vector<std::string> sourcesClean;
- unsigned int index=0;
- while(index<sources.size())
- {
- std::string source=sources.at(index);
- //can be: file://192.168.0.99/share/file.txt
- //can be: file:///C:/file.txt
- //can be: file:///home/user/fileatrootunderunix
- #ifndef Q_OS_WIN
- if(stringStartWith(source,"file:///"))
- source.replace(0,7,"");
- #else
- if(stringStartWith(source,"file:///"))
- source.replace(0,8,"");
- else if(stringStartWith(source,"file://"))
- source.replace(0,5,"");
- else if(stringStartWith(source,"file:/"))
- source.replace(0,6,"");
- #endif
- else if (std::regex_match(source, base_match, base_regex))
- return false;
- if(index<99)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,sources.at(index)+" -> "+source);
- index++;
- sourcesClean.push_back(source);
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"sourcesClean: "+stringimplode(sourcesClean,";"));
- scanFileOrFolderThread->addToList(sourcesClean,destination);
- scanThreadHaveFinish(true);
- detectDrivesOfCurrentTransfer(sourcesClean,destination);
- return true;
-}
-
-// -> add thread safe, by Qt::BlockingQueuedConnection
-bool ListThread::newMove(const std::vector<std::string> &sources,const std::string &destination)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- ScanFileOrFolder * scanFileOrFolderThread = newScanThread(Ultracopier::Move);
- if(scanFileOrFolderThread==NULL)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to get new thread");
- return false;
- }
- scanFileOrFolderThread->addToList(sources,destination);
- scanThreadHaveFinish(true);
- detectDrivesOfCurrentTransfer(sources,destination);
- return true;
-}
-
-void ListThread::detectDrivesOfCurrentTransfer(const std::vector<std::string> &sources,const std::string &destination)
-{
- /* code to detect volume/mount point to group by windows */
- if(!sourceDriveMultiple)
- {
- unsigned int index=0;
- while(index<sources.size())
- {
- const std::string &tempDrive=driveManagement.getDrive(sources.at(index));
- //if have not already source, set the source
- if(sourceDrive.empty())
- sourceDrive=tempDrive;
- //if have previous source and the news source is not the same
- if(sourceDrive!=tempDrive)
- {
- sourceDriveMultiple=true;
- break;
- }
- index++;
- }
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source informations, sourceDrive: %1, sourceDriveMultiple: %2").arg(QString::fromStdString(sourceDrive)).arg(sourceDriveMultiple).toStdString());
- if(!destinationDriveMultiple)
- {
- const std::string &tempDrive=driveManagement.getDrive(destination);
- //if have not already destination, set the destination
- if(destinationDrive.empty())
- destinationDrive=tempDrive;
- //if have previous destination and the news destination is not the same
- if(destinationDrive!=tempDrive)
- destinationDriveMultiple=true;
- }
- if(!destinationFolderMultiple)
- {
- //if have not already destination, set the destination
- if(destinationFolder.empty())
- destinationFolder=destination;
- //if have previous destination and the news destination is not the same
- if(destinationFolder!=destination)
- destinationFolderMultiple=true;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("destination informations, destinationDrive: %1, destinationDriveMultiple: %2").arg(QString::fromStdString(destinationDrive)).arg(destinationDriveMultiple).toStdString());
-}
-
-void ListThread::setCollisionAction(const FileExistsAction &alwaysDoThisActionForFileExists)
-{
- this->alwaysDoThisActionForFileExists=alwaysDoThisActionForFileExists;
- int index=0;
- int 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(Ultracopier::DebugLevel_Notice,"start");
- emit send_syncTransferList();
-}
-
-//set the folder local collision
-void ListThread::setFolderCollision(const FolderExistsAction &alwaysDoThisActionForFolderExists)
-{
- this->alwaysDoThisActionForFolderExists=alwaysDoThisActionForFolderExists;
-}
-
-bool ListThread::getReturnBoolToCopyEngine() const
-{
- return returnBoolToCopyEngine;
-}
-
-std::pair<quint64, quint64> ListThread::getReturnPairQuint64ToCopyEngine() const
-{
- return returnPairQuint64ToCopyEngine;
-}
-
-Ultracopier::ItemOfCopyList ListThread::getReturnItemOfCopyListToCopyEngine() const
-{
- return returnItemOfCopyListToCopyEngine;
-}
-
-void ListThread::set_doChecksum(bool doChecksum)
-{
- this->doChecksum=doChecksum;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- transferThreadList.at(index)->set_doChecksum(doChecksum);
- index++;
- }
-}
-
-void ListThread::set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible)
-{
- this->checksumIgnoreIfImpossible=checksumIgnoreIfImpossible;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- transferThreadList.at(index)->set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
- index++;
- }
-}
-
-void ListThread::set_checksumOnlyOnError(bool checksumOnlyOnError)
-{
- this->checksumOnlyOnError=checksumOnlyOnError;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- transferThreadList.at(index)->set_checksumOnlyOnError(checksumOnlyOnError);
- index++;
- }
-}
-
-void ListThread::set_osBuffer(bool osBuffer)
-{
- this->osBuffer=osBuffer;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- transferThreadList.at(index)->set_osBuffer(osBuffer);
- index++;
- }
-}
-
-void ListThread::set_osBufferLimited(bool osBufferLimited)
-{
- this->osBufferLimited=osBufferLimited;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- transferThreadList.at(index)->set_osBufferLimited(osBufferLimited);
- index++;
- }
-}
-
-void ListThread::realByteTransfered()
-{
- quint64 totalRealByteTransfered=0;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- totalRealByteTransfered+=transferThreadList.at(index)->realByteTransfered();
- index++;
- }
- emit send_realBytesTransfered(totalRealByteTransfered);
-}
-
-void ListThread::pause()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- if(putInPause)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Seam already in pause!");
- return;
- }
- putInPause=true;
- int index=0;
- int 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(Ultracopier::DebugLevel_Notice,"start");
- if(!putInPause)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Seam already resumed!");
- return;
- }
- putInPause=false;
- startGeneralTransfer();
- doNewActions_start_transfer();
- int index=0;
- int 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 uint64_t &id)
-{
- skipInternal(id);
-}
-
-bool ListThread::skipInternal(const uint64_t &id)
-{
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- if(transferThreadList.at(index)->transferId==id)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"skip one transfer: "+std::to_string(id));
- transferThreadList.at(index)->skip();
- return true;
- }
- index++;
- }
- int int_for_internal_loop=0;
- const int &loop_size=actionToDoListTransfer.size();
- while(int_for_internal_loop<loop_size)
- {
- if(actionToDoListTransfer.at(int_for_internal_loop).id==id)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[%1] remove at not running, for id: %2").arg(int_for_internal_loop).arg(id).toStdString());
- Ultracopier::ReturnActionOnCopyList newAction;
- newAction.type=Ultracopier::RemoveItem;
- newAction.userAction.moveAt=1;
- newAction.addAction=actionToDoTransferToItemOfCopyList(actionToDoListTransfer.at(int_for_internal_loop));
- newAction.userAction.position=int_for_internal_loop;
- actionDone.push_back(newAction);
- actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+int_for_internal_loop);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
- if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
- updateTheStatus();
- return true;
- }
- int_for_internal_loop++;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"skip transfer not found: "+std::to_string(id));
- return false;
-}
-
-//executed in this thread
-void ListThread::cancel()
-{
- if(stopIt)
- {
- waitCancel.release();
- return;
- }
- stopIt=true;
- int index=0;
- int loop_size=transferThreadList.size();
- while(index<loop_size)
- {
- transferThreadList.at(index)->stop();
- index++;
- }
- index=0;
- loop_size=scanFileOrFolderThreadsPool.size();
- while(index<loop_size)
- {
- scanFileOrFolderThreadsPool.at(index)->stop();
- delete scanFileOrFolderThreadsPool.at(index);//->deleteLayer();
- scanFileOrFolderThreadsPool[index]=NULL;
- index++;
- }
- scanFileOrFolderThreadsPool.clear();
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- if(clockForTheCopySpeed!=NULL)
- {
- clockForTheCopySpeed->stop();
- delete clockForTheCopySpeed;
- clockForTheCopySpeed=NULL;
- }
- #endif
- checkIfReadyToCancel();
-}
-
-void ListThread::checkIfReadyToCancel()
-{
- if(!stopIt)
- return;
- int index=0;
- int loop_size=transferThreadList.size();
- while(index<loop_size)
- {
- if(transferThreadList.at(index)!=NULL)
- {
- if(transferThreadList.at(index)->transferId!=0)
- return;
- delete transferThreadList.at(index);//->deleteLayer();
- transferThreadList[index]=NULL;
- transferThreadList.erase(transferThreadList.cbegin()+index);
- loop_size=transferThreadList.size();
- index--;
- }
- index++;
- }
- actionToDoListTransfer.clear();
- actionToDoListInode.clear();
- actionToDoListInode_afterTheTransfer.clear();
- actionDone.clear();
- progressionList.clear();
- returnListItemOfCopyListToCopyEngine.clear();
- quit();
- waitCancel.release();
- emit canBeDeleted();
-}
-
-//speedLimitation in KB/s
-bool ListThread::setSpeedLimitation(const int64_t &speedLimitation)
-{
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"maxSpeed in KB/s: "+std::to_string(speedLimitation));
-
- if(speedLimitation>1024*1024)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"speedLimitation out of range");
- return false;
- }
- maxSpeed=speedLimitation;
-
- multiForBigSpeed=0;
- if(maxSpeed>0)
- {
- blockSizeAfterSpeedLimitation=blockSize;
-
- //try resolv the interval
- int newInterval;//in ms
- do
- {
- multiForBigSpeed++;
- //at max speed, is out of range for int, it's why quint64 is used
- newInterval=(((quint64)blockSize*(quint64)multiForBigSpeed*1000/* *1000 because interval is into ms, not s*/)/((quint64)maxSpeed*(quint64)1024));
- if(newInterval<0)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"calculated newInterval wrong");
- return false;
- }
- }
- while(newInterval<ULTRACOPIER_PLUGIN_MINTIMERINTERVAL);
-
- if(newInterval<=0)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"calculated newInterval wrong");
- return false;
- }
- //wait time too big, then shrink the block size and set interval to max size
- if(newInterval>ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"wait time too big, then shrink the block size and set interval to max size");
- newInterval=ULTRACOPIER_PLUGIN_MAXTIMERINTERVAL;
- multiForBigSpeed=1;
- blockSizeAfterSpeedLimitation=(this->maxSpeed*1024*newInterval)/1000;
-
- if(blockSizeAfterSpeedLimitation<10)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"calculated block size wrong");
- return false;
- }
-
- //set the new block size into the thread
- const int &loop_size=transferThreadList.size();
- int int_for_loop=0;
- while(int_for_loop<loop_size)
- {
- if(!transferThreadList.at(int_for_loop)->setBlockSize(blockSizeAfterSpeedLimitation))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the block size");
- int_for_loop++;
- }
- }
-
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("fixed speed with new block size and new interval in BlockSize: %1, multiForBigSpeed: %2, newInterval: %3, maxSpeed: %4")
- .arg(blockSizeAfterSpeedLimitation)
- .arg(multiForBigSpeed)
- .arg(newInterval)
- .arg(maxSpeed)
- .toStdString()
- );
-
- clockForTheCopySpeed->setInterval(newInterval);
- if(clockForTheCopySpeed!=NULL)
- clockForTheCopySpeed->start();
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"clockForTheCopySpeed == NULL at this point");
- }
- else
- {
- if(clockForTheCopySpeed!=NULL)
- clockForTheCopySpeed->stop();
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"clockForTheCopySpeed == NULL at this point");
- int int_for_loop=0;
- const int &loop_size=transferThreadList.size();
- while(int_for_loop<loop_size)
- {
- transferThreadList.at(int_for_loop)->setBlockSize(blockSize);
- int_for_loop++;
- }
- }
- int int_for_loop=0;
- const int &loop_size=transferThreadList.size();
- while(int_for_loop<loop_size)
- {
- transferThreadList.at(int_for_loop)->setMultiForBigSpeed(multiForBigSpeed);
- int_for_loop++;
- }
-
- return true;
- #else
- Q_UNUSED(speedLimitation);
- return false;
- #endif
-}
-
-void ListThread::updateTheStatus()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- sendActionDone();
- bool updateTheStatus_listing=scanFileOrFolderThreadsPool.size()>0;
- bool updateTheStatus_copying=actionToDoListTransfer.size()>0 || actionToDoListInode.size()>0 || actionToDoListInode_afterTheTransfer.size()>0;
- Ultracopier::EngineActionInProgress updateTheStatus_action_in_progress;
- if(updateTheStatus_copying && updateTheStatus_listing)
- updateTheStatus_action_in_progress=Ultracopier::CopyingAndListing;
- else if(updateTheStatus_listing)
- updateTheStatus_action_in_progress=Ultracopier::Listing;
- else if(updateTheStatus_copying)
- updateTheStatus_action_in_progress=Ultracopier::Copying;
- else
- updateTheStatus_action_in_progress=Ultracopier::Idle;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"emit actionInProgess("+std::to_string(updateTheStatus_action_in_progress)+")");
- emit actionInProgess(updateTheStatus_action_in_progress);
-}
-
-//set data local to the thread
-void ListThread::setAlwaysFileExistsAction(const FileExistsAction &alwaysDoThisActionForFileExists)
-{
- this->alwaysDoThisActionForFileExists=alwaysDoThisActionForFileExists;
- int int_for_loop=0;
- const int &loop_size=transferThreadList.size();
- while(int_for_loop<loop_size)
- {
- transferThreadList.at(int_for_loop)->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
- int_for_loop++;
- }
-}
-
-//mk path to do
-uint64_t ListThread::addToMkPath(const QFileInfo& source,const QFileInfo& destination, const int& inode)
-{
- if(stopIt)
- return 0;
- if(inode!=0 && (!keepDate && !doRightTransfer))
- return 0;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
- ActionToDoInode temp;
- temp.type = ActionType_MkPath;
- temp.id = generateIdNumber();
- temp.source = source;
- temp.destination= destination;
- temp.isRunning = false;
- actionToDoListInode.push_back(temp);
- return temp.id;
-}
-
-//add rm path to do
-void ListThread::addToMovePath(const QFileInfo& source, const QFileInfo &destination, const int& inodeToRemove)
-{
- if(stopIt)
- return;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2, inodeToRemove: %3").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).arg(inodeToRemove).toStdString());
- ActionToDoInode temp;
- temp.type = ActionType_MovePath;
- temp.id = generateIdNumber();
- temp.size = inodeToRemove;
- temp.source = source;
- temp.destination= destination;
- temp.isRunning = false;
- actionToDoListInode.push_back(temp);
-}
-
-void ListThread::addToRealMove(const QFileInfo& source,const QFileInfo& destination)
-{
- if(stopIt)
- return;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
- ActionToDoInode temp;
- temp.type = ActionType_RealMove;
- temp.id = generateIdNumber();
- temp.size = 0;
- temp.source = source;
- temp.destination= destination;
- temp.isRunning = false;
- actionToDoListInode.push_back(temp);
-}
-
-#ifdef ULTRACOPIER_PLUGIN_RSYNC
-//rsync rm
-void ListThread::addToRmForRsync(const QFileInfo& destination)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"inode: "+destination.absoluteFilePath().toStdString());
- ActionToDoInode temp;
- temp.type = ActionType_RmSync;
- temp.id = generateIdNumber();
- temp.destination= destination;
- temp.isRunning = false;
- actionToDoListInode.push_back(temp);
-}
-#endif
-
-//send action done
-void ListThread::sendActionDone()
-{
- if(!actionDone.empty())
- {
- emit newActionOnList(actionDone);
- actionDone.clear();
- }
- if(!timeToTransfer.empty())
- {
- emit doneTime(timeToTransfer);
- timeToTransfer.clear();
- }
-}
-
-//send progression
-void ListThread::sendProgression()
-{
- if(actionToDoListTransfer.empty())
- return;
- oversize=0;
- currentProgression=0;
- int int_for_loop=0;
- const int &loop_size=transferThreadList.size();
- while(int_for_loop<loop_size)
- {
- TransferThread * temp_transfer_thread=transferThreadList.at(int_for_loop);
- switch(temp_transfer_thread->getStat())
- {
- case TransferStat_Transfer:
- case TransferStat_PostTransfer:
- case TransferStat_Checksum:
- case TransferStat_PostOperation:
- {
- copiedSize=temp_transfer_thread->copiedSize();
-
- //for the general progression
- currentProgression+=copiedSize;
-
- //the oversize (when the file is bigger after/during the copy then what was during the listing)
- if(copiedSize>(qint64)temp_transfer_thread->transferSize)
- localOverSize=copiedSize-temp_transfer_thread->transferSize;
- else
- localOverSize=0;
-
- //the current size copied
- totalSize=temp_transfer_thread->transferSize+localOverSize;
- std::pair<uint64_t,uint64_t> progression=temp_transfer_thread->progression();
- tempItem.currentRead=progression.first;
- tempItem.currentWrite=progression.second;
- tempItem.id=temp_transfer_thread->transferId;
- tempItem.total=totalSize;
- progressionList.push_back(tempItem);
-
- //add the oversize to the general progression
- oversize+=localOverSize;
- }
- break;
- default:
- break;
- }
- int_for_loop++;
- }
- emit pushFileProgression(progressionList);
- progressionList.clear();
- emit pushGeneralProgression(bytesTransfered+currentProgression,bytesToTransfer+oversize);
- realByteTransfered();
-}
-
-//send the progression, after full reset of the interface (then all is empty)
-void ListThread::syncTransferList_internal()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- emit syncReady();
- actionDone.clear();
- //do list operation
- TransferThread *transferThread;
- const int &loop_size=actionToDoListTransfer.size();
- int loop_sub_size=transferThreadList.size();
- //this loop to have at max inodeThreads*inodeThreads, not inodeThreads*transferThreadList.size()
- int int_for_internal_loop;
- for(int int_for_loop=0; int_for_loop<loop_size; ++int_for_loop) {
- const ActionToDoTransfer &item=actionToDoListTransfer.at(int_for_loop);
- Ultracopier::ReturnActionOnCopyList newAction;
- newAction.type = Ultracopier::PreOperation;
- newAction.addAction.id = item.id;
- newAction.addAction.sourceFullPath = item.source.absoluteFilePath().toStdString();
- newAction.addAction.sourceFileName = item.source.fileName().toStdString();
- newAction.addAction.destinationFullPath = item.destination.absoluteFilePath().toStdString();
- newAction.addAction.destinationFileName = item.destination.fileName().toStdString();
- newAction.addAction.size = item.size;
- newAction.addAction.mode = item.mode;
- actionDone.push_back(newAction);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("id: %1, size: %2, name: %3, size2: %4").arg(item.id).arg(item.size).arg(item.source.absoluteFilePath()).arg(newAction.addAction.size).toStdString());
- 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);
- Ultracopier::ReturnActionOnCopyList newAction;
- newAction.type = Ultracopier::PreOperation;
- newAction.addAction.id = item.id;
- newAction.addAction.sourceFullPath = item.source.absoluteFilePath().toStdString();
- newAction.addAction.sourceFileName = item.source.fileName().toStdString();
- newAction.addAction.destinationFullPath = item.destination.absoluteFilePath().toStdString();
- newAction.addAction.destinationFileName = item.destination.fileName().toStdString();
- newAction.addAction.size = item.size;
- newAction.addAction.mode = item.mode;
- actionDone.push_back(newAction);
- if(transferThread->getStat()!=TransferStat_PreOperation)
- {
- Ultracopier::ReturnActionOnCopyList newAction;
- switch(transferThread->getStat())
- {
- case TransferStat_Transfer:
- newAction.type=Ultracopier::Transfer;
- break;
- /*case TransferStat_PostTransfer:
- newAction.type=Ultracopier::PostOperation;
- break;*/
- case TransferStat_PostOperation:
- newAction.type=Ultracopier::PostOperation;
- break;
- default:
- break;
- }
- newAction.addAction.id = item.id;
- actionDone.push_back(newAction);
- }
- }
- }
- }
-}
-
-//add file transfer to do
-uint64_t ListThread::addToTransfer(const QFileInfo& source,const QFileInfo& destination,const Ultracopier::CopyMode& mode)
-{
- if(stopIt)
- return 0;
- //add to transfer list
- numberOfTransferIntoToDoList++;
- quint64 size=0;
- if(!source.isSymLink())
- size=source.size();
- const std::string &drive=driveManagement.getDrive(destination.absoluteFilePath().toStdString());
- if(!drive.empty())//can be a network drive
- if(mode!=Ultracopier::Move || drive!=driveManagement.getDrive(source.absoluteFilePath().toStdString()))
- {
- if(requiredSpace.find(drive)!=requiredSpace.cend())
- {
- requiredSpace[drive]+=size;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("space needed add: %1, space needed: %2, on: %3").arg(size).arg(requiredSpace.at(drive)).arg(QString::fromStdString(drive)).toStdString());
- }
- else
- {
- requiredSpace[drive]=size;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("set space %1 needed, on: %2").arg(size).arg(QString::fromStdString(drive)).toStdString());
- }
- }
- bytesToTransfer+= size;
- ActionToDoTransfer temp;
- temp.id = generateIdNumber();
- temp.size = size;
- temp.source = source;
- temp.destination= destination;
- temp.mode = mode;
- temp.isRunning = false;
- actionToDoListTransfer.push_back(temp);
- //push the new transfer to interface
- Ultracopier::ReturnActionOnCopyList newAction;
- newAction.type = Ultracopier::AddingItem;
- newAction.addAction=actionToDoTransferToItemOfCopyList(temp);
- actionDone.push_back(newAction);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2, add entry: %3, size: %4, size2: %5, isSymLink: %6").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).arg(temp.id).arg(temp.size).arg(size).arg(source.isSymLink()).toStdString());
- return temp.id;
-}
-
-Ultracopier::ItemOfCopyList ListThread::actionToDoTransferToItemOfCopyList(const ListThread::ActionToDoTransfer &actionToDoTransfer)
-{
- Ultracopier::ItemOfCopyList itemOfCopyList;
- itemOfCopyList.id = actionToDoTransfer.id;
- itemOfCopyList.sourceFullPath = actionToDoTransfer.source.absoluteFilePath().toStdString();
- itemOfCopyList.sourceFileName = actionToDoTransfer.source.fileName().toStdString();
- itemOfCopyList.destinationFullPath = actionToDoTransfer.destination.absoluteFilePath().toStdString();
- itemOfCopyList.destinationFileName = actionToDoTransfer.destination.fileName().toStdString();
- itemOfCopyList.size = actionToDoTransfer.size;
- itemOfCopyList.mode = actionToDoTransfer.mode;
- return itemOfCopyList;
-}
-
-//generate id number
-uint64_t 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 std::vector<uint64_t> &ids)
-{
- for(unsigned int i=0;i<ids.size();i++)
- skipInternal(ids.at(i));
-}
-
-//put on top
-void ListThread::moveItemsOnTop(std::vector<uint64_t> ids)
-{
- if(actionToDoListTransfer.size()<=1)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- //do list operation
- int indexToMove=0;
- for (unsigned int i=0; i<actionToDoListTransfer.size(); ++i) {
- if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
- {
- vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(indexToMove));
- Ultracopier::ReturnActionOnCopyList newAction;
- newAction.type=Ultracopier::MoveItem;
- newAction.addAction.id=actionToDoListTransfer.at(i).id;
- newAction.userAction.moveAt=indexToMove;
- newAction.userAction.position=i;
- actionDone.push_back(newAction);
- ActionToDoTransfer temp=actionToDoListTransfer.at(i);
- actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+i);
- actionToDoListTransfer.insert(actionToDoListTransfer.cbegin()+indexToMove,temp);
- indexToMove++;
- if(ids.empty())
- return;
- }
- }
- sendActionDone();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
-}
-
-//move up
-void ListThread::moveItemsUp(std::vector<uint64_t> ids)
-{
- if(actionToDoListTransfer.size()<=1)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- //do list operation
- int lastGoodPositionReal=0;
- bool haveGoodPosition=false;
- for (unsigned int i=0; i<actionToDoListTransfer.size(); ++i) {
- if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
- {
- if(haveGoodPosition)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(i-1));
- Ultracopier::ReturnActionOnCopyList newAction;
- newAction.type=Ultracopier::MoveItem;
- newAction.addAction.id=actionToDoListTransfer.at(i).id;
- newAction.userAction.moveAt=lastGoodPositionReal;
- newAction.userAction.position=i;
- actionDone.push_back(newAction);
- ActionToDoTransfer temp1=actionToDoListTransfer.at(i);
- ActionToDoTransfer temp2=actionToDoListTransfer.at(lastGoodPositionReal);
- actionToDoListTransfer[i]=temp2;
- actionToDoListTransfer[lastGoodPositionReal]=temp1;
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Try move up false, item "+std::to_string(i));
- vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
- if(ids.empty())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop with return");
- return;
- }
- }
- else
- {
- lastGoodPositionReal=i;
- haveGoodPosition=true;
- }
- }
- sendActionDone();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
-}
-
-//move down
-void ListThread::moveItemsDown(std::vector<uint64_t> ids)
-{
- if(actionToDoListTransfer.size()<=1)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- //do list operation
- int lastGoodPositionReal=0;
- bool haveGoodPosition=false;
- for (int i=actionToDoListTransfer.size()-1; i>=0; --i) {
- if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
- {
- if(haveGoodPosition)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(i+1));
- Ultracopier::ReturnActionOnCopyList newAction;
- newAction.type=Ultracopier::MoveItem;
- newAction.addAction.id=actionToDoListTransfer.at(i).id;
- newAction.userAction.moveAt=lastGoodPositionReal;
- newAction.userAction.position=i;
- actionDone.push_back(newAction);
- ActionToDoTransfer temp1=actionToDoListTransfer.at(i);
- ActionToDoTransfer temp2=actionToDoListTransfer.at(lastGoodPositionReal);
- actionToDoListTransfer[i]=temp2;
- actionToDoListTransfer[lastGoodPositionReal]=temp1;
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Try move up false, item "+std::to_string(i));
- }
- vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
- if(ids.empty())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop with return");
- return;
- }
- }
- else
- {
- lastGoodPositionReal=i;
- haveGoodPosition=true;
- }
- }
- sendActionDone();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
-}
-
-//put on bottom
-void ListThread::moveItemsOnBottom(std::vector<uint64_t> ids)
-{
- if(actionToDoListTransfer.size()<=1)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list size is empty");
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- //do list operation
- int lastGoodPositionReal=actionToDoListTransfer.size()-1;
- for (int i=lastGoodPositionReal; i>=0; --i) {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Check action on item "+std::to_string(i));
- if(vectorcontainsAtLeastOne(ids,actionToDoListTransfer.at(i).id))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"move item "+std::to_string(i)+" to "+std::to_string(lastGoodPositionReal));
- vectorremoveOne(ids,actionToDoListTransfer.at(i).id);
- Ultracopier::ReturnActionOnCopyList newAction;
- newAction.type=Ultracopier::MoveItem;
- newAction.addAction.id=actionToDoListTransfer.at(i).id;
- newAction.userAction.moveAt=lastGoodPositionReal;
- newAction.userAction.position=i;
- actionDone.push_back(newAction);
- ActionToDoTransfer temp=actionToDoListTransfer.at(i);
- actionToDoListTransfer.erase(actionToDoListTransfer.cbegin()+i);
- actionToDoListTransfer.insert(actionToDoListTransfer.cbegin()+lastGoodPositionReal,temp);
- lastGoodPositionReal--;
- if(ids.empty())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop with return");
- return;
- }
- }
- }
- sendActionDone();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"stop");
-}
-
-/** \brief give the forced mode, to export/import transfer list */
-void ListThread::forceMode(const Ultracopier::CopyMode &mode)
-{
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- if(mode==Ultracopier::Move)
- setRsync(false);
- #endif
- if(mode==Ultracopier::Copy)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Force mode to copy");
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Force mode to move");
- this->mode=mode;
- forcedMode=true;
-}
-
-void ListThread::exportTransferList(const std::string &fileName)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- QFile transferFile(QString::fromStdString(fileName));
- if(transferFile.open(QIODevice::WriteOnly|QIODevice::Truncate))
- {
- transferFile.write(QStringLiteral("Ultracopier;Transfer-list;").toUtf8());
- if(!forcedMode)
- transferFile.write(QStringLiteral("Transfer;").toUtf8());
- else
- {
- if(mode==Ultracopier::Copy)
- transferFile.write(QStringLiteral("Copy;").toUtf8());
- else
- transferFile.write(QStringLiteral("Move;").toUtf8());
- }
- transferFile.write(QStringLiteral("Ultracopier\n").toUtf8());
- bool haveError=false;
- int size=actionToDoListTransfer.size();
- for (int index=0;index<size;++index) {
- if(actionToDoListTransfer.at(index).mode==Ultracopier::Copy)
- {
- if(!forcedMode || mode==Ultracopier::Copy)
- {
- if(forcedMode)
- transferFile.write(QStringLiteral("%1;%2\n").arg(actionToDoListTransfer.at(index).source.absoluteFilePath()).arg(actionToDoListTransfer.at(index).destination.absoluteFilePath()).toUtf8());
- else
- transferFile.write(QStringLiteral("Copy;%1;%2\n").arg(actionToDoListTransfer.at(index).source.absoluteFilePath()).arg(actionToDoListTransfer.at(index).destination.absoluteFilePath()).toUtf8());
- }
- else
- haveError=true;
- }
- else if(actionToDoListTransfer.at(index).mode==Ultracopier::Move)
- {
- if(!forcedMode || mode==Ultracopier::Move)
- {
- if(forcedMode)
- transferFile.write(QStringLiteral("%1;%2\n").arg(actionToDoListTransfer.at(index).source.absoluteFilePath()).arg(actionToDoListTransfer.at(index).destination.absoluteFilePath()).toUtf8());
- else
- transferFile.write(QStringLiteral("Move;%1;%2\n").arg(actionToDoListTransfer.at(index).source.absoluteFilePath()).arg(actionToDoListTransfer.at(index).destination.absoluteFilePath()).toUtf8());
- }
- else
- haveError=true;
- }
- }
- if(haveError)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("Unable do to move or copy item into wrong forced mode: %1").arg(transferFile.errorString()).toStdString());
- emit errorTransferList(tr("Unable do to move or copy item into wrong forced mode: %1").arg(transferFile.errorString()).toStdString());
- }
- transferFile.close();
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("Unable to save the transfer list: %1").arg(transferFile.errorString()).toStdString());
- emit errorTransferList(tr("Unable to save the transfer list: %1").arg(transferFile.errorString()).toStdString());
- return;
- }
-}
-
-void ListThread::importTransferList(const std::string &fileName)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- QFile transferFile(QString::fromStdString(fileName));
- if(transferFile.open(QIODevice::ReadOnly))
- {
- std::string content;
- QByteArray data=transferFile.readLine(64);
- if(data.size()<=0)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Problem reading file, or file-size is 0");
- emit errorTransferList(tr("Problem reading file, or file-size is 0").toStdString());
- return;
- }
- content=QString::fromUtf8(data).toStdString();
- if(content!="Ultracopier;Transfer-list;Transfer;Ultracopier\n" && content!="Ultracopier;Transfer-list;Copy;Ultracopier\n" && content!="Ultracopier;Transfer-list;Move;Ultracopier\n")
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Wrong header: "+content);
- emit errorTransferList(tr("Wrong header: \"%1\"").arg(QString::fromStdString(content)).toStdString());
- return;
- }
- bool transferListMixedMode=false;
- if(content=="Ultracopier;Transfer-list;Transfer;Ultracopier\n")
- {
- if(forcedMode)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The transfer list is in mixed mode, but this instance is not");
- emit errorTransferList(tr("The transfer list is in mixed mode, but this instance is not in this mode").toStdString());
- return;
- }
- else
- transferListMixedMode=true;
- }
- if(content=="Ultracopier;Transfer-list;Copy;Ultracopier\n" && (forcedMode && mode==Ultracopier::Move))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("The transfer list is in copy mode, but this instance is not: forcedMode: %1, mode: %2").arg(forcedMode).arg(mode).toStdString());
- emit errorTransferList(tr("The transfer list is in copy mode, but this instance is not in this mode").toStdString());
- return;
- }
- if(content=="Ultracopier;Transfer-list;Move;Ultracopier\n" && (forcedMode && mode==Ultracopier::Copy))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("The transfer list is in move mode, but this instance is not: forcedMode: %1, mode: %2").arg(forcedMode).arg(mode).toStdString());
- emit errorTransferList(tr("The transfer list is in move mode, but this instance is not in this mode").toStdString());
- return;
- }
-
- bool updateTheStatus_copying=actionToDoListTransfer.size()>0 || actionToDoListInode.size()>0 || actionToDoListInode_afterTheTransfer.size()>0;
- Ultracopier::EngineActionInProgress updateTheStatus_action_in_progress;
- if(updateTheStatus_copying)
- updateTheStatus_action_in_progress=Ultracopier::CopyingAndListing;
- else
- updateTheStatus_action_in_progress=Ultracopier::Listing;
- emit actionInProgess(updateTheStatus_action_in_progress);
-
- bool errorFound=false;
- std::regex correctLine;
- if(transferListMixedMode)
- correctLine=std::regex("^(Copy|Move);[^;]+;[^;]+[\n\r]*$");
- else
- correctLine=std::regex("^[^;]+;[^;]+[\n\r]*$");
- std::vector<std::string> args;
- Ultracopier::CopyMode tempMode;
- do
- {
- data=transferFile.readLine(65535*2);
- if(data.size()>0)
- {
- content=std::string(data.constData(),data.size());
- //do the import here
- if(std::regex_match(content,correctLine))
- {
- stringreplaceAll(content,"\n","");
- args=stringsplit(content,';');
- if(forcedMode)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("New data to import in forced mode: %2,%3")
- .arg(QString::fromStdString(args.at(0)))
- .arg(QString::fromStdString(args.at(1)))
- .toStdString());
- addToTransfer(QFileInfo(QString::fromStdString(args.at(0))),QFileInfo(QString::fromStdString(args.at(1))),mode);
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("New data to import: %1,%2,%3")
- .arg(QString::fromStdString(args.at(0)))
- .arg(QString::fromStdString(args.at(1)))
- .arg(QString::fromStdString(args.at(2)))
- .toStdString());
- if(args.at(0)=="Copy")
- tempMode=Ultracopier::Copy;
- else
- tempMode=Ultracopier::Move;
- addToTransfer(QFileInfo(QString::fromStdString(args.at(1))),QFileInfo(QString::fromStdString(args.at(2))),tempMode);
- }
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Wrong line syntax: "+content);
- errorFound=true;
- }
- }
- }
- while(data.size()>0);
- transferFile.close();
- if(errorFound)
- emit warningTransferList(tr("Some errors have been found during the line parsing").toStdString());
-
- updateTheStatus();//->sendActionDone(); into this
- autoStartAndCheckSpace();
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("Unable to open the transfer list: %1").arg(transferFile.errorString()).toStdString());
- emit errorTransferList(tr("Unable to open the transfer list: %1").arg(transferFile.errorString()).toStdString());
- return;
- }
-}
-
-int ListThread::getNumberOfTranferRuning() const
-{
- int numberOfTranferRuning=0;
- const int &loop_size=transferThreadList.size();
- //lunch the transfer in WaitForTheTransfer
- int int_for_loop=0;
- while(int_for_loop<loop_size)
- {
- if(transferThreadList.at(int_for_loop)->getStat()==TransferStat_Transfer && transferThreadList.at(int_for_loop)->transferId!=0 && transferThreadList.at(int_for_loop)->transferSize>=parallelizeIfSmallerThan)
- numberOfTranferRuning++;
- int_for_loop++;
- }
- return numberOfTranferRuning;
-}
-
-//return
-bool ListThread::needMoreSpace() const
-{
- if(!checkDiskSpace)
- return false;
- std::vector<Diskspace> diskspace_list;
- for( auto& spaceDrive : requiredSpace ) {
- const QString &drive=QString::fromStdString(spaceDrive.first);
- #ifdef Q_OS_WIN32
- if(spaceDrive.first!="A:\\" && spaceDrive.first!="A:/" && spaceDrive.first!="A:" && spaceDrive.first!="A" && spaceDrive.first!="a:\\" && spaceDrive.first!="a:/" && spaceDrive.first!="a:" && spaceDrive.first!="a")
- {
- #endif
- QStorageInfo storageInfo(drive);
- storageInfo.refresh();
- const qint64 &availableSpace=storageInfo.bytesAvailable();
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- const qint64 &bytesFree=storageInfo.bytesFree();
- #endif
-
- if(availableSpace<0 ||
- //workaround for all 0 value in case of bug from Qt
- (availableSpace==0 && storageInfo.bytesTotal()==0)
- )
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("availableSpace: %1, space needed: %2, on: %3, bytesFree: %4").arg(availableSpace).arg(spaceDrive.second).arg(drive).arg(bytesFree).toStdString());
- }
- else if(spaceDrive.second>(quint64)availableSpace)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("availableSpace: %1, space needed: %2, on: %3, bytesFree: %4").arg(availableSpace).arg(spaceDrive.second).arg(drive).arg(bytesFree).toStdString());
- #ifdef Q_OS_WIN32
- //if(drive.contains(QRegularExpression("^[a-zA-Z]:[\\\\/]")))
- if(drive.contains(QRegularExpression("^[a-zA-Z]:")))
- #endif
- {
- Diskspace diskspace;
- diskspace.drive=spaceDrive.first;
- diskspace.freeSpace=availableSpace;
- diskspace.requiredSpace=spaceDrive.second;
- diskspace_list.push_back(diskspace);
- }
- #ifdef Q_OS_WIN32
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"not local drive");
- #endif
- }
- #ifdef Q_OS_WIN32
- }
- #endif
- }
- if(!diskspace_list.empty())
- emit missingDiskSpace(diskspace_list);
- return ! diskspace_list.empty();
-}
-
-//do new actions
-void ListThread::doNewActions_start_transfer()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, numberOfTranferRuning: %2").arg(actionToDoListTransfer.size()).arg(getNumberOfTranferRuning()).toStdString());
- if(stopIt || putInPause)
- return;
- int numberOfTranferRuning=getNumberOfTranferRuning();
- const int &loop_size=transferThreadList.size();
- //lunch the transfer in WaitForTheTransfer
- int int_for_loop=0;
- while(int_for_loop<loop_size)
- {
- if(transferThreadList.at(int_for_loop)->getStat()==TransferStat_WaitForTheTransfer)
- {
- if(transferThreadList.at(int_for_loop)->transferSize>=parallelizeIfSmallerThan)
- {
- if(numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER)
- {
- transferThreadList.at(int_for_loop)->startTheTransfer();
- numberOfTranferRuning++;
- }
- }
- else
- transferThreadList.at(int_for_loop)->startTheTransfer();
- }
- int_for_loop++;
- }
- int_for_loop=0;
- while(int_for_loop<loop_size)
- {
- if(transferThreadList.at(int_for_loop)->getStat()==TransferStat_PreOperation)
- {
- if(transferThreadList.at(int_for_loop)->transferSize>=parallelizeIfSmallerThan)
- {
- if(numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER)
- {
- transferThreadList.at(int_for_loop)->startTheTransfer();
- numberOfTranferRuning++;
- }
- }
- else
- transferThreadList.at(int_for_loop)->startTheTransfer();
- }
- int_for_loop++;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfTranferRuning: "+std::to_string(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()
-{
- #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionToDoList.size(): "+std::to_string(actionToDoListTransfer.size()));
- #endif
- if(stopIt)
- checkIfReadyToCancel();
- if(stopIt || putInPause)
- return;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- #endif
- //lunch the pre-op or inode op
- TransferThread *currentTransferThread;
- int int_for_loop=0;
- int int_for_internal_loop=0;
- int int_for_transfer_thread_search=0;
- actionToDoListTransfer_count=actionToDoListTransfer.size();
- actionToDoListInode_count=actionToDoListInode.size();
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- //search the next transfer action to do
- while(int_for_loop<actionToDoListTransfer_count)
- {
- if(!actionToDoListTransfer.at(int_for_loop).isRunning)
- {
- //search the next inode action to do
- while(int_for_internal_loop<actionToDoListInode_count)
- {
- if(!actionToDoListInode.at(int_for_internal_loop).isRunning)
- {
- if(actionToDoListTransfer.at(int_for_loop).id<actionToDoListInode.at(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.at(int_for_transfer_thread_search);
- if(currentTransferThread->getStat()==TransferStat_Idle && currentTransferThread->transferId==0) // /!\ important!
- {
- std::string drive=driveManagement.getDrive(actionToDoListTransfer.at(int_for_internal_loop).destination.absoluteFilePath().toStdString());
- if(requiredSpace.find(drive)!=requiredSpace.cend() && (actionToDoListTransfer.at(int_for_internal_loop).mode!=Ultracopier::Move || drive!=driveManagement.getDrive(actionToDoListTransfer.at(int_for_internal_loop).source.absoluteFilePath().toStdString())))
- {
- requiredSpace[drive]-=actionToDoListTransfer.at(int_for_internal_loop).size;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("space needed removed: %1, space needed: %2, on: %3").arg(actionToDoListTransfer.at(int_for_internal_loop).size).arg(requiredSpace.at(drive)).arg(QString::fromStdString(drive)).toStdString());
- }
- currentTransferThread->transferId=currentActionToDoTransfer.id;
- currentTransferThread->transferSize=currentActionToDoTransfer.size;
- if(!currentTransferThread->setFiles(
- currentActionToDoTransfer.source,
- currentActionToDoTransfer.size,
- currentActionToDoTransfer.destination,
- currentActionToDoTransfer.mode
- ))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[%1] id: %2 is idle, but seam busy at set name: %3").arg(int_for_loop).arg(currentTransferThread->transferId).arg(currentActionToDoTransfer.destination.absoluteFilePath()).toStdString());
- break;
- }
- currentActionToDoTransfer.isRunning=true;
-
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("[%1] id: %2 is idle, use it for %3").arg(int_for_loop).arg(currentTransferThread->transferId).arg(currentActionToDoTransfer.destination.absoluteFilePath()).toStdString());
-
- /// \note wrong position? Else write why it's here
- Ultracopier::ReturnActionOnCopyList newAction;
- newAction.type = Ultracopier::PreOperation;
- newAction.addAction.id = currentActionToDoTransfer.id;
- newAction.addAction.sourceFullPath = currentActionToDoTransfer.source.absoluteFilePath().toStdString();
- newAction.addAction.sourceFileName = currentActionToDoTransfer.source.fileName().toStdString();
- newAction.addAction.destinationFullPath = currentActionToDoTransfer.destination.absoluteFilePath().toStdString();
- newAction.addAction.destinationFileName = currentActionToDoTransfer.destination.fileName().toStdString();
- newAction.addAction.size = currentActionToDoTransfer.size;
- newAction.addAction.mode = currentActionToDoTransfer.mode;
- actionDone.push_back(newAction);
- int_for_transfer_thread_search++;
- numberOfInodeOperation++;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
- #endif
- 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
- #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"unable to found free thread to do the transfer");
- #endif
- break;
- }
- #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
- #endif
- if(numberOfInodeOperation>=inodeThreads)
- break;
- if(followTheStrictOrder)
- break;
- }
- int_for_loop++;
- }
- //search the next inode action to do
- int_for_internal_loop=0;
- while(int_for_internal_loop<actionToDoListInode_count)
- {
- if(!actionToDoListInode.at(int_for_internal_loop).isRunning)
- {
- //do the inode action
- #include "ListThread_InodeAction.cpp"
- }
- int_for_internal_loop++;
- }
- //error checking
- if(actionToDoListInode_count>inodeThreads)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("The index have been detected as out of max range: %1>%2").arg(actionToDoListInode_count).arg(inodeThreads).toStdString());
- return;
- }
-}
-
-//restart transfer if it can
-void ListThread::restartTransferIfItCan()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- TransferThread *transfer=qobject_cast<TransferThread *>(QObject::sender());
- if(transfer==NULL)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"transfer thread not located!");
- return;
- }
- int numberOfTranferRuning=getNumberOfTranferRuning();
- if(numberOfTranferRuning<ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER && transfer->getStat()==TransferStat_WaitForTheTransfer)
- transfer->startTheTransfer();
- doNewActions_start_transfer();
-}
-
-/// \brief update the transfer stat
-void ListThread::newTransferStat(const TransferStat &stat,const quint64 &id)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"TransferStat: "+std::to_string(stat));
- Ultracopier::ReturnActionOnCopyList newAction;
- switch(stat)
- {
- case TransferStat_Idle:
- return;
- break;
- case TransferStat_PreOperation:
- return;
- break;
- case TransferStat_WaitForTheTransfer:
- return;
- break;
- case TransferStat_Transfer:
- newAction.type=Ultracopier::Transfer;
- break;
- case TransferStat_PostTransfer:
- case TransferStat_PostOperation:
- newAction.type=Ultracopier::PostOperation;
- break;
- case TransferStat_Checksum:
- newAction.type=Ultracopier::CustomOperation;
- break;
- default:
- return;
- break;
- }
- newAction.addAction.id = id;
- actionDone.push_back(newAction);
-}
-
-void ListThread::set_osBufferLimit(const unsigned int &osBufferLimit)
-{
- this->osBufferLimit=osBufferLimit;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- transferThreadList.at(index)->set_osBufferLimit(osBufferLimit);
- index++;
- }
-}
-
-void ListThread::set_setFilters(const std::vector<Filters_rules> &include,const std::vector<Filters_rules> &exclude)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("include.size(): %1, exclude.size(): %2").arg(include.size()).arg(exclude.size()).toStdString());
- this->include=include;
- this->exclude=exclude;
- unsigned int index=0;
- while(index<scanFileOrFolderThreadsPool.size())
- {
- scanFileOrFolderThreadsPool.at(index)->setFilters(include,exclude);
- index++;
- }
-}
-
-void ListThread::set_sendNewRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule)
-{
- this->firstRenamingRule=firstRenamingRule;
- this->otherRenamingRule=otherRenamingRule;
- emit send_sendNewRenamingRules(firstRenamingRule,otherRenamingRule);
-}
-
-void ListThread::set_updateMount()
-{
- driveManagement.tryUpdate();
- emit send_updateMount();
-}
-
-void ListThread::mkPathFirstFolderFinish()
-{
- int int_for_loop=0;
- const int &loop_size=actionToDoListInode.size();
- while(int_for_loop<loop_size)
- {
- if(actionToDoListInode.at(int_for_loop).isRunning)
- {
- if(actionToDoListInode.at(int_for_loop).type==ActionType_MkPath)
- {
- //to send to the log
- emit mkPath(actionToDoListInode.at(int_for_loop).destination.absoluteFilePath().toStdString());
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("stop mkpath: %1").arg(actionToDoListInode.at(int_for_loop).destination.absoluteFilePath()).toStdString());
- actionToDoListInode.erase(actionToDoListInode.cbegin()+int_for_loop);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
- if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
- updateTheStatus();
- numberOfInodeOperation--;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
- #endif
- doNewActions_inode_manipulation();
- return;
- }
- if(actionToDoListInode.at(int_for_loop).type==ActionType_MovePath || actionToDoListInode.at(int_for_loop).type==ActionType_RealMove
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- || actionToDoListInode.at(int_for_loop).type==ActionType_RmSync
- #endif
- )
- {
- //to send to the log
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- if(actionToDoListInode.at(int_for_loop).type!=ActionType_RmSync)
- emit mkPath(actionToDoListInode.at(int_for_loop).destination.absoluteFilePath().toStdString());
- #else
- emit mkPath(actionToDoListInode.at(int_for_loop).destination.absoluteFilePath().toStdString());
- #endif
- emit rmPath(actionToDoListInode.at(int_for_loop).source.absoluteFilePath().toStdString());
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("stop mkpath: %1").arg(actionToDoListInode.at(int_for_loop).destination.absoluteFilePath()).toStdString());
- actionToDoListInode.erase(actionToDoListInode.cbegin()+int_for_loop);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("actionToDoListTransfer.size(): %1, actionToDoListInode: %2, actionToDoListInode_afterTheTransfer: %3").arg(actionToDoListTransfer.size()).arg(actionToDoListInode.size()).arg(actionToDoListInode_afterTheTransfer.size()).toStdString());
- if(actionToDoListTransfer.empty() && actionToDoListInode.empty() && actionToDoListInode_afterTheTransfer.empty())
- updateTheStatus();
- numberOfInodeOperation--;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG_SCHEDULER
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"numberOfInodeOperation: "+std::to_string(numberOfInodeOperation));
- #endif
- doNewActions_inode_manipulation();
- return;
- }
-
- }
- int_for_loop++;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"unable to found item into the todo list");
-}
-
-#ifdef ULTRACOPIER_PLUGIN_DEBUG_WINDOW
-
-void ListThread::timedUpdateDebugDialog()
-{
- std::vector<std::string> newList;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- QString stat;
- switch(transferThreadList.at(index)->getStat())
- {
- case TransferStat_Idle:
- stat="Idle";
- break;
- case TransferStat_PreOperation:
- stat="PreOperation";
- break;
- case TransferStat_WaitForTheTransfer:
- stat="WaitForTheTransfer";
- break;
- case TransferStat_Transfer:
- stat="Transfer";
- break;
- case TransferStat_PostOperation:
- stat="PostOperation";
- break;
- case TransferStat_PostTransfer:
- stat="PostTransfer";
- break;
- case TransferStat_Checksum:
- stat="Checksum";
- break;
- default:
- stat=QStringLiteral("??? (%1)").arg(transferThreadList.at(index)->getStat());
- break;
- }
- newList.push_back(QStringLiteral("%1) (%3,%4) %2")
- .arg(index)
- .arg(stat)
- .arg(transferThreadList.at(index)->readingLetter())
- .arg(transferThreadList.at(index)->writingLetter())
- .toStdString()
- );
- index++;
- }
- std::vector<std::string> newList2;
- index=0;
- const int &loop_size=actionToDoListTransfer.size();
- while(index<loop_size)
- {
- newList2.push_back(QStringLiteral("%1 %2 %3")
- .arg(actionToDoListTransfer.at(index).source.absoluteFilePath())
- .arg(actionToDoListTransfer.at(index).size)
- .arg(actionToDoListTransfer.at(index).destination.absoluteFilePath())
- .toStdString()
- );
- if(index>((inodeThreads+ULTRACOPIER_PLUGIN_MAXPARALLELTRANFER)*2+1))
- {
- newList2.push_back("...");
- 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 std::string &errorString, const ErrorType &errorType)
-{
- TransferThread * transferThread=qobject_cast<TransferThread *>(sender());
- if(transferThread==NULL)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Thread locating error");
- return;
- }
- ErrorLogEntry errorLogEntry;
- errorLogEntry.source=transferThread->getSourceInode();
- errorLogEntry.destination=transferThread->getDestinationInode();
- errorLogEntry.mode=transferThread->getMode();
- errorLogEntry.error=errorString;
- errorLog.push_back(errorLogEntry);
- emit errorToRetry(transferThread->getSourcePath(),transferThread->getDestinationPath(),errorString);
- emit send_errorOnFile(fileInfo,errorString,transferThread,errorType);
-}
-
-/// \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 std::string &errorString,const ErrorType &errorType)
-{
- emit send_errorOnFolder(fileInfo,errorString,qobject_cast<ScanFileOrFolder *>(sender()),errorType);
-}
-
-//to run the thread
-void ListThread::run()
-{
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- clockForTheCopySpeed=new QTimer();
- #endif
-
- exec();
-}
-
-void ListThread::getNeedPutAtBottom(const QFileInfo &fileInfo, const std::string &errorString, TransferThread *thread, const ErrorType &errorType)
-{
- if(actionToDoListTransfer.empty())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"can't try put at bottom if empty");
- this->alwaysDoThisActionForFileExists=FileExists_NotSet;
- putAtBottom=0;
- emit haveNeedPutAtBottom(false,fileInfo,errorString,thread,errorType);
- return;
- }
- bool needPutAtBottom=(putAtBottom<(quint32)actionToDoListTransfer.size());
- if(!needPutAtBottom)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Reset put at bottom");
- this->alwaysDoThisActionForFileExists=FileExists_NotSet;
- putAtBottom=0;
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"Put at bottom for later try");
- thread->putAtBottom();
- putAtBottom++;
- return;
- }
- emit haveNeedPutAtBottom(needPutAtBottom,fileInfo,errorString,thread,errorType);
-}
-
-/// \to create transfer thread
-void ListThread::createTransferThread()
-{
- if(stopIt)
- return;
- if(transferThreadList.size()>=(unsigned int)inodeThreads)
- return;
- transferThreadList.push_back(new TransferThread());
- TransferThread * last=transferThreadList.back();
- last->transferId=0;
- last->transferSize=0;
- last->setRightTransfer(doRightTransfer);
- last->setKeepDate(keepDate);
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- if(!last->setBlockSize(blockSizeAfterSpeedLimitation))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the block size: "+std::to_string(blockSizeAfterSpeedLimitation));
- #else
- if(!last->setBlockSize(blockSize))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the block size: "+std::to_string(blockSize));
- #endif
- if(!last->setSequentialBuffer(sequentialBuffer))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the sequentialBuffer: "+std::to_string(sequentialBuffer));
- if(!last->setBlockSize(parallelBuffer))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the parallelBuffer: "+std::to_string(parallelBuffer));
- last->setAlwaysFileExistsAction(alwaysDoThisActionForFileExists);
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- last->setMultiForBigSpeed(multiForBigSpeed);
- #endif
- last->set_doChecksum(doChecksum);
- last->set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
- last->set_checksumOnlyOnError(checksumOnlyOnError);
- last->set_osBuffer(osBuffer);
- last->set_osBufferLimited(osBufferLimited);
- last->set_osBufferLimit(osBufferLimit);
- last->setDeletePartiallyTransferredFiles(deletePartiallyTransferredFiles);
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- last->setRsync(rsync);
- #endif
-
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- connect(last,&TransferThread::debugInformation, this,&ListThread::debugInformation, Qt::QueuedConnection);
- #endif // ULTRACOPIER_PLUGIN_DEBUG
- connect(last,&TransferThread::errorOnFile, this,&ListThread::errorOnFile, Qt::QueuedConnection);
- connect(last,&TransferThread::fileAlreadyExists, this,&ListThread::fileAlreadyExists, Qt::QueuedConnection);
- connect(last,&TransferThread::tryPutAtBottom, this,&ListThread::transferPutAtBottom, Qt::QueuedConnection);
- connect(last,&TransferThread::readStopped, this,&ListThread::doNewActions_start_transfer, Qt::QueuedConnection);
- connect(last,&TransferThread::preOperationStopped, this,&ListThread::doNewActions_start_transfer, Qt::QueuedConnection);
- connect(last,&TransferThread::postOperationStopped, this,&ListThread::transferInodeIsClosed, Qt::QueuedConnection);
- connect(last,&TransferThread::checkIfItCanBeResumed, this,&ListThread::restartTransferIfItCan, Qt::QueuedConnection);
- connect(last,&TransferThread::pushStat, this,&ListThread::newTransferStat, Qt::QueuedConnection);
-
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- //speed limitation
- connect(clockForTheCopySpeed, &QTimer::timeout, last, &TransferThread::timeOfTheBlockCopyFinished, Qt::QueuedConnection);
- #endif
-
- connect(this,&ListThread::send_sendNewRenamingRules, last,&TransferThread::setRenamingRules, Qt::QueuedConnection);
-
- connect(this,&ListThread::send_setTransferAlgorithm, last,&TransferThread::setTransferAlgorithm, Qt::QueuedConnection);
- connect(this,&ListThread::send_parallelBuffer, last,&TransferThread::setParallelBuffer, Qt::QueuedConnection);
- connect(this,&ListThread::send_sequentialBuffer, last,&TransferThread::setSequentialBuffer, Qt::QueuedConnection);
- connect(this,&ListThread::send_updateMount, last,&TransferThread::set_updateMount, Qt::QueuedConnection);
-
- last->start();
- last->setObjectName(QStringLiteral("transfer %1").arg(transferThreadList.size()-1));
- last->setMkpathTransfer(&mkpathTransfer);
- last->setRenamingRules(firstRenamingRule,otherRenamingRule);
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- last->setId(transferThreadList.size()-1);
- #endif
- if(transferThreadList.size()>=(unsigned int)inodeThreads)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"create the last of the "+std::to_string(inodeThreads)+" transferThread");
- return;
- }
- if(stopIt)
- return;
- doNewActions_inode_manipulation();
- emit askNewTransferThread();
-}
-
-void ListThread::deleteTransferThread()
-{
- int loop_size=transferThreadList.size();
- if(loop_size>inodeThreads)
- {
- int index=0;
- while(index<loop_size && loop_size>inodeThreads)
- {
- if(transferThreadList.at(index)->getStat()==TransferStat_Idle && transferThreadList.at(index)->transferId==0)
- {
- transferThreadList.at(index)->stop();
- delete transferThreadList.at(index);//->deleteLayer();
- transferThreadList[index]=NULL;
- transferThreadList.erase(transferThreadList.cbegin()+index);
- loop_size--;
- }
- else
- index++;
- }
- if(loop_size==inodeThreads)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"inodeThreads is lowered to the right value: "+std::to_string(inodeThreads));
- }
-}
-
-void ListThread::setTransferAlgorithm(const TransferAlgorithm &transferAlgorithm)
-{
- if(transferAlgorithm==TransferAlgorithm_Sequential)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Sequential");
- else if(transferAlgorithm==TransferAlgorithm_Automatic)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Automatic");
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"transferAlgorithm==TransferAlgorithm_Parallel");
- emit send_setTransferAlgorithm(transferAlgorithm);
-}
-
-void ListThread::setParallelBuffer(int parallelBuffer)
-{
- if(parallelBuffer<1 || parallelBuffer>ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"wrong number of block: "+std::to_string(parallelBuffer));
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"in number of block: "+std::to_string(parallelBuffer));
- this->parallelBuffer=parallelBuffer;
- emit send_parallelBuffer(parallelBuffer);
-}
-
-void ListThread::setSequentialBuffer(int sequentialBuffer)
-{
- if(sequentialBuffer<1 || sequentialBuffer>ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"wrong number of block: "+std::to_string(sequentialBuffer));
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"in number of block: "+std::to_string(sequentialBuffer));
- this->sequentialBuffer=sequentialBuffer;
- emit send_sequentialBuffer(sequentialBuffer);
-}
-
-void ListThread::setParallelizeIfSmallerThan(const unsigned int &parallelizeIfSmallerThan)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"parallelizeIfSmallerThan in Bytes: "+std::to_string(parallelizeIfSmallerThan));
- this->parallelizeIfSmallerThan=parallelizeIfSmallerThan;
-}
-
-void ListThread::setMoveTheWholeFolder(const bool &moveTheWholeFolder)
-{
- for(unsigned int i=0;i<scanFileOrFolderThreadsPool.size();i++)
- scanFileOrFolderThreadsPool.at(i)->setMoveTheWholeFolder(moveTheWholeFolder);
- this->moveTheWholeFolder=moveTheWholeFolder;
-}
-
-void ListThread::setFollowTheStrictOrder(const bool &followTheStrictOrder)
-{
- this->followTheStrictOrder=followTheStrictOrder;
-}
-
-void ListThread::setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles)
-{
- this->deletePartiallyTransferredFiles=deletePartiallyTransferredFiles;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- transferThreadList.at(index)->setDeletePartiallyTransferredFiles(deletePartiallyTransferredFiles);
- index++;
- }
-}
-
-void ListThread::setInodeThreads(const int &inodeThreads)
-{
- if(inodeThreads<1 || inodeThreads>32)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"inodeThreads is out of ranges: "+std::to_string(inodeThreads));
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"inodeThreads: "+std::to_string(inodeThreads));
- this->inodeThreads=inodeThreads;
- createTransferThread();
- deleteTransferThread();
-}
-
-void ListThread::setRenameTheOriginalDestination(const bool &renameTheOriginalDestination)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"renameTheOriginalDestination: "+std::to_string(renameTheOriginalDestination));
- this->renameTheOriginalDestination=renameTheOriginalDestination;
- int index=0;
- int loop_sub_size_transfer_thread_search=transferThreadList.size();
- while(index<loop_sub_size_transfer_thread_search)
- {
- transferThreadList.at(index)->setRenameTheOriginalDestination(renameTheOriginalDestination);
- index++;
- }
-}
-
-void ListThread::setCheckDiskSpace(const bool &checkDiskSpace)
-{
- this->checkDiskSpace=checkDiskSpace;
-}
-
-void ListThread::setCopyListOrder(const bool &order)
-{
- this->copyListOrder=order;
- for(unsigned int i=0;i<scanFileOrFolderThreadsPool.size();i++)
- scanFileOrFolderThreadsPool.at(i)->setCopyListOrder(this->copyListOrder);
-}
-
-void ListThread::exportErrorIntoTransferList(const std::string &fileName)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- QFile transferFile(QString::fromStdString(fileName));
- if(transferFile.open(QIODevice::WriteOnly|QIODevice::Truncate))
- {
- transferFile.write(QStringLiteral("Ultracopier;Transfer-list;").toUtf8());
- if(!forcedMode)
- transferFile.write(QStringLiteral("Transfer;").toUtf8());
- else
- {
- if(mode==Ultracopier::Copy)
- transferFile.write(QStringLiteral("Copy;").toUtf8());
- else
- transferFile.write(QStringLiteral("Move;").toUtf8());
- }
- transferFile.write(QStringLiteral("Ultracopier\n").toUtf8());
- bool haveError=false;
- int size=errorLog.size();
- for (int index=0;index<size;++index) {
- if(errorLog.at(index).mode==Ultracopier::Copy)
- {
- if(!forcedMode || mode==Ultracopier::Copy)
- {
- if(forcedMode)
- transferFile.write(QStringLiteral("%1;%2\n").arg(errorLog.at(index).source.absoluteFilePath()).arg(errorLog.at(index).destination.absoluteFilePath()).toUtf8());
- else
- transferFile.write(QStringLiteral("Copy;%1;%2\n").arg(errorLog.at(index).source.absoluteFilePath()).arg(errorLog.at(index).destination.absoluteFilePath()).toUtf8());
- }
- else
- haveError=true;
- }
- else if(errorLog.at(index).mode==Ultracopier::Move)
- {
- if(!forcedMode || mode==Ultracopier::Move)
- {
- if(forcedMode)
- transferFile.write(QStringLiteral("%1;%2\n").arg(errorLog.at(index).source.absoluteFilePath()).arg(errorLog.at(index).destination.absoluteFilePath()).toUtf8());
- else
- transferFile.write(QStringLiteral("Move;%1;%2\n").arg(errorLog.at(index).source.absoluteFilePath()).arg(errorLog.at(index).destination.absoluteFilePath()).toUtf8());
- }
- else
- haveError=true;
- }
- }
- if(haveError)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable do to move or copy item into wrong forced mode: "+transferFile.errorString().toStdString());
- emit errorTransferList(tr("Unable do to move or copy item into wrong forced mode: %1").arg(transferFile.errorString()).toStdString());
- }
- transferFile.close();
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to save the transfer list: "+transferFile.errorString().toStdString());
- emit errorTransferList(tr("Unable to save the transfer list: %1").arg(transferFile.errorString()).toStdString());
- return;
- }
-}
diff --git a/plugins/CopyEngine/Ultracopier/ListThread_InodeAction.cpp b/plugins/CopyEngine/Ultracopier/ListThread_InodeAction.cpp
deleted file mode 100644
index 12421f2..0000000
--- a/plugins/CopyEngine/Ultracopier/ListThread_InodeAction.cpp
+++ /dev/null
@@ -1,64 +0,0 @@
-/** \file ListThread_InodeAction.cpp
-\brief To be included into ListThread.cpp, to optimize and prevent code duplication
-\see ListThread.cpp */
-
-#ifdef LISTTHREAD_H
-
-//do the inode action
-ActionToDoInode& currentActionToDoInode=actionToDoListInode[int_for_internal_loop];
-switch(currentActionToDoInode.type)
-{
- case ActionType_RealMove:
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("launch real move, source: %1, destination: %2").arg(currentActionToDoInode.source.absoluteFilePath()).arg(currentActionToDoInode.destination.absoluteFilePath()).toStdString());
- mkPathQueue.addPath(currentActionToDoInode.source.absoluteFilePath(),currentActionToDoInode.destination.absoluteFilePath(),currentActionToDoInode.type);
- currentActionToDoInode.isRunning=true;
- numberOfInodeOperation++;
- if(numberOfInodeOperation>=inodeThreads)
- return;
- break;
- case ActionType_MkPath:
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("launch mkpath, source: %1, destination: %2").arg(currentActionToDoInode.source.absoluteFilePath()).arg(currentActionToDoInode.destination.absoluteFilePath()).toStdString());
- mkPathQueue.addPath(currentActionToDoInode.source.absoluteFilePath(),currentActionToDoInode.destination.absoluteFilePath(),currentActionToDoInode.type);
- currentActionToDoInode.isRunning=true;
- numberOfInodeOperation++;
- if(numberOfInodeOperation>=inodeThreads)
- return;
- break;
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- case ActionType_RmSync:
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QString("launch rmsync, destination: %1").arg(currentActionToDoInode.destination.absoluteFilePath()).toStdString());
- mkPathQueue.addPath(currentActionToDoInode.destination.absoluteFilePath(),currentActionToDoInode.destination.absoluteFilePath(),currentActionToDoInode.type);
- currentActionToDoInode.isRunning=true;
- numberOfInodeOperation++;
- if(numberOfInodeOperation>=inodeThreads)
- return;
- break;
- #endif
- case ActionType_MovePath:
- //then empty (no file), can try remove it
- if(currentActionToDoInode.size==0 || actionToDoListTransfer.empty())//don't put afterTheTransfer because actionToDoListInode_afterTheTransfer -> already afterTheTransfer
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("launch rmpath: %1").arg(currentActionToDoInode.source.absoluteFilePath()).toStdString());
- mkPathQueue.addPath(currentActionToDoInode.source.absoluteFilePath(),currentActionToDoInode.destination.absoluteFilePath(),currentActionToDoInode.type);
- currentActionToDoInode.isRunning=true;
- numberOfInodeOperation++;
- if(numberOfInodeOperation>=inodeThreads)
- return;
- }
- else //have do the destination, put the remove to after
- {
- currentActionToDoInode.size=0;
- actionToDoListInode_afterTheTransfer.push_back(currentActionToDoInode);
- actionToDoListInode.erase(actionToDoListInode.cbegin()+int_for_internal_loop);
- int_for_internal_loop--;
- actionToDoListInode_count--;
- if(numberOfInodeOperation>=inodeThreads)
- return;
- }
- break;
- default:
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Wrong type at inode action");
- return;
-}
-
-#endif
diff --git a/plugins/CopyEngine/Ultracopier/MkPath.cpp b/plugins/CopyEngine/Ultracopier/MkPath.cpp
deleted file mode 100644
index e4ac9cf..0000000
--- a/plugins/CopyEngine/Ultracopier/MkPath.cpp
+++ /dev/null
@@ -1,517 +0,0 @@
-#include "MkPath.h"
-
-#ifdef Q_OS_WIN32
- #ifndef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- #ifndef NOMINMAX
- #define NOMINMAX
- #endif
- #include <windows.h>
- #endif
-#endif
-
-std::string MkPath::text_slash="/";
-
-MkPath::MkPath()
-{
- stopIt=false;
- waitAction=false;
- doRightTransfer=false;
- maxTime=QDateTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
- setObjectName("MkPath");
- moveToThread(this);
- start();
- #ifdef Q_OS_WIN32
- #ifndef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- regRead=std::regex("^[a-zA-Z]:");
- #endif
- #endif
-}
-
-MkPath::~MkPath()
-{
- stopIt=true;
- quit();
- wait();
-}
-
-void MkPath::addPath(const QFileInfo& source, const QFileInfo& destination, const ActionType &actionType)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
- if(stopIt)
- return;
- emit internalStartAddPath(source,destination,actionType);
-}
-
-void MkPath::skip()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- emit internalStartSkip();
-}
-
-void MkPath::retry()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- emit internalStartRetry();
-}
-
-void MkPath::run()
-{
- connect(this,&MkPath::internalStartAddPath, this,&MkPath::internalAddPath,Qt::QueuedConnection);
- connect(this,&MkPath::internalStartDoThisPath, this,&MkPath::internalDoThisPath,Qt::QueuedConnection);
- connect(this,&MkPath::internalStartSkip, this,&MkPath::internalSkip,Qt::QueuedConnection);
- connect(this,&MkPath::internalStartRetry, this,&MkPath::internalRetry,Qt::QueuedConnection);
- exec();
-}
-
-void MkPath::internalDoThisPath()
-{
- if(waitAction || pathList.isEmpty())
- return;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2, move: %3").arg(pathList.first().source.absoluteFilePath()).arg(pathList.first().destination.absoluteFilePath()).arg(pathList.first().actionType).toStdString());
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- if(pathList.first().actionType==ActionType_RmSync)
- {
- if(pathList.first().destination.isFile())
- {
- QFile removedFile(pathList.first().destination.absoluteFilePath());
- if(!removedFile.remove())
- {
- if(stopIt)
- return;
- waitAction=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to remove the inode: "+pathList.first().destination.absoluteFilePath().toStdString()+", error: "+removedFile.errorString().toStdString());
- emit errorOnFolder(pathList.first().destination,removedFile.errorString().toStdString());
- return;
- }
- }
- else if(!rmpath(pathList.first().destination.absoluteFilePath()))
- {
- if(stopIt)
- return;
- waitAction=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to remove the inode: "+pathList.first().destination.absoluteFilePath().toStdString());
- emit errorOnFolder(pathList.first().destination,tr("Unable to remove").toStdString());
- return;
- }
- pathList.removeFirst();
- emit firstFolderFinish();
- checkIfCanDoTheNext();
- return;
- }
- #endif
- doTheDateTransfer=false;
- if(keepDate)
- {
- if(!pathList.first().source.exists())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"the sources not exists: "+pathList.first().source.absoluteFilePath().toStdString());
- doTheDateTransfer=false;
- }
- else if(maxTime>=pathList.first().source.lastModified())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"the sources is older to copy the time: "+pathList.first().source.absoluteFilePath().toStdString()+": "+maxTime.toString("dd.MM.yyyy hh:mm:ss.zzz").toStdString()+">="+pathList.first().source.lastModified().toString("dd.MM.yyyy hh:mm:ss.zzz").toStdString());
- doTheDateTransfer=false;
- }
- else
- {
- doTheDateTransfer=readFileDateTime(pathList.first().source);
- /*if(!doTheDateTransfer)
- {
- if(stopIt)
- return;
- waitAction=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to get source folder time: "+pathList.first().source.absoluteFilePath());
- emit errorOnFolder(pathList.first().source,tr("Unable to get time"));
- return;
- }*/
- }
- }
- if(dir.exists(pathList.first().destination.absoluteFilePath()) && pathList.first().actionType==ActionType_RealMove)
- pathList.first().actionType=ActionType_MovePath;
- if(pathList.first().actionType!=ActionType_RealMove)
- {
- if(!dir.exists(pathList.first().destination.absoluteFilePath()))
- if(!dir.mkpath(pathList.first().destination.absoluteFilePath()))
- {
- if(!dir.exists(pathList.first().destination.absoluteFilePath()))
- {
- if(stopIt)
- return;
- waitAction=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: "+pathList.first().destination.absoluteFilePath().toStdString());
- emit errorOnFolder(pathList.first().destination,tr("Unable to create the folder").toStdString());
- return;
- }
- }
- }
- else
- {
- if(!pathList.first().source.exists())
- {
- if(stopIt)
- return;
- waitAction=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The source folder don't exists: "+pathList.first().source.absoluteFilePath().toStdString());
- emit errorOnFolder(pathList.first().destination,tr("The source folder don't exists").toStdString());
- return;
- }
- if(!pathList.first().source.isDir())//it's really an error?
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"The source is not a folder: "+pathList.first().source.absoluteFilePath().toStdString());
- /*if(stopIt)
- return;
- waitAction=true;
- emit errorOnFolder(pathList.first().destination,tr("The source is not a folder"));
- return;*/
- }
- if(pathList.first().destination.absoluteFilePath().startsWith(pathList.first().source.absoluteFilePath()+QString::fromStdString(text_slash)))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"move into it self: "+pathList.first().destination.absoluteFilePath().toStdString());
- int random=rand();
- QFileInfo tempFolder=pathList.first().source.absolutePath()+QString::fromStdString(text_slash)+QString::number(random);
- while(tempFolder.exists())
- {
- random=rand();
- tempFolder=pathList.first().source.absolutePath()+QString::fromStdString(text_slash)+QString::number(random);
- }
- if(!dir.rename(pathList.first().source.absoluteFilePath(),tempFolder.absoluteFilePath()))
- {
- if(stopIt)
- return;
- waitAction=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to temporary rename the folder: "+pathList.first().destination.absoluteFilePath().toStdString());
- emit errorOnFolder(pathList.first().destination,tr("Unable to temporary rename the folder").toStdString());
- return;
- }
- /* http://doc.qt.io/qt-5/qdir.html#rename
- * On most file systems, rename() fails only if oldName does not exist, or if a file with the new name already exists.
- if(!dir.mkpath(pathList.first().destination.absolutePath()))
- {
- if(!dir.exists(pathList.first().destination.absolutePath()))
- {
- if(stopIt)
- return;
- waitAction=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: "+pathList.first().destination.absoluteFilePath());
- emit errorOnFolder(pathList.first().destination,tr("Unable to create the folder"));
- return;
- }
- }*/
- if(!dir.rename(tempFolder.absoluteFilePath(),pathList.first().destination.absoluteFilePath()))
- {
- if(stopIt)
- return;
- waitAction=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to do the final real move the folder: "+pathList.first().destination.absoluteFilePath().toStdString());
- emit errorOnFolder(pathList.first().destination,tr("Unable to do the final real move the folder").toStdString());
- return;
- }
- }
- else
- {
- /* http://doc.qt.io/qt-5/qdir.html#rename
- * On most file systems, rename() fails only if oldName does not exist, or if a file with the new name already exists.
- if(!dir.mkpath(pathList.first().destination.absolutePath()))
- {
- if(!dir.exists(pathList.first().destination.absolutePath()))
- {
- if(stopIt)
- return;
- waitAction=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: "+pathList.first().destination.absoluteFilePath());
- emit errorOnFolder(pathList.first().destination,tr("Unable to create the folder"));
- return;
- }
- }*/
- if(!dir.rename(pathList.first().source.absoluteFilePath(),pathList.first().destination.absoluteFilePath()))
- {
- if(stopIt)
- return;
- waitAction=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to make the folder: from: "+pathList.first().source.absoluteFilePath().toStdString()+", soruce exists: "+std::to_string(QDir(pathList.first().source.absoluteFilePath()).exists())+", to: "+pathList.first().destination.absoluteFilePath().toStdString()
- +", destination exist: "+std::to_string(QDir(pathList.first().destination.absoluteFilePath()).exists()));
- emit errorOnFolder(pathList.first().destination,tr("Unable to move the folder").toStdString());
- return;
- }
- }
- }
- if(doTheDateTransfer)
- if(!writeFileDateTime(pathList.first().destination))
- {
- if(!pathList.first().destination.exists())
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to set destination folder time (not exists): "+pathList.first().destination.absoluteFilePath().toStdString());
- else if(!pathList.first().destination.isDir())
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to set destination folder time (not a dir): "+pathList.first().destination.absoluteFilePath().toStdString());
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to set destination folder time: "+pathList.first().destination.absoluteFilePath().toStdString());
- /*if(stopIt)
- return;
- waitAction=true;
-
- emit errorOnFolder(pathList.first().source,tr("Unable to set time"));
- return;*/
- }
- if(doRightTransfer && pathList.first().actionType!=ActionType_RealMove)
- {
- QFile source(pathList.first().source.absoluteFilePath());
- QFile destination(pathList.first().destination.absoluteFilePath());
- if(!destination.setPermissions(source.permissions()))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to set the right: "+pathList.first().destination.absoluteFilePath().toStdString());
- /*if(stopIt)
- return;
- waitAction=true;
- emit errorOnFolder(pathList.first().source,tr("Unable to set the access-right"));
- return;*/
- }
- }
- if(pathList.first().actionType==ActionType_MovePath)
- {
- if(!rmpath(pathList.first().source.absoluteFilePath()))
- {
- if(stopIt)
- return;
- waitAction=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"Unable to remove the source folder: "+pathList.first().destination.absoluteFilePath().toStdString());
- emit errorOnFolder(pathList.first().source,tr("Unable to remove").toStdString());
- return;
- }
- }
- pathList.removeFirst();
- emit firstFolderFinish();
- checkIfCanDoTheNext();
-}
-
-void MkPath::internalAddPath(const QFileInfo& source, const QFileInfo& destination, const ActionType &actionType)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,QStringLiteral("source: %1, destination: %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
- Item tempPath;
- tempPath.source=source;
- tempPath.destination=destination;
- tempPath.actionType=actionType;
- pathList << tempPath;
- if(!waitAction)
- checkIfCanDoTheNext();
-}
-
-void MkPath::checkIfCanDoTheNext()
-{
- if(!waitAction && !stopIt && pathList.size()>0)
- emit internalStartDoThisPath();
-}
-
-void MkPath::internalSkip()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- waitAction=false;
- pathList.removeFirst();
- emit firstFolderFinish();
- checkIfCanDoTheNext();
-}
-
-void MkPath::internalRetry()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- waitAction=false;
- checkIfCanDoTheNext();
-}
-
-void MkPath::setRightTransfer(const bool doRightTransfer)
-{
- this->doRightTransfer=doRightTransfer;
-}
-
-void MkPath::setKeepDate(const bool keepDate)
-{
- this->keepDate=keepDate;
-}
-
-bool MkPath::rmpath(const QDir &dir
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- ,const bool &toSync
- #endif
- )
-{
- 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())
- {
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- if(toSync)
- {
- QFile file(fileInfo.absoluteFilePath());
- if(!file.remove())
- {
- if(toSync)
- {
- QFile file(fileInfo.absoluteFilePath());
- if(!file.remove())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to remove a file: "+fileInfo.absoluteFilePath().toStdString()+", due to: "+file.errorString().toStdString());
- allHaveWork=false;
- }
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"found a file: "+fileInfo.fileName().toStdString());
- allHaveWork=false;
- }
- }
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"found a file: "+fileInfo.fileName().toStdString());
- allHaveWork=false;
- }
- #else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"found a file: "+fileInfo.fileName().toStdString());
- allHaveWork=false;
- #endif
- }
- else
- {
- //return the fonction for scan the new folder
- if(!rmpath(dir.absolutePath()+'/'+fileInfo.fileName()+'/'))
- allHaveWork=false;
- }
- }
- if(!allHaveWork)
- return false;
- allHaveWork=dir.rmdir(dir.absolutePath());
- if(!allHaveWork)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to remove the folder: "+dir.absolutePath().toStdString());
- return allHaveWork;
-}
-
-//fonction to edit the file date time
-bool MkPath::readFileDateTime(const QFileInfo &source)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"readFileDateTime("+source.absoluteFilePath().toStdString()+")");
- /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
- #ifdef Q_OS_UNIX
- #ifdef Q_OS_LINUX
- struct stat info;
- if(stat(source.absoluteFilePath().toLatin1().data(),&info)!=0)
- return false;
- time_t ctime=info.st_ctim.tv_sec;
- time_t actime=info.st_atim.tv_sec;
- time_t modtime=info.st_mtim.tv_sec;
- //this function avalaible on unix and mingw
- butime.actime=actime;
- butime.modtime=modtime;
- Q_UNUSED(ctime);
- return true;
- #else //mainly for mac
- QFileInfo fileInfo(source);
- time_t ctime=fileInfo.created().toTime_t();
- time_t actime=fileInfo.lastRead().toTime_t();
- time_t modtime=fileInfo.lastModified().toTime_t();
- //this function avalaible on unix and mingw
- utimbuf butime;
- butime.actime=actime;
- butime.modtime=modtime;
- Q_UNUSED(ctime);
- return true;
- #endif
- #else
- #ifdef Q_OS_WIN32
- #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- struct stat info;
- if(stat(source.toLatin1().data(),&info)!=0)
- return false;
- time_t ctime=info.st_ctim.tv_sec;
- time_t actime=info.st_atim.tv_sec;
- time_t modtime=info.st_mtim.tv_sec;
- //this function avalaible on unix and mingw
- butime.actime=actime;
- butime.modtime=modtime;
- Q_UNUSED(ctime);
- return true;
- #else
- wchar_t filePath[65535];
- if(std::regex_match(source.absoluteFilePath().toStdString(),regRead))
- filePath[QDir::toNativeSeparators(QStringLiteral("\\\\?\\")+source.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
- else
- filePath[QDir::toNativeSeparators(source.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
- HANDLE hFileSouce = CreateFileW(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY | FILE_FLAG_BACKUP_SEMANTICS, NULL);
- if(hFileSouce == INVALID_HANDLE_VALUE)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"open failed to read: "+QString::fromWCharArray(filePath).toStdString()+", error: "+std::to_string(GetLastError()));
- return false;
- }
- FILETIME ftCreate, ftAccess, ftWrite;
- if(!GetFileTime(hFileSouce, &ftCreate, &ftAccess, &ftWrite))
- {
- CloseHandle(hFileSouce);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to get the file time");
- return false;
- }
- this->ftCreateL=ftCreate.dwLowDateTime;
- this->ftCreateH=ftCreate.dwHighDateTime;
- this->ftAccessL=ftAccess.dwLowDateTime;
- this->ftAccessH=ftAccess.dwHighDateTime;
- this->ftWriteL=ftWrite.dwLowDateTime;
- this->ftWriteH=ftWrite.dwHighDateTime;
- CloseHandle(hFileSouce);
- return true;
- #endif
- #else
- return false;
- #endif
- #endif
- return false;
-}
-
-bool MkPath::writeFileDateTime(const QFileInfo &destination)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"writeFileDateTime("+destination.absoluteFilePath().toStdString()+")");
- /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
- #ifdef Q_OS_UNIX
- #ifdef Q_OS_LINUX
- return utime(destination.absoluteFilePath().toLatin1().data(),&butime)==0;
- #else //mainly for mac
- return utime(destination.absoluteFilePath().toLatin1().data(),&butime)==0;
- #endif
- #else
- #ifdef Q_OS_WIN32
- #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- return utime(destination.toLatin1().data(),&butime)==0;
- #else
- wchar_t filePath[65535];
- if(std::regex_match(destination.absoluteFilePath().toStdString(),regRead))
- filePath[QDir::toNativeSeparators(QStringLiteral("\\\\?\\")+destination.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
- else
- filePath[QDir::toNativeSeparators(destination.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
- HANDLE hFileDestination = CreateFileW(filePath, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
- if(hFileDestination == INVALID_HANDLE_VALUE)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"open failed to write: "+QString::fromWCharArray(filePath).toStdString()+", error: "+std::to_string(GetLastError()));
- return false;
- }
- FILETIME ftCreate, ftAccess, ftWrite;
- ftCreate.dwLowDateTime=this->ftCreateL;
- ftCreate.dwHighDateTime=this->ftCreateH;
- ftAccess.dwLowDateTime=this->ftAccessL;
- ftAccess.dwHighDateTime=this->ftAccessH;
- ftWrite.dwLowDateTime=this->ftWriteL;
- ftWrite.dwHighDateTime=this->ftWriteH;
- if(!SetFileTime(hFileDestination, &ftCreate, &ftAccess, &ftWrite))
- {
- CloseHandle(hFileDestination);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"unable to set the file time");
- return false;
- }
- CloseHandle(hFileDestination);
- return true;
- #endif
- #else
- return false;
- #endif
- #endif
- return false;
-}
diff --git a/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.cpp b/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.cpp
deleted file mode 100644
index 9dd48f3..0000000
--- a/plugins/CopyEngine/Ultracopier/ScanFileOrFolder.cpp
+++ /dev/null
@@ -1,680 +0,0 @@
-#include "ScanFileOrFolder.h"
-#include "TransferThread.h"
-#include <QtGlobal>
-#include <QDateTime>
-#include <regex>
-#include "../../../cpp11addition.h"
-
-#ifdef Q_OS_WIN32
- #ifndef NOMINMAX
- #define NOMINMAX
- #endif
- #include <windows.h>
-#endif
-
-std::string ScanFileOrFolder::text_slash="/";
-std::string ScanFileOrFolder::text_antislash="\\";
-std::string ScanFileOrFolder::text_dot=".";
-
-ScanFileOrFolder::ScanFileOrFolder(const Ultracopier::CopyMode &mode)
-{
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- rsync = false;
- #endif
- moveTheWholeFolder = true;
- stopped = true;
- stopIt = false;
- this->mode = mode;
- folder_isolation = std::regex("^(.*/)?([^/]+)/$");
- setObjectName(QStringLiteral("ScanFileOrFolder"));
- #ifdef Q_OS_WIN32
- QString userName;
- DWORD size=255;
- WCHAR * userNameW=new WCHAR[size];
- if(GetUserNameW(userNameW,&size))
- {
- userName=QString::fromWCharArray(userNameW,size-1);
- blackList.push_back(QFileInfo(QStringLiteral("C:/Users/%1/AppData/Roaming/").arg(userName)).absoluteFilePath().toStdString());
- }
- delete userNameW;
- #endif
-}
-
-ScanFileOrFolder::~ScanFileOrFolder()
-{
- stop();
- quit();
- wait();
-}
-
-bool ScanFileOrFolder::isFinished() const
-{
- return stopped;
-}
-
-void ScanFileOrFolder::addToList(const std::vector<std::string>& sources,const std::string& destination)
-{
- stopIt=false;
- this->sources=parseWildcardSources(sources);
- this->destination=destination;
- QFileInfo destinationInfo(QString::fromStdString(this->destination));
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"check symblink: "+destinationInfo.absoluteFilePath().toStdString());
- while(destinationInfo.isSymLink())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"resolv destination to: "+destinationInfo.symLinkTarget().toStdString());
- if(QFileInfo(destinationInfo.symLinkTarget()).isAbsolute())
- this->destination=destinationInfo.symLinkTarget().toStdString();
- else
- this->destination=destinationInfo.absolutePath().toStdString()+text_slash+destinationInfo.symLinkTarget().toStdString();
- destinationInfo.setFile(QString::fromStdString(this->destination));
- }
- if(sources.size()>1 || QFileInfo(QString::fromStdString(destination)).isDir())
- /* Disabled because the separator transformation product bug
- * if(!destination.endsWith(QDir::separator()))
- this->destination+=QDir::separator();*/
- if(!stringEndsWith(destination,'/') && !stringEndsWith(destination,'\\'))
- this->destination+=text_slash;//put unix separator because it's transformed into that's under windows too
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"addToList("+stringimplode(sources,";")+","+this->destination+")");
-}
-
-
-std::vector<std::string> ScanFileOrFolder::parseWildcardSources(const std::vector<std::string> &sources) const
-{
- std::regex splitFolder("[/\\\\]");
- std::vector<std::string> returnList;
- unsigned int index=0;
- while(index<(unsigned int)sources.size())
- {
- if(sources.at(index).find("*") != std::string::npos)
- {
- std::vector<std::string> toParse=stringregexsplit(sources.at(index),splitFolder);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"before wildcard parse: "+sources.at(index)+", toParse: "+stringimplode(toParse,", "));
- std::vector<std::vector<std::string> > recomposedSource;
- {
- std::vector<std::string> t;
- t.push_back("");
- recomposedSource.push_back(t);
- }
- while(toParse.size()>0)
- {
- if(toParse.front().find("*") != std::string::npos)
- {
- std::string toParseFirst=toParse.front();
- if(toParseFirst.empty())
- toParseFirst=text_slash;
- std::vector<std::vector<std::string> > newRecomposedSource;
- stringreplaceAll(toParseFirst,"*","[^/\\\\]*");
- std::regex toResolv=std::regex(toParseFirst);
- unsigned int index_recomposedSource=0;
- while(index_recomposedSource<recomposedSource.size())//parse each url part
- {
- QFileInfo info(QString::fromStdString(stringimplode(recomposedSource.at(index_recomposedSource),text_slash)));
- if(info.isDir() && !info.isSymLink())
- {
- QDir folder(info.absoluteFilePath());
- QFileInfoList fileFile=folder.entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System);//QStringList() << toResolv
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"list the folder: "+info.absoluteFilePath().toStdString()+", with the wildcard: "+toParseFirst);
- int index_fileList=0;
- while(index_fileList<fileFile.size())
- {
- const std::string &fileName=fileFile.at(index_fileList).fileName().toStdString();
- if(std::regex_match(fileName,toResolv))
- {
- std::vector<std::string> tempList=recomposedSource.at(index_recomposedSource);
- tempList.push_back(fileName);
- newRecomposedSource.push_back(tempList);
- }
- index_fileList++;
- }
- }
- index_recomposedSource++;
- }
- recomposedSource=newRecomposedSource;
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"add toParse: "+stringimplode(toParse,text_slash));
- unsigned int index_recomposedSource=0;
- while(index_recomposedSource<recomposedSource.size())
- {
- recomposedSource[index_recomposedSource].push_back(toParse.front());
- if(!QFileInfo(QString::fromStdString(stringimplode(recomposedSource.at(index_recomposedSource),text_slash))).exists())
- recomposedSource.erase(recomposedSource.cbegin()+index_recomposedSource);
- else
- index_recomposedSource++;
- }
- }
- toParse.erase(toParse.cbegin());
- }
- unsigned int index_recomposedSource=0;
- while(index_recomposedSource<recomposedSource.size())
- {
- returnList.push_back(stringimplode(recomposedSource.at(index_recomposedSource),text_slash));
- index_recomposedSource++;
- }
- }
- else
- returnList.push_back(sources.at(index));
- index++;
- }
- return returnList;
-}
-
-void ScanFileOrFolder::setFilters(const std::vector<Filters_rules> &include, const std::vector<Filters_rules> &exclude)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start");
- QMutexLocker lock(&filtersMutex);
- this->include_send=include;
- this->exclude_send=exclude;
- reloadTheNewFilters=true;
- haveFilters=include_send.size()>0 || exclude_send.size()>0;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"haveFilters: "+std::to_string(haveFilters)+", include_send.size(): "+std::to_string(include_send.size())+", exclude_send.size(): "+std::to_string(exclude_send.size()));
-}
-
-//set action if Folder are same or exists
-void ScanFileOrFolder::setFolderExistsAction(const FolderExistsAction &action, const std::string &newName)
-{
- this->newName=newName;
- folderExistsAction=action;
- waitOneAction.release();
-}
-
-//set action if error
-void ScanFileOrFolder::setFolderErrorAction(const FileErrorAction &action)
-{
- fileErrorAction=action;
- waitOneAction.release();
-}
-
-void ScanFileOrFolder::stop()
-{
- stopIt=true;
- waitOneAction.release();
-}
-
-void ScanFileOrFolder::run()
-{
- stopped=false;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"start the listing with destination: "+destination+", mode: "+std::to_string(mode));
- destination=resolvDestination(QString::fromStdString(destination)).absoluteFilePath().toStdString();
- if(stopIt)
- {
- stopped=true;
- return;
- }
- if(fileErrorAction==FileError_Skip)
- {
- stopped=true;
- return;
- }
- unsigned int sourceIndex=0;
- while(sourceIndex<sources.size())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"size source to list: "+std::to_string(sourceIndex)+text_slash+std::to_string(sources.size()));
- if(stopIt)
- {
- stopped=true;
- return;
- }
- QFileInfo source=QString::fromStdString(sources.at(sourceIndex));
- if(source.isDir() && !source.isSymLink())
- {
- /* Bad way; when you copy c:\source\folder into d:\destination, you wait it create the folder d:\destination\folder
- //listFolder(source.absoluteFilePath()+QDir::separator(),destination);
- listFolder(source.absoluteFilePath()+text_slash,destination);//put unix separator because it's transformed into that's under windows too
- */
- //put unix separator because it's transformed into that's under windows too
- std::string tempString=QFileInfo(QString::fromStdString(destination)).absoluteFilePath().toStdString();
- if(!stringEndsWith(tempString,text_slash) && !stringEndsWith(tempString,text_antislash))
- tempString+=text_slash;
- tempString+=TransferThread::resolvedName(source);
- if(moveTheWholeFolder && mode==Ultracopier::Move && !QFileInfo(QString::fromStdString(tempString)).exists() &&
- driveManagement.isSameDrive(source.absoluteFilePath().toStdString(),tempString))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"tempString: move and not exists: "+tempString);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"do real move: "+source.absoluteFilePath().toStdString()+" to "+tempString);
- emit addToRealMove(source.absoluteFilePath(),QString::fromStdString(tempString));
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"tempString: "+tempString+" normal listing, blacklist size: "+std::to_string(blackList.size()));
- listFolder(source.absoluteFilePath(),QString::fromStdString(tempString));
- }
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+source.absoluteFilePath().toStdString()+" is file or symblink");
- emit fileTransfer(source,QString::fromStdString(destination+text_slash)+source.fileName(),mode);
- }
- sourceIndex++;
- }
- stopped=true;
- if(stopIt)
- return;
- emit finishedTheListing();
-}
-
-QFileInfo ScanFileOrFolder::resolvDestination(const QFileInfo &destination)
-{
- QFileInfo newDestination=destination;
- while(newDestination.isSymLink())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"resolv destination to: "+newDestination.symLinkTarget().toStdString());
- if(QFileInfo(newDestination.symLinkTarget()).isAbsolute())
- newDestination.setFile(newDestination.symLinkTarget());
- else
- newDestination.setFile(newDestination.absolutePath()+QString::fromStdString(text_slash)+newDestination.symLinkTarget());
- }
- do
- {
- fileErrorAction=FileError_NotSet;
- if(isBlackListed(destination))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"isBlackListed: "+destination.absoluteFilePath().toStdString());
- emit errorOnFolder(destination,tr("Blacklisted folder").toStdString(),ErrorType_Folder);
- waitOneAction.acquire();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionNum: "+std::to_string(fileErrorAction));
- }
- } while(fileErrorAction==FileError_Retry || fileErrorAction==FileError_PutToEndOfTheList);
- return newDestination;
-}
-
-bool ScanFileOrFolder::isBlackListed(const QFileInfo &destination)
-{
- int index=0;
- int size=blackList.size();
- while(index<size)
- {
- if(stringStartWith(destination.absoluteFilePath().toStdString(),blackList.at(index)))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,destination.absoluteFilePath().toStdString()+" start with: "+blackList.at(index));
- return true;
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,destination.absoluteFilePath().toStdString()+" not start with: "+blackList.at(index));
- index++;
- }
- return false;
-}
-
-void ScanFileOrFolder::listFolder(QFileInfo source,QFileInfo destination)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+source.absoluteFilePath().toStdString()+
- " ("+std::to_string(source.isSymLink())+"), destination: "+destination.absoluteFilePath().toStdString()+
- " ("+std::to_string(destination.isSymLink())+")");
- if(stopIt)
- return;
- destination=resolvDestination(destination);
- if(stopIt)
- return;
- if(fileErrorAction==FileError_Skip)
- return;
- //if is same
- if(source.absoluteFilePath()==destination.absoluteFilePath())
- {
- emit folderAlreadyExists(source,destination,true);
- waitOneAction.acquire();
- std::string destinationSuffixPath;
- switch(folderExistsAction)
- {
- case FolderExists_Merge:
- break;
- case FolderExists_Skip:
- return;
- break;
- case FolderExists_Rename:
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination before rename: "+destination.absoluteFilePath().toStdString());
- if(newName.empty())
- {
- //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"pattern: "+folder_isolation.str());
- //resolv the new name
- destinationSuffixPath=destination.baseName().toStdString();
- int num=1;
- do
- {
- if(num==1)
- {
- if(firstRenamingRule.empty())
- destinationSuffixPath=tr("%1 - copy").arg(destination.baseName()).toStdString();
- else
- destinationSuffixPath=firstRenamingRule;
- }
- else
- {
- if(otherRenamingRule.empty())
- destinationSuffixPath=tr("%1 - copy (%2)").arg(destination.baseName()).arg(num).toStdString();
- else
- {
- destinationSuffixPath=otherRenamingRule;
- stringreplaceAll(destinationSuffixPath,"%number%",std::to_string(num));
- }
- }
- stringreplaceAll(destinationSuffixPath,"%name%",destination.baseName().toStdString());
- num++;
- if(destination.completeSuffix().isEmpty())
- destination.setFile(destination.absolutePath()+QString::fromStdString(text_slash)+QString::fromStdString(destinationSuffixPath));
- else
- destination.setFile(destination.absolutePath()+QString::fromStdString(text_slash)+QString::fromStdString(destinationSuffixPath)+QString::fromStdString(text_dot)+destination.completeSuffix());
- }
- while(destination.exists());
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"use new name: "+newName);
- destinationSuffixPath = newName;
- }
- destination.setFile(destination.absolutePath()+QString::fromStdString(text_slash+destinationSuffixPath));
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination after rename: "+destination.absoluteFilePath().toStdString());
- break;
- default:
- return;
- break;
- }
- }
- //check if destination exists
- if(checkDestinationExists)
- {
- if(destination.exists())
- {
- emit folderAlreadyExists(source,destination,false);
- waitOneAction.acquire();
- std::string destinationSuffixPath;
- switch(folderExistsAction)
- {
- case FolderExists_Merge:
- break;
- case FolderExists_Skip:
- return;
- break;
- case FolderExists_Rename:
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination before rename: "+destination.absoluteFilePath().toStdString());
- if(newName.empty())
- {
- //resolv the new name
- QFileInfo destinationInfo;
- int num=1;
- do
- {
- if(num==1)
- {
- if(firstRenamingRule.empty())
- destinationSuffixPath=tr("%name% - copy").toStdString();
- else
- destinationSuffixPath=firstRenamingRule;
- }
- else
- {
- if(otherRenamingRule.empty())
- destinationSuffixPath=tr("%name% - copy (%number%)").toStdString();
- else
- destinationSuffixPath=otherRenamingRule;
- stringreplaceAll(destinationSuffixPath,"%number%",std::to_string(num));
- }
- stringreplaceAll(destinationSuffixPath,"%name%",destination.baseName().toStdString());
- destinationInfo.setFile(destinationInfo.absolutePath()+QString::fromStdString(text_slash)+QString::fromStdString(destinationSuffixPath));
- num++;
- }
- while(destinationInfo.exists());
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"use new name: "+newName);
- destinationSuffixPath = newName;
- }
- if(destination.completeSuffix().isEmpty())
- destination.setFile(destination.absolutePath()+QString::fromStdString(text_slash)+QString::fromStdString(destinationSuffixPath));
- else
- destination.setFile(destination.absolutePath()+QString::fromStdString(text_slash)+QString::fromStdString(destinationSuffixPath)+QStringLiteral(".")+destination.completeSuffix());
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"destination after rename: "+destination.absoluteFilePath().toStdString());
- break;
- default:
- return;
- break;
- }
- }
- }
- //do source check
- //check of source is readable
- do
- {
- fileErrorAction=FileError_NotSet;
- if(!source.isReadable() || !source.isExecutable() || !source.exists() || !source.isDir())
- {
- if(!source.isDir())
- emit errorOnFolder(source,tr("This is not a folder").toStdString());
- else if(!source.exists())
- emit errorOnFolder(source,tr("The folder does exists").toStdString());
- else
- emit errorOnFolder(source,tr("The folder is not readable").toStdString());
- waitOneAction.acquire();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionNum: "+std::to_string(fileErrorAction));
- }
- } while(fileErrorAction==FileError_Retry);
- do
- {
- QDir tempDir(source.absoluteFilePath());
- fileErrorAction=FileError_NotSet;
- if(!tempDir.isReadable() || !tempDir.exists())
- {
- emit errorOnFolder(source,tr("Problem with name encoding").toStdString());
- waitOneAction.acquire();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"actionNum: "+std::to_string(fileErrorAction));
- }
- } while(fileErrorAction==FileError_Retry);
- if(stopIt)
- return;
- /// \todo check here if the folder is not readable or not exists
- QFileInfoList entryList;
- if(copyListOrder)
- entryList=QDir(source.absoluteFilePath()).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System,QDir::DirsFirst|QDir::Name|QDir::IgnoreCase);//possible wait time here
- else
- entryList=QDir(source.absoluteFilePath()).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System);//possible wait time here
- if(stopIt)
- return;
- int sizeEntryList=entryList.size();
- emit newFolderListing(source.absoluteFilePath().toStdString());
- if(mode!=Ultracopier::Move)
- emit addToMkPath(source,destination,sizeEntryList);
- for (int index=0;index<sizeEntryList;++index)
- {
- QFileInfo fileInfo=entryList.at(index);
- if(stopIt)
- return;
- if(haveFilters)
- {
- if(reloadTheNewFilters)
- {
- QMutexLocker lock(&filtersMutex);
- QCoreApplication::processEvents(QEventLoop::AllEvents);
- reloadTheNewFilters=false;
- this->include=this->include_send;
- this->exclude=this->exclude_send;
- }
- std::string fileName=fileInfo.fileName().toStdString();
- if(fileInfo.isDir() && !fileInfo.isSymLink())
- {
- bool excluded=false,included=(include.size()==0);
- unsigned int filters_index=0;
- while(filters_index<exclude.size())
- {
- if(exclude.at(filters_index).apply_on==ApplyOn_folder || exclude.at(filters_index).apply_on==ApplyOn_fileAndFolder)
- {
- if(std::regex_match(fileName,exclude.at(filters_index).regex))
- {
- excluded=true;
- break;
- }
- }
- filters_index++;
- }
- if(excluded)
- {}
- else
- {
- filters_index=0;
- while(filters_index<include.size())
- {
- if(include.at(filters_index).apply_on==ApplyOn_folder || include.at(filters_index).apply_on==ApplyOn_fileAndFolder)
- {
- if(std::regex_match(fileName,include.at(filters_index).regex))
- {
- included=true;
- break;
- }
- }
- filters_index++;
- }
- if(!included)
- {}
- else
- listFolder(fileInfo,destination.absoluteFilePath()+QString::fromStdString(text_slash)+fileInfo.fileName());
- }
- }
- else
- {
- bool excluded=false,included=(include.size()==0);
- unsigned int filters_index=0;
- while(filters_index<exclude.size())
- {
- if(exclude.at(filters_index).apply_on==ApplyOn_file || exclude.at(filters_index).apply_on==ApplyOn_fileAndFolder)
- {
- if(std::regex_match(fileName,exclude.at(filters_index).regex))
- {
- excluded=true;
- break;
- }
- }
- filters_index++;
- }
- if(excluded)
- {}
- else
- {
- filters_index=0;
- while(filters_index<include.size())
- {
- if(include.at(filters_index).apply_on==ApplyOn_file || include.at(filters_index).apply_on==ApplyOn_fileAndFolder)
- {
- if(std::regex_match(fileName,include.at(filters_index).regex))
- {
- included=true;
- break;
- }
- }
- filters_index++;
- }
- if(!included)
- {}
- else
- #ifndef ULTRACOPIER_PLUGIN_RSYNC
- emit fileTransfer(fileInfo,destination.absoluteFilePath()+QString::fromStdString(text_slash)+fileInfo.fileName(),mode);
- #else
- {
- bool sendToTransfer=false;
- if(!rsync)
- sendToTransfer=true;
- else if(!QFile::exists(destination.absoluteFilePath()+"/"+fileInfo.fileName()))
- sendToTransfer=true;
- else if(fileInfo.lastModified()!=QFileInfo(destination.absoluteFilePath()+"/"+fileInfo.fileName()).lastModified())
- sendToTransfer=true;
- if(sendToTransfer)
- emit fileTransfer(fileInfo.absoluteFilePath(),destination.absoluteFilePath()+"/"+fileInfo.fileName(),mode);
- }
- #endif
- }
- }
- }
- else
- {
- if(fileInfo.isDir() && !fileInfo.isSymLink())//possible wait time here
- //listFolder(source,destination,suffixPath+fileInfo.fileName()+QDir::separator());
- listFolder(fileInfo,destination.absoluteFilePath()+QString::fromStdString(text_slash)+fileInfo.fileName());//put unix separator because it's transformed into that's under windows too
- else
- #ifndef ULTRACOPIER_PLUGIN_RSYNC
- emit fileTransfer(fileInfo,destination.absoluteFilePath()+QString::fromStdString(text_slash)+fileInfo.fileName(),mode);
- #else
- {
- bool sendToTransfer=false;
- if(!rsync)
- sendToTransfer=true;
- else if(!QFile::exists(destination.absoluteFilePath()+"/"+fileInfo.fileName()))
- sendToTransfer=true;
- else if(fileInfo.lastModified()!=QFileInfo(destination.absoluteFilePath()+"/"+fileInfo.fileName()).lastModified())
- sendToTransfer=true;
- if(sendToTransfer)
- emit fileTransfer(fileInfo.absoluteFilePath(),destination.absoluteFilePath()+"/"+fileInfo.fileName(),mode);
- }
- #endif
- }
- }
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- if(rsync)
- {
- //check the reverse path here
- QFileInfoList entryListDestination;
- if(copyListOrder)
- entryListDestination=QDir(destination.absoluteFilePath()).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System,QDir::DirsFirst|QDir::Name|QDir::IgnoreCase);//possible wait time here
- else
- entryListDestination=QDir(destination.absoluteFilePath()).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System);//possible wait time here
- int sizeEntryListDestination=entryListDestination.size();
- int index=0;
- for (int indexDestination=0;indexDestination<sizeEntryListDestination;++indexDestination)
- {
- index=0;
- while(index<sizeEntryList)
- {
- if(entryListDestination.at(indexDestination).fileName()==entryList.at(index).fileName())
- break;
- index++;
- }
- if(index==sizeEntryList)
- {
- //then not found, need be remove
- emit addToRmForRsync(entryListDestination.at(indexDestination));
- }
- }
- return;
- }
- #endif
- if(mode==Ultracopier::Move)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"source: "+source.absoluteFilePath().toStdString()+", sizeEntryList: "+std::to_string(sizeEntryList));
- emit addToMovePath(source,destination,sizeEntryList);
- }
-}
-
-//set if need check if the destination exists
-void ScanFileOrFolder::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
-{
- this->checkDestinationExists=checkDestinationFolderExists;
-}
-
-void ScanFileOrFolder::setRenamingRules(const std::string &firstRenamingRule, const std::string &otherRenamingRule)
-{
- this->firstRenamingRule=firstRenamingRule;
- this->otherRenamingRule=otherRenamingRule;
-}
-
-void ScanFileOrFolder::setMoveTheWholeFolder(const bool &moveTheWholeFolder)
-{
- this->moveTheWholeFolder=moveTheWholeFolder;
-}
-
-void ScanFileOrFolder::setCopyListOrder(const bool &order)
-{
- this->copyListOrder=order;
-}
-
-#ifdef ULTRACOPIER_PLUGIN_RSYNC
-/// \brief set rsync
-void ScanFileOrFolder::setRsync(const bool rsync)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"set rsync: "+std::to_string(rsync));
- this->rsync=rsync;
-}
-#endif
-
-void ScanFileOrFolder::set_updateMount()
-{
- driveManagement.tryUpdate();
-}
diff --git a/plugins/CopyEngine/Ultracopier/TransferThread.cpp b/plugins/CopyEngine/Ultracopier/TransferThread.cpp
deleted file mode 100644
index 210c221..0000000
--- a/plugins/CopyEngine/Ultracopier/TransferThread.cpp
+++ /dev/null
@@ -1,2101 +0,0 @@
-//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_OS_WIN32
-#include <windows.h>
-#endif
-
-#ifdef Q_OS_WIN32
- #ifndef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- #ifndef NOMINMAX
- #define NOMINMAX
- #endif
- #include <windows.h>
- #endif
-#endif
-
-#ifdef Q_OS_WIN32
-#define CURRENTSEPARATOR "\\"
-#else
-#define CURRENTSEPARATOR "/"
-#endif
-
-#include "../../../cpp11addition.h"
-
-TransferThread::TransferThread() :
- haveStartTime (false),
- transfer_stat (TransferStat_Idle),
- doRightTransfer (false),
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- rsync (false),
- #endif
- stopIt (false),
- fileExistsAction (FileExists_NotSet),
- alwaysDoFileExistsAction (FileExists_NotSet),
- needSkip (false),
- needRemove (false),
- deletePartiallyTransferredFiles (true),
- writeError (false),
- readError (false),
- renameTheOriginalDestination (false),
- havePermission (false)
-{
- start();
- moveToThread(this);
- readThread.setWriteThread(&writeThread);
- source.setCaching(false);
- destination.setCaching(false);
- renameRegex=std::regex("^(.*)(\\.[a-zA-Z0-9]+)$");
- #ifdef Q_OS_WIN32
- #ifndef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- regRead=std::regex("^[a-zA-Z]:");
- #endif
- #endif
-
- minTime=QDateTime(QDate(ULTRACOPIER_PLUGIN_MINIMALYEAR,1,1));
-}
-
-TransferThread::~TransferThread()
-{
- stopIt=true;
- readThread.exit();
- readThread.wait();
- writeThread.exit();
- writeThread.wait();
- exit();
- //else cash without this disconnect
- //disconnect(&readThread);
- //disconnect(&writeThread);
- wait();
-}
-
-void TransferThread::run()
-{
- //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+QStringLiteral("] start: ")+QString::number((qint64)QThread::currentThreadId())));
- transfer_stat = TransferStat_Idle;
- stopIt = false;
- fileExistsAction = FileExists_NotSet;
- alwaysDoFileExistsAction= FileExists_NotSet;
- //the error push
- connect(&readThread,&ReadThread::error, this, &TransferThread::getReadError, Qt::QueuedConnection);
- connect(&writeThread,&WriteThread::error, this, &TransferThread::getWriteError, Qt::QueuedConnection);
- //the thread change operation
- connect(this,&TransferThread::internalStartPreOperation, this, &TransferThread::preOperation, Qt::QueuedConnection);
- connect(this,&TransferThread::internalStartPostOperation, this, &TransferThread::postOperation, Qt::QueuedConnection);
- //the state change operation
- connect(&readThread,&ReadThread::opened, this, &TransferThread::readIsReady, Qt::QueuedConnection);
- connect(&writeThread,&WriteThread::opened, this, &TransferThread::writeIsReady, Qt::QueuedConnection);
- connect(&readThread,&ReadThread::readIsStopped, this, &TransferThread::readIsStopped, Qt::QueuedConnection);
- connect(&writeThread,&WriteThread::writeIsStopped, this, &TransferThread::writeIsStopped, Qt::QueuedConnection);
- connect(&readThread,&ReadThread::readIsStopped, &writeThread, &WriteThread::endIsDetected, Qt::QueuedConnection);
- connect(&readThread,&ReadThread::closed, this, &TransferThread::readIsClosed, Qt::QueuedConnection);
- connect(&writeThread,&WriteThread::closed, this, &TransferThread::writeIsClosed, Qt::QueuedConnection);
- connect(&writeThread,&WriteThread::reopened, this, &TransferThread::writeThreadIsReopened, Qt::QueuedConnection);
- connect(&readThread,&ReadThread::checksumFinish, this, &TransferThread::readChecksumFinish, Qt::QueuedConnection);
- connect(&writeThread,&WriteThread::checksumFinish, this, &TransferThread::writeChecksumFinish, Qt::QueuedConnection);
- //error management
- connect(&readThread,&ReadThread::isSeekToZeroAndWait, this, &TransferThread::readThreadIsSeekToZeroAndWait, Qt::QueuedConnection);
- connect(&readThread,&ReadThread::resumeAfterErrorByRestartAtTheLastPosition,this, &TransferThread::readThreadResumeAfterError, Qt::QueuedConnection);
- connect(&readThread,&ReadThread::resumeAfterErrorByRestartAll,&writeThread, &WriteThread::flushAndSeekToZero, Qt::QueuedConnection);
- connect(&writeThread,&WriteThread::flushedAndSeekedToZero, this, &TransferThread::readThreadResumeAfterError, Qt::QueuedConnection);
- connect(this,&TransferThread::internalTryStartTheTransfer, this, &TransferThread::internalStartTheTransfer, Qt::QueuedConnection);
-
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- connect(&readThread,&ReadThread::debugInformation, this, &TransferThread::debugInformation, Qt::QueuedConnection);
- connect(&writeThread,&WriteThread::debugInformation, this, &TransferThread::debugInformation, Qt::QueuedConnection);
- connect(&driveManagement,&DriveManagement::debugInformation,this, &TransferThread::debugInformation, Qt::QueuedConnection);
- #endif
-
- exec();
-}
-
-TransferStat TransferThread::getStat() const
-{
- return transfer_stat;
-}
-
-void TransferThread::startTheTransfer()
-{
- emit internalTryStartTheTransfer();
-}
-
-void TransferThread::internalStartTheTransfer()
-{
- if(transfer_stat==TransferStat_Idle)
- {
- if(mode!=Ultracopier::Move)
- {
- /// \bug can pass here because in case of direct move on same media, it return to idle stat directly
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't start transfert at idle"));
- }
- return;
- }
- if(transfer_stat==TransferStat_PostOperation)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't start transfert at PostOperation"));
- return;
- }
- if(transfer_stat==TransferStat_Transfer)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't start transfert at Transfer"));
- return;
- }
- if(canStartTransfer)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] canStartTransfer is already set to true"));
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] check how start the transfer"));
- canStartTransfer=true;
- if(readIsReadyVariable && writeIsReadyVariable)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] start directly the transfer"));
- ifCanStartTransfer();
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] start the transfer as delayed"));
-}
-
-bool TransferThread::setFiles(const QFileInfo& source, const int64_t &size, const QFileInfo& destination, const Ultracopier::CopyMode &mode)
-{
- if(transfer_stat!=TransferStat_Idle)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
- return false;
- }
- //to prevent multiple file alocation into ListThread::doNewActions_inode_manipulation()
- transfer_stat = TransferStat_PreOperation;
- //emit pushStat(stat,transferId);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start, source: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
- this->source = source;
- this->destination = destination;
- this->mode = mode;
- this->size = size;
- stopIt = false;
- fileExistsAction = FileExists_NotSet;
- canStartTransfer = false;
- sended_state_preOperationStopped= false;
- canBeMovedDirectlyVariable = false;
- canBeCopiedDirectlyVariable = false;
- fileContentError = false;
- real_doChecksum = false;
- writeError = false;
- writeError_source_seeked = false;
- writeError_destination_reopened = false;
- readError = false;
- fileContentError = false;
- resetExtraVariable();
- emit internalStartPreOperation();
- return true;
-}
-
-void TransferThread::setFileExistsAction(const FileExistsAction &action)
-{
- if(transfer_stat!=TransferStat_PreOperation)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+source.absoluteFilePath().toStdString()+(", destination: ")+destination.absoluteFilePath().toStdString());
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+("] action: ")+std::to_string(action));
- if(action!=FileExists_Rename)
- fileExistsAction = action;
- else
- {
- //always rename pass here
- fileExistsAction = action;
- alwaysDoFileExistsAction=action;
- }
- if(action==FileExists_Skip)
- {
- skip();
- return;
- }
- resetExtraVariable();
- emit internalStartPreOperation();
-}
-
-void TransferThread::setFileRename(const std::string &nameForRename)
-{
- if(transfer_stat!=TransferStat_PreOperation)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+source.absoluteFilePath().toStdString()+(", destination: ")+destination.absoluteFilePath().toStdString());
- return;
- }
- if(QString::fromStdString(nameForRename).contains(QRegularExpression(QStringLiteral("[/\\\\\\*]"))))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't use this kind of name, internal error"));
- emit errorOnFile(destination,tr("Try rename with using special characters").toStdString());
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] nameForRename: "+nameForRename);
- if(!renameTheOriginalDestination)
- destination.setFile(destination.absolutePath()+CURRENTSEPARATOR+QString::fromStdString(nameForRename));
- else
- {
- QString tempDestination=destination.absoluteFilePath();
- QFile destinationFile(tempDestination);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+"] "+QStringLiteral("rename %1: to: %2").arg(destination.absoluteFilePath()).arg(destination.absolutePath()+CURRENTSEPARATOR+QString::fromStdString(nameForRename)).toStdString());
- if(!destinationFile.rename(destination.absolutePath()+CURRENTSEPARATOR+QString::fromStdString(nameForRename)))
- {
- if(!destinationFile.exists())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("source not exists %1: destination: %2, error: %3").arg(destinationFile.fileName()).arg(destinationFile.fileName()).arg(destinationFile.errorString()).toStdString());
- emit errorOnFile(destinationFile,tr("File not found").toStdString());
- return;
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("unable to do real move %1: %2, error: %3").arg(destinationFile.fileName()).arg(destinationFile.fileName()).arg(destinationFile.errorString()).toStdString());
- emit errorOnFile(destinationFile,destinationFile.errorString().toStdString());
- return;
- }
- if(source.absoluteFilePath()==destination.absoluteFilePath())
- source.setFile(destination.absolutePath()+CURRENTSEPARATOR+QString::fromStdString(nameForRename));
- destination.setFile(tempDestination);
- destination.refresh();
- }
- fileExistsAction = FileExists_NotSet;
- resetExtraVariable();
- emit internalStartPreOperation();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] destination is: "+destination.absoluteFilePath().toStdString());
-}
-
-void TransferThread::setAlwaysFileExistsAction(const FileExistsAction &action)
-{
- //ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+QStringLiteral("] action to do always: ")+QString::number(action)));
- alwaysDoFileExistsAction=action;
-}
-
-void TransferThread::resetExtraVariable()
-{
- sended_state_preOperationStopped=false;
- sended_state_readStopped = false;
- sended_state_writeStopped = false;
- writeError = false;
- readError = false;
- readIsReadyVariable = false;
- writeIsReadyVariable = false;
- readIsFinishVariable = false;
- writeIsFinishVariable = false;
- readIsClosedVariable = false;
- writeIsClosedVariable = false;
- needRemove = false;
- needSkip = false;
- retry = false;
- readIsOpenVariable = false;
- writeIsOpenVariable = false;
- readIsOpeningVariable = false;
- writeIsOpeningVariable = false;
- havePermission = false;
-}
-
-void TransferThread::preOperation()
-{
- if(transfer_stat!=TransferStat_PreOperation)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] already used, source: ")+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
- return;
- }
- haveStartTime=true;
- startTransferTime.restart();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start: source: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
- needRemove=false;
- if(isSame())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] is same "+source.absoluteFilePath().toStdString()+" than "+destination.absoluteFilePath().toStdString());
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after is same");
- /*Why this code?
- if(readError)
- {
- readError=false;
- return;
- }*/
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] before destination exists");
- if(destinationExists())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] destination exists: "+destination.absoluteFilePath().toStdString());
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after destination exists");
- /*Why this code?
- if(readError)
- {
- readError=false;
- return;
- }*/
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] before keep date");
- #ifdef Q_OS_WIN32
- doTheDateTransfer=!source.isSymLink();
- #else
- doTheDateTransfer=true;
- #endif
- if(doTheDateTransfer)
- {
- if(source.lastModified()<minTime)
- {
- if(/*true when the destination have been remove but not the symlink:*/source.isSymLink())
- doTheDateTransfer=false;
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"the sources is older to copy the time: "+source.absoluteFilePath().toStdString()+": "+minTime.toString(QStringLiteral("dd.MM.yyyy hh:mm:ss.zzz")).toStdString()+">="+source.lastModified().toString(QStringLiteral("dd.MM.yyyy hh:mm:ss.zzz")).toStdString());
- doTheDateTransfer=false;
- if(keepDate)
- {
- emit errorOnFile(source,tr("Wrong modification date or unable to get it, you can disable time transfer to do it").toStdString());
- return;
- }
- }
- }
- else
- {
- doTheDateTransfer=readFileDateTime(source);
- #ifdef Q_OS_MAC
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] read the source time: "+std::to_string(butime.modtime));
- #endif
- if(!doTheDateTransfer)
- {
- //will have the real error at source open
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] unable to read the source time: "+source.absoluteFilePath().toStdString());
- if(keepDate)
- {
- emit errorOnFile(source,tr("Wrong modification date or unable to get it, you can disable time transfer to do it").toStdString());
- return;
- }
- }
- }
- }
- if(canBeMovedDirectly())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("need moved directly: %1 to %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
- canBeMovedDirectlyVariable=true;
- readThread.fakeOpen();
- writeThread.fakeOpen();
- return;
- }
- if(canBeCopiedDirectly())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("need copied directly: %1 to %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
- canBeCopiedDirectlyVariable=true;
- readThread.fakeOpen();
- writeThread.fakeOpen();
- return;
- }
- tryOpen();
-}
-
-void TransferThread::tryOpen()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start source and destination: "+source.absoluteFilePath().toStdString()+" and "+destination.absoluteFilePath().toStdString());
- TransferAlgorithm transferAlgorithm=this->transferAlgorithm;
- if(transferAlgorithm==TransferAlgorithm_Automatic)
- {
- #ifdef Q_OS_LINUX
- if(driveManagement.isSameDrive(destination.absoluteFilePath().toStdString(),source.absoluteFilePath().toStdString()))
- {
- const QByteArray &type=driveManagement.getDriveType(driveManagement.getDrive(source.absoluteFilePath().toStdString()));
- if(type=="nfs" || type=="smb")
- transferAlgorithm=TransferAlgorithm_Parallel;
- else
- transferAlgorithm=TransferAlgorithm_Sequential;
- }
- else
- #endif
- transferAlgorithm=TransferAlgorithm_Parallel;
- }
- if(!readIsOpenVariable)
- {
- if(!readIsOpeningVariable)
- {
- readError=false;
- readThread.open(source.absoluteFilePath(),mode);
- readIsOpeningVariable=true;
-
- if(doRightTransfer)
- havePermission=readFilePermissions(QFile(source.absoluteFilePath()));
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] readIsOpeningVariable is true when try open");
- emit errorOnFile(source,tr("Internal error: Already opening").toStdString());
- readError=true;
- return;
- }
- }
- if(!writeIsOpenVariable)
- {
- if(!writeIsOpeningVariable)
- {
- if(transferAlgorithm==TransferAlgorithm_Sequential)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transferAlgorithm==TransferAlgorithm_Sequential");
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transferAlgorithm==TransferAlgorithm_Parallel");
- writeError=false;
- if(transferAlgorithm==TransferAlgorithm_Sequential)
- writeThread.open(destination.absoluteFilePath(),size,osBuffer && (!osBufferLimited || (osBufferLimited && size<osBufferLimit)),sequentialBuffer,true);
- else
- writeThread.open(destination.absoluteFilePath(),size,osBuffer && (!osBufferLimited || (osBufferLimited && size<osBufferLimit)),parallelBuffer,false);
- writeIsOpeningVariable=true;
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+"writeIsOpeningVariable is true when try open");
- emit errorOnFile(destination,tr("Internal error: Already opening").toStdString());
- writeError=true;
- return;
- }
- }
-}
-
-bool TransferThread::isSame()
-{
- //check if source and destination is not the same
- //source.absoluteFilePath()==destination.absoluteFilePath() not work is source don't exists
- if(source.absoluteFilePath()==destination.absoluteFilePath())
- {
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- if(!source.exists())
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start source: "+source.absoluteFilePath().toStdString()+" not exists");
- if(!source.isSymLink())
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start source: "+source.absoluteFilePath().toStdString()+" isSymLink");
- if(!destination.isSymLink())
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start source: "+destination.absoluteFilePath().toStdString()+" isSymLink");
- #endif
- if(fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_Skip)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] is same but skip");
- transfer_stat=TransferStat_Idle;
- emit postOperationStopped();
- //quit
- return true;
- }
- if(checkAlwaysRename())
- return false;
- emit fileAlreadyExists(source,destination,true);
- return true;
- }
- return false;
-}
-
-bool TransferThread::destinationExists()
-{
- //check if destination exists
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("overwrite: %1, alwaysDoFileExistsAction: %2, readError: %3, writeError: %4")
- .arg(fileExistsAction)
- .arg(alwaysDoFileExistsAction)
- .arg(readError)
- .arg(writeError)
- .toStdString()
- );
- if(alwaysDoFileExistsAction==FileExists_Overwrite || readError || writeError
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- || rsync
- #endif
- )
- return false;
- bool destinationExists;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] time to first FS access");
- destination.refresh();
- destinationExists=destination.exists();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] finish first FS access");
- if(destinationExists)
- {
- if(fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_Skip)
- {
- transfer_stat=TransferStat_Idle;
- emit postOperationStopped();
- //quit
- return true;
- }
- if(checkAlwaysRename())
- return false;
- if(source.exists())
- {
- if(fileExistsAction==FileExists_OverwriteIfNewer || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfNewer))
- {
- if(destination.lastModified()<source.lastModified())
- return false;
- else
- {
- transfer_stat=TransferStat_Idle;
- emit postOperationStopped();
- return true;
- }
- }
- if(fileExistsAction==FileExists_OverwriteIfOlder || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfOlder))
- {
- if(destination.lastModified()>source.lastModified())
- return false;
- else
- {
- transfer_stat=TransferStat_Idle;
- emit postOperationStopped();
- return true;
- }
- }
- if(fileExistsAction==FileExists_OverwriteIfNotSame || (fileExistsAction==FileExists_NotSet && alwaysDoFileExistsAction==FileExists_OverwriteIfNotSame))
- {
- if(destination.lastModified()!=source.lastModified() || destination.size()!=source.size())
- return false;
- else
- {
- transfer_stat=TransferStat_Idle;
- emit postOperationStopped();
- return true;
- }
- }
- }
- else
- {
- if(fileExistsAction!=FileExists_NotSet)
- {
- transfer_stat=TransferStat_Idle;
- emit postOperationStopped();
- return true;
- }
- }
- if(fileExistsAction==FileExists_NotSet)
- {
- emit fileAlreadyExists(source,destination,false);
- return true;
- }
- }
- return false;
-}
-
-std::string TransferThread::resolvedName(const QFileInfo &inode)
-{
- QString fileName=inode.fileName();
- if(fileName.isEmpty())
- {
- QDir absoluteDir=inode.absoluteDir();
- fileName=absoluteDir.dirName();
- if(fileName.isEmpty())
- {
- fileName=absoluteDir.cdUp();
- fileName=absoluteDir.dirName();
- }
- }
- #ifdef Q_OS_WIN32
- if(fileName.isEmpty())
- {
- fileName=inode.absolutePath();
- fileName.replace(QRegularExpression(QStringLiteral("^([a-zA-Z]+):.*$")),QStringLiteral("\\1"));
- if(inode.absolutePath().contains(QRegularExpression(QStringLiteral("^[a-zA-Z]+:[/\\\\]?$"))))
- fileName=tr("Drive %1").arg(fileName);
- else
- fileName=tr("Unknown folder");
- }
- #else
- if(fileName.isEmpty())
- fileName=tr("root");
- #endif
- return fileName.toStdString();
-}
-
-std::string TransferThread::getSourcePath() const
-{
- return source.absoluteFilePath().toStdString();
-}
-
-std::string TransferThread::getDestinationPath() const
-{
- return destination.absoluteFilePath().toStdString();
-}
-
-QFileInfo TransferThread::getSourceInode() const
-{
- return source;
-}
-
-QFileInfo TransferThread::getDestinationInode() const
-{
- return destination;
-}
-
-Ultracopier::CopyMode TransferThread::getMode() const
-{
- return mode;
-}
-
-//return true if has been renamed
-bool TransferThread::checkAlwaysRename()
-{
- if(alwaysDoFileExistsAction==FileExists_Rename)
- {
- QFileInfo newDestination=destination;
- std::string fileName=resolvedName(newDestination);
- std::string suffix;
- std::string newFileName;
- //resolv the suffix
- if(std::regex_match(fileName,renameRegex))
- {
- suffix=fileName;
- suffix=std::regex_replace(suffix,renameRegex,"$2");
- fileName=std::regex_replace(fileName,renameRegex,"$1");
- }
- //resolv the new name
- int num=1;
- do
- {
- if(num==1)
- {
- if(firstRenamingRule.empty())
- newFileName=tr("%name% - copy").toStdString();
- else
- newFileName=firstRenamingRule;
- }
- else
- {
- if(otherRenamingRule.empty())
- newFileName=tr("%name% - copy (%number%)").toStdString();
- else
- newFileName=otherRenamingRule;
- stringreplaceAll(newFileName,"%number%",std::to_string(num));
- }
- stringreplaceAll(newFileName,"%name%",fileName);
- stringreplaceAll(newFileName,"%suffix%",suffix);
- newDestination.setFile(newDestination.absolutePath()+CURRENTSEPARATOR+QString::fromStdString(newFileName));
- num++;
- }
- while(newDestination.exists());
- if(!renameTheOriginalDestination)
- destination=newDestination;
- else
- {
- QFile destinationFile(destination.absoluteFilePath());
- if(!destinationFile.rename(newDestination.absoluteFilePath()))
- {
- if(!destinationFile.exists())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("source not exists %1: destination: %2, error: %3").arg(destinationFile.fileName()).arg(destinationFile.fileName()).arg(destinationFile.errorString()).toStdString());
- emit errorOnFile(destinationFile,tr("File not found").toStdString());
- readError=true;
- return true;
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("unable to do real move %1: %2, error: %3").arg(destinationFile.fileName()).arg(destinationFile.fileName()).arg(destinationFile.errorString()).toStdString());
- readError=true;
- emit errorOnFile(destinationFile,destinationFile.errorString().toStdString());
- return true;
- }
- }
- return true;
- }
- return false;
-}
-
-void TransferThread::tryMoveDirectly()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("need moved directly: %1 to %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
-
- sended_state_readStopped = false;
- sended_state_writeStopped = false;
- writeError = false;
- readError = false;
- readIsFinishVariable = false;
- writeIsFinishVariable = false;
- readIsClosedVariable = false;
- writeIsClosedVariable = false;
- //move if on same mount point
- QFile sourceFile(source.absoluteFilePath());
- QFile destinationFile(destination.absoluteFilePath());
- #ifndef Q_OS_WIN32
- if(destinationFile.exists() || destination.isSymLink())
- {
- if(!sourceFile.exists() && !source.isSymLink())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+destinationFile.fileName().toStdString()+", source not exists");
- readError=true;
- emit errorOnFile(destination,tr("The source file doesn't exist").toStdString());
- return;
- }
- else if(!destinationFile.remove())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+destinationFile.fileName().toStdString()+", error: "+destinationFile.errorString().toStdString());
- readError=true;
- emit errorOnFile(destination,destinationFile.errorString().toStdString());
- return;
- }
- }
- #endif
- QDir dir(destination.absolutePath());
- {
- mkpathTransfer->acquire();
- if(!dir.exists())
- dir.mkpath(destination.absolutePath());
- mkpathTransfer->release();
- }
- #ifdef Q_OS_WIN32
- //if(!sourceFile.copy(destinationFile.fileName()))
- if(MoveFileEx(
- reinterpret_cast<const wchar_t*>(sourceFile.fileName().utf16()),
- reinterpret_cast<const wchar_t*>(destinationFile.fileName().utf16()),
- MOVEFILE_COPY_ALLOWED|MOVEFILE_REPLACE_EXISTING
- )==0)
- #else
- if(!sourceFile.rename(destinationFile.fileName()))
- #endif
- {
- readError=true;
- if(!sourceFile.exists() && !source.isSymLink())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("source not exists %1: destination: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).toStdString());
- emit errorOnFile(sourceFile,tr("File not found").toStdString());
- return;
- }
- else if(!dir.exists())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("destination folder not exists %1: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).toStdString());
- emit errorOnFile(destination.absolutePath(),tr("Unable to do the folder").toStdString());
- return;
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("unable to do real move %1: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).toStdString());
- emit errorOnFile(sourceFile,sourceFile.errorString().toStdString());
- return;
- }
- readThread.fakeReadIsStarted();
- writeThread.fakeWriteIsStarted();
- readThread.fakeReadIsStopped();
- writeThread.fakeWriteIsStopped();
-}
-
-void TransferThread::tryCopyDirectly()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("need copied directly: %1 to %2").arg(source.absoluteFilePath()).arg(destination.absoluteFilePath()).toStdString());
-
- sended_state_readStopped = false;
- sended_state_writeStopped = false;
- writeError = false;
- readError = false;
- readIsFinishVariable = false;
- writeIsFinishVariable = false;
- readIsClosedVariable = false;
- writeIsClosedVariable = false;
- //move if on same mount point
- QFile sourceFile(source.absoluteFilePath());
- QFile destinationFile(destination.absoluteFilePath());
- #ifndef Q_OS_WIN32
- if(destinationFile.exists() || destination.isSymLink())
- {
- if(!sourceFile.exists() && !source.isSymLink())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+destinationFile.fileName().toStdString()+", source not exists");
- readError=true;
- emit errorOnFile(destination,tr("The source doesn't exist").toStdString());
- return;
- }
- else if(!destinationFile.remove())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+destinationFile.fileName().toStdString()+", error: "+destinationFile.errorString().toStdString());
- readError=true;
- emit errorOnFile(destination,destinationFile.errorString().toStdString());
- return;
- }
- }
- #endif
- QDir dir(destination.absolutePath());
- {
- mkpathTransfer->acquire();
- if(!dir.exists())
- dir.mkpath(destination.absolutePath());
- mkpathTransfer->release();
- }
- /** on windows, symLink is normal file, can be copied
- * on unix not, should be created **/
- #ifdef Q_OS_WIN32
- //if(!sourceFile.copy(destinationFile.fileName()))
- if(CopyFileEx(
- reinterpret_cast<const wchar_t*>(sourceFile.fileName().utf16()),
- reinterpret_cast<const wchar_t*>(destinationFile.fileName().utf16()),
- NULL,
- NULL,
- FALSE,
- 0
- )==0)
- #else
- if(!QFile::link(sourceFile.symLinkTarget(),destinationFile.fileName()))
- #endif
- {
- readError=true;
- if(!sourceFile.exists() && !source.isSymLink())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("source not exists %1 -> %4: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).arg(sourceFile.symLinkTarget()).toStdString());
- emit errorOnFile(sourceFile,tr("The source file doesn't exist").toStdString());
- return;
- }
- else if(destinationFile.exists() || destination.isSymLink())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("destination already exists %1 -> %4: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).arg(sourceFile.symLinkTarget()).toStdString());
- emit errorOnFile(sourceFile,tr("Another file exists at same place").toStdString());
- return;
- }
- else if(!dir.exists())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("destination folder not exists %1 -> %4: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).arg(sourceFile.symLinkTarget()).toStdString());
- emit errorOnFile(sourceFile,tr("Unable to do the folder").toStdString());
- return;
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("unable to do sym link copy %1 -> %4: %2, error: %3").arg(sourceFile.fileName()).arg(destinationFile.fileName()).arg(sourceFile.errorString()).arg(sourceFile.symLinkTarget()).toStdString());
- emit errorOnFile(sourceFile,sourceFile.errorString().toStdString());
- return;
- }
- readThread.fakeReadIsStarted();
- writeThread.fakeWriteIsStarted();
- readThread.fakeReadIsStopped();
- writeThread.fakeWriteIsStopped();
-}
-
-bool TransferThread::canBeMovedDirectly() const
-{
- if(mode!=Ultracopier::Move)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] mode!=Ultracopier::Move");
- return false;
- }
- return source.isSymLink() || driveManagement.isSameDrive(destination.absoluteFilePath().toStdString(),source.absoluteFilePath().toStdString());
-}
-
-bool TransferThread::canBeCopiedDirectly() const
-{
- return source.isSymLink();
-}
-
-void TransferThread::readIsReady()
-{
- if(readIsReadyVariable)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- readIsReadyVariable=true;
- readIsOpenVariable=true;
- readIsClosedVariable=false;
- readIsOpeningVariable=false;
- ifCanStartTransfer();
-}
-
-void TransferThread::ifCanStartTransfer()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readIsReadyVariable: "+std::to_string(readIsReadyVariable)+", writeIsReadyVariable: "+std::to_string(writeIsReadyVariable));
- if(readIsReadyVariable && writeIsReadyVariable)
- {
- transfer_stat=TransferStat_WaitForTheTransfer;
- sended_state_readStopped = false;
- sended_state_writeStopped = false;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stat=WaitForTheTransfer");
- if(!sended_state_preOperationStopped)
- {
- sended_state_preOperationStopped=true;
- emit preOperationStopped();
- }
- if(canStartTransfer)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stat=Transfer, "+QStringLiteral("canBeMovedDirectlyVariable: %1, canBeCopiedDirectlyVariable: %2").arg(canBeMovedDirectlyVariable).arg(canBeCopiedDirectlyVariable).toStdString());
- transfer_stat=TransferStat_Transfer;
- if(canBeMovedDirectlyVariable)
- tryMoveDirectly();
- else if(canBeCopiedDirectlyVariable)
- tryCopyDirectly();
- else
- {
- needRemove=deletePartiallyTransferredFiles;
- readThread.startRead();
- }
- emit pushStat(transfer_stat,transferId);
- }
- //else
- //emit pushStat(stat,transferId);
- }
-}
-
-void TransferThread::writeIsReady()
-{
- if(writeIsReadyVariable)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- writeIsReadyVariable=true;
- writeIsOpenVariable=true;
- writeIsClosedVariable=false;
- writeIsOpeningVariable=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;
-}
-
-#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
-//set the current max speed in KB/s
-void TransferThread::setMultiForBigSpeed(const int &multiForBigSpeed)
-{
- readThread.setMultiForBigSpeed(multiForBigSpeed);
- writeThread.setMultiForBigSpeed(multiForBigSpeed);
-}
-#endif
-
-//set block size in Bytes
-bool TransferThread::setBlockSize(const unsigned int blockSize)
-{
- bool read=readThread.setBlockSize(blockSize);
- bool write=writeThread.setBlockSize(blockSize);
- return (read && write);
-}
-
-//pause the copy
-void TransferThread::pause()
-{
- //only pause/resume during the transfer of file data
- //from transfer_stat!=TransferStat_Idle because it resume at wrong order
- if(transfer_stat!=TransferStat_Transfer && transfer_stat!=TransferStat_PostTransfer && transfer_stat!=TransferStat_Checksum)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] wrong stat to put in pause");
- return;
- }
- haveStartTime=false;
- readThread.pause();
- writeThread.pause();
-}
-
-//resume the copy
-void TransferThread::resume()
-{
- //only pause/resume during the transfer of file data
- //from transfer_stat!=TransferStat_Idle because it resume at wrong order
- if(transfer_stat!=TransferStat_Transfer && transfer_stat!=TransferStat_PostTransfer && transfer_stat!=TransferStat_Checksum)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] wrong stat to put in pause");
- return;
- }
- readThread.resume();
- writeThread.resume();
-}
-
-//stop the current copy
-void TransferThread::stop()
-{
- stopIt=true;
- haveStartTime=false;
- if(transfer_stat==TransferStat_Idle)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"transfer_stat==TransferStat_Idle");
- return;
- }
- if(remainSourceOpen())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"remainSourceOpen()");
- readThread.stop();
- }
- if(remainDestinationOpen())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"remainDestinationOpen()");
- writeThread.stop();
- }
- if(!remainFileOpen())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"transfer_stat==TransferStat_Idle");
- if(needRemove && source.absoluteFilePath()!=destination.absoluteFilePath())
- {
- if(source.exists())
- QFile(destination.absoluteFilePath()).remove();
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] try destroy the destination when the source don't exists"));
- }
- transfer_stat=TransferStat_PostOperation;
- emit internalStartPostOperation();
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,QStringLiteral("transfer_stat==%1 && remainFileOpen()").arg(transfer_stat).toStdString());
-}
-
-bool TransferThread::remainFileOpen() const
-{
- return remainSourceOpen() || remainDestinationOpen();
-}
-
-bool TransferThread::remainSourceOpen() const
-{
- return (readIsOpenVariable || readIsOpeningVariable) && !readIsClosedVariable;
-}
-
-bool TransferThread::remainDestinationOpen() const
-{
- return (writeIsOpenVariable || writeIsOpeningVariable) && !writeIsClosedVariable;
-}
-
-void TransferThread::readIsFinish()
-{
- if(readIsFinishVariable)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] double event dropped"));
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- readIsFinishVariable=true;
- canStartTransfer=false;
- //check here if need start checksuming or not
- real_doChecksum=doChecksum && (!checksumOnlyOnError || fileContentError) && (!canBeMovedDirectlyVariable && !canBeCopiedDirectlyVariable);
- if(real_doChecksum)
- {
- readIsFinishVariable=false;
- transfer_stat=TransferStat_Checksum;
- sourceChecksum=QByteArray();
- destinationChecksum=QByteArray();
- readThread.startCheckSum();
- }
- else
- {
- transfer_stat=TransferStat_PostTransfer;
- if(!needSkip || (canBeCopiedDirectlyVariable || canBeMovedDirectlyVariable))//if skip, stop call, then readIsClosed() already call
- readThread.postOperation();
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] in skip, don't start postOperation");
- }
- emit pushStat(transfer_stat,transferId);
-}
-
-void TransferThread::writeIsFinish()
-{
- if(writeIsFinishVariable)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] double event dropped");
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- writeIsFinishVariable=true;
- //check here if need start checksuming or not
- if(real_doChecksum)
- {
- writeIsFinishVariable=false;
- transfer_stat=TransferStat_Checksum;
- writeThread.startCheckSum();
- }
- else
- {
- if(!needSkip || (canBeCopiedDirectlyVariable || canBeMovedDirectlyVariable))//if skip, stop call, then writeIsClosed() already call
- writeThread.postOperation();
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] in skip, don't start postOperation");
- }
-}
-
-void TransferThread::readChecksumFinish(const QByteArray& checksum)
-{
- sourceChecksum=checksum;
- compareChecksum();
-}
-
-void TransferThread::writeChecksumFinish(const QByteArray& checksum)
-{
- destinationChecksum=checksum;
- compareChecksum();
-}
-
-void TransferThread::compareChecksum()
-{
- if(sourceChecksum.size()==0)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] the checksum of source is missing");
- return;
- }
- if(destinationChecksum.size()==0)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] the checksum of destination is missing");
- return;
- }
- if(sourceChecksum==destinationChecksum)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] the checksum match");
- readThread.postOperation();
- writeThread.postOperation();
- transfer_stat=TransferStat_PostTransfer;
- emit pushStat(transfer_stat,transferId);
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] the checksum not match"));
- //emit error here, and wait to resume
- emit errorOnFile(destination,tr("The checksums do not match").toStdString());
- }
-}
-
-void TransferThread::readIsClosed()
-{
- if(readIsClosedVariable)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] double event dropped"));
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- readIsClosedVariable=true;
- readIsOpeningVariable=false;
- checkIfAllIsClosedAndDoOperations();
-}
-
-void TransferThread::writeIsClosed()
-{
- if(writeIsClosedVariable)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] double event dropped");
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- writeIsClosedVariable=true;
- writeIsOpeningVariable=false;
- if(stopIt && needRemove && source.absoluteFilePath()!=destination.absoluteFilePath())
- {
- if(source.exists())
- QFile(destination.absoluteFilePath()).remove();
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] try destroy the destination when the source don't exists"));
- }
- checkIfAllIsClosedAndDoOperations();
-}
-
-// return true if all is closed, and do some operations, don't use into condition to check if is closed!
-bool TransferThread::checkIfAllIsClosedAndDoOperations()
-{
- if((readError || writeError) && !needSkip && !stopIt)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] resolve error before progress");
- return false;
- }
- if(!remainFileOpen())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit internalStartPostOperation() to do the real post operation");
- transfer_stat=TransferStat_PostOperation;
- //emit pushStat(stat,transferId);
- emit internalStartPostOperation();
- return true;
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("wait self close: readIsReadyVariable: %1, readIsClosedVariable: %2, writeIsReadyVariable: %3, writeIsClosedVariable: %4")
- .arg(readIsReadyVariable)
- .arg(readIsClosedVariable)
- .arg(writeIsReadyVariable)
- .arg(writeIsClosedVariable)
- .toStdString()
- );
- return false;
- }
-}
-
-/// \todo found way to retry that's
-/// \todo the rights copy
-void TransferThread::postOperation()
-{
- if(transfer_stat!=TransferStat_PostOperation)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] need be in transfer, source: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString()+", stat:"+std::to_string(transfer_stat));
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- //all except closing
- if((readError || writeError) && !needSkip && !stopIt)//normally useless by checkIfAllIsFinish()
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] resume after error");
- return;
- }
-
- if(!needSkip && !stopIt)
- {
- if(!canBeCopiedDirectlyVariable && !canBeMovedDirectlyVariable)
- {
- if(writeIsOpenVariable && !writeIsClosedVariable)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] can't pass in post operation if write is not closed"));
- emit errorOnFile(destination,tr("Internal error: The destination is not closed").toStdString());
- needSkip=false;
- if(deletePartiallyTransferredFiles)
- needRemove=true;
- writeError=true;
- return;
- }
- if(readThread.getLastGoodPosition()!=writeThread.getLastGoodPosition())
- {
- writeThread.flushBuffer();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+QString("] readThread.getLastGoodPosition(%1)!=writeThread.getLastGoodPosition(%2)")
- .arg(readThread.getLastGoodPosition())
- .arg(writeThread.getLastGoodPosition())
- .toStdString()
- );
- emit errorOnFile(destination,tr("Internal error: The size transfered doesn't match").toStdString());
- needSkip=false;
- if(deletePartiallyTransferredFiles)
- needRemove=true;
- writeError=true;
- return;
- }
- if(!writeThread.bufferIsEmpty())
- {
- writeThread.flushBuffer();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] buffer is not empty"));
- emit errorOnFile(destination,tr("Internal error: The buffer is not empty").toStdString());
- needSkip=false;
- if(deletePartiallyTransferredFiles)
- needRemove=true;
- writeError=true;
- return;
- }
- //in normal mode, without copy/move syscall
- if(!doFilePostOperation())
- return;
- }
-
- //remove source in moving mode
- if(mode==Ultracopier::Move && !canBeMovedDirectlyVariable)
- {
- if(destination.exists() && destination.isFile())
- {
- QFile sourceFile(source.absoluteFilePath());
- if(!sourceFile.remove())
- {
- needSkip=false;
- emit errorOnFile(source,sourceFile.errorString().toStdString());
- return;
- }
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] try remove source but destination not exists!"));
- }
- }
- else//do difference skip a file and skip this error case
- {
- if(needRemove && destination.exists() && source.exists() && source.absoluteFilePath()!=destination.absoluteFilePath() && destination.isFile())
- {
- QFile destinationFile(destination.absoluteFilePath());
- if(!destinationFile.remove())
- {
- //emit errorOnFile(source,destinationFile.errorString());
- //return;
- }
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] try remove destination but not exists!");
- }
- source.setFile(QStringLiteral(""));
- destination.setFile(QStringLiteral(""));
- //don't need remove because have correctly finish (it's not in: have started)
- needRemove=false;
- needSkip=false;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit postOperationStopped()");
- transfer_stat=TransferStat_Idle;
- emit postOperationStopped();
-}
-
-bool TransferThread::doFilePostOperation()
-{
- //do operation needed by copy
- //set the time if no write thread used
-
- destination.refresh();
- if(!destination.exists() && !destination.isSymLink())
- {
- if(!stopIt)
- if(/*true when the destination have been remove but not the symlink:*/!source.isSymLink())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to change the date: File not found");
- emit errorOnFile(destination,tr("Unable to change the date").toStdString()+": "+tr("File not found").toStdString());
- return false;
- }
- }
- else
- {
- if(doTheDateTransfer)
- {
- if(!writeFileDateTime(destination))
- {
- if(!destination.isFile())
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to change the date (is not a file)");
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to change the date");
- /* error with virtual folder under windows */
- #ifndef Q_OS_WIN32
- if(keepDate)
- {
- emit errorOnFile(destination,tr("Unable to change the date").toStdString());
- return false;
- }
- #endif
- }
- else
- {
- #ifndef Q_OS_WIN32
- destination.refresh();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] read the destination time: "+destination.lastModified().toString().toStdString());
- if(destination.lastModified()<minTime)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] read the destination time lower than min time: "+destination.lastModified().toString().toStdString());
- if(keepDate)
- {
- emit errorOnFile(destination,tr("Unable to change the date").toStdString());
- return false;
- }
- }
- #endif
- }
- }
- if(doRightTransfer)
- {
- //should be never used but...
- /*source.refresh();
- if(source.exists())*/
- if(havePermission)
- {
- QFile destinationFile(destination.absoluteFilePath());
- if(!writeFilePermissions(destinationFile))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Unable to set the destination file permission");
- //emit errorOnFile(destination,tr("Unable to set the destination file permission"));
- //return false;
- }
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Try doRightTransfer when source not exists");
- }
- }
- if(stopIt)
- return false;
-
- return true;
-}
-
-//////////////////////////////////////////////////////////////////
-/////////////////////// Error management /////////////////////////
-//////////////////////////////////////////////////////////////////
-
-void TransferThread::getWriteError()
-{
- if(writeError)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] already in write error!");
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- fileContentError = true;
- writeError = true;
- writeIsReadyVariable = false;
- writeError_source_seeked = false;
- writeError_destination_reopened = false;
- writeIsOpeningVariable=false;
- if(!readError)//already display error for the read
- emit errorOnFile(destination,writeThread.errorString());
-}
-
-void TransferThread::getReadError()
-{
- if(readError)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] already in read error!");
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- fileContentError = true;
- readError = true;
- //writeIsReadyVariable = false;//wrong because write can be ready here
- readIsReadyVariable = false;
- readIsOpeningVariable=false;
- if(!writeError)//already display error for the write
- emit errorOnFile(source,readThread.errorString());
-}
-
-//retry after error
-void TransferThread::retryAfterError()
-{
- /// \warning skip the resetExtraVariable(); to be more exact and resolv some bug
- if(transfer_stat==TransferStat_Idle)
- {
- if(transferId==0)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] seam have bug, source: ")+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] restart all, source: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString());
- readError=false;
- //writeError=false;
- emit internalStartPreOperation();
- return;
- }
- //opening error
- if(transfer_stat==TransferStat_PreOperation)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] is not idle, source: "+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString()+", stat: "+std::to_string(transfer_stat));
- readError=false;
- //writeError=false;
- emit internalStartPreOperation();
- //tryOpen();-> recheck all, because can be an error into isSame(), rename(), ...
- return;
- }
- //data streaming error
- if(transfer_stat!=TransferStat_PostOperation && transfer_stat!=TransferStat_Transfer && transfer_stat!=TransferStat_PostTransfer && transfer_stat!=TransferStat_Checksum)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+("] is not in right stat, source: ")+source.absoluteFilePath().toStdString()+", destination: "+destination.absoluteFilePath().toStdString()+", stat: "+std::to_string(transfer_stat));
- return;
- }
- if(transfer_stat==TransferStat_PostOperation)
- {
- if(readError || writeError)
- {
- readError=false;
- //writeError=false;
- resumeTransferAfterWriteError();
- writeThread.flushBuffer();
- transfer_stat=TransferStat_PreOperation;
- emit internalStartPreOperation();
- return;
- }
- emit internalStartPostOperation();
- return;
- }
- if(canBeMovedDirectlyVariable)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] retry the system move");
- tryMoveDirectly();
- return;
- }
- if(canBeCopiedDirectlyVariable)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] retry the copy directly");
- tryCopyDirectly();
- return;
- }
- if(transfer_stat==TransferStat_Checksum)
- {
- if(writeError)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start and resume the write error");
- writeThread.reopen();
- }
- else if(readError)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start and resume the read error");
- readThread.reopen();
- }
- else //only checksum difference
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] retry all the transfer");
- canStartTransfer=true;
- ifCanStartTransfer();
- }
- return;
- }
- //can have error on source and destination at the same time
- if(writeError)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start and resume the write error: "+std::to_string(readError));
- if(readError)
- readThread.reopen();
- else
- {
- readIsClosedVariable=false;
- readThread.seekToZeroAndWait();
- }
- writeThread.reopen();
- }
- if(readError)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start and resume the read error");
- readThread.reopen();
- }
- if(!writeError && !readError)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] unknow error resume");
-}
-
-void TransferThread::writeThreadIsReopened()
-{
- if(writeError_destination_reopened)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
- return;
- }
- writeError_destination_reopened=true;
- if(transfer_stat==TransferStat_Checksum)
- {
- writeThread.startCheckSum();
- return;
- }
- if(writeError_source_seeked && writeError_destination_reopened)
- resumeTransferAfterWriteError();
-}
-
-void TransferThread::readThreadIsSeekToZeroAndWait()
-{
- if(writeError_source_seeked)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(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(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- readError=false;
- writeIsReady();
- readIsReady();
-}
-
-//////////////////////////////////////////////////////////////////
-///////////////////////// Normal event ///////////////////////////
-//////////////////////////////////////////////////////////////////
-
-void TransferThread::readIsStopped()
-{
- if(!sended_state_readStopped)
- {
- sended_state_readStopped=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit readIsStopped()");
- emit readStopped();
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] drop dual read stopped");
- return;
- }
- readIsFinish();
-}
-
-void TransferThread::writeIsStopped()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- if(!sended_state_writeStopped)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit writeStopped()");
- sended_state_writeStopped=true;
- emit writeStopped();
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
- return;
- }
- writeIsFinish();
-}
-
-#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
-void TransferThread::timeOfTheBlockCopyFinished()
-{
- readThread.timeOfTheBlockCopyFinished();
- writeThread.timeOfTheBlockCopyFinished();
-}
-#endif
-
-bool TransferThread::setParallelBuffer(const int &parallelBuffer)
-{
- if(parallelBuffer<1 || parallelBuffer>ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] wrong parallelBuffer: "+std::to_string(parallelBuffer));
- return false;
- }
- else
- {
- this->parallelBuffer=parallelBuffer;
- return true;
- }
-}
-
-bool TransferThread::setSequentialBuffer(const int &sequentialBuffer)
-{
- if(sequentialBuffer<1 || sequentialBuffer>ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] wrong sequentialBuffer: "+std::to_string(sequentialBuffer));
- return false;
- }
- else
- {
- this->sequentialBuffer=sequentialBuffer;
- return true;
- }
-}
-
-void TransferThread::setTransferAlgorithm(const TransferAlgorithm &transferAlgorithm)
-{
- this->transferAlgorithm=transferAlgorithm;
- if(transferAlgorithm==TransferAlgorithm_Sequential)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transferAlgorithm==TransferAlgorithm_Sequential");
- else if(transferAlgorithm==TransferAlgorithm_Automatic)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transferAlgorithm==TransferAlgorithm_Automatic");
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] transferAlgorithm==TransferAlgorithm_Parallel");
-}
-
-//fonction to read the file date time
-bool TransferThread::readFileDateTime(const QFileInfo &source)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readFileDateTime("+source.absoluteFilePath().toStdString()+")");
- if(source.lastModified()<minTime)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] the sources is older to copy the time: "+source.absoluteFilePath().toStdString()+": "+source.lastModified().toString().toStdString());
- return false;
- }
- /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
- #ifdef Q_OS_UNIX
- #ifdef Q_OS_LINUX
- struct stat info;
- if(stat(source.absoluteFilePath().toLatin1().data(),&info)!=0)
- return false;
- time_t ctime=info.st_ctim.tv_sec;
- time_t actime=info.st_atim.tv_sec;
- time_t modtime=info.st_mtim.tv_sec;
- //this function avalaible on unix and mingw
- butime.actime=actime;
- butime.modtime=modtime;
- Q_UNUSED(ctime);
- return true;
- #else //mainly for mac
- time_t ctime=source.created().toTime_t();
- time_t actime=source.lastRead().toTime_t();
- time_t modtime=source.lastModified().toTime_t();
- //this function avalaible on unix and mingw
- butime.actime=actime;
- butime.modtime=modtime;
- Q_UNUSED(ctime);
- return true;
- #endif
- #else
- #ifdef Q_OS_WIN32
- #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- struct stat info;
- if(stat(source.toLatin1().data(),&info)!=0)
- return false;
- time_t ctime=info.st_ctim.tv_sec;
- time_t actime=info.st_atim.tv_sec;
- time_t modtime=info.st_mtim.tv_sec;
- //this function avalaible on unix and mingw
- butime.actime=actime;
- butime.modtime=modtime;
- Q_UNUSED(ctime);
- return true;
- #else
- wchar_t filePath[65535];
- if(std::regex_match(source.absoluteFilePath().toStdString(),regRead))
- filePath[QDir::toNativeSeparators(QStringLiteral("\\\\?\\")+source.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
- else
- filePath[QDir::toNativeSeparators(source.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
- HANDLE hFileSouce = CreateFileW(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, NULL);
- if(hFileSouce == INVALID_HANDLE_VALUE)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] open failed to read: "+QString::fromWCharArray(filePath).toStdString()+", error: "+std::to_string(GetLastError()));
- return false;
- }
- FILETIME ftCreate, ftAccess, ftWrite;
- if(!GetFileTime(hFileSouce, &ftCreate, &ftAccess, &ftWrite))
- {
- CloseHandle(hFileSouce);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to get the file time");
- return false;
- }
- this->ftCreateL=ftCreate.dwLowDateTime;
- this->ftCreateH=ftCreate.dwHighDateTime;
- this->ftAccessL=ftAccess.dwLowDateTime;
- this->ftAccessH=ftAccess.dwHighDateTime;
- this->ftWriteL=ftWrite.dwLowDateTime;
- this->ftWriteH=ftWrite.dwHighDateTime;
- CloseHandle(hFileSouce);
- return true;
- #endif
- #else
- return false;
- #endif
- #endif
- return false;
-}
-
-bool TransferThread::writeFileDateTime(const QFileInfo &destination)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] writeFileDateTime("+destination.absoluteFilePath().toStdString()+")");
- /** Why not do it with Qt? Because it not support setModificationTime(), and get the time with Qt, that's mean use local time where in C is UTC time */
- #ifdef Q_OS_UNIX
- #ifdef Q_OS_LINUX
- return utime(destination.absoluteFilePath().toLatin1().data(),&butime)==0;
- #else //mainly for mac
- return utime(destination.absoluteFilePath().toLatin1().data(),&butime)==0;
- #endif
- #else
- #ifdef Q_OS_WIN32
- #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- return utime(destination.toLatin1().data(),&butime)==0;
- #else
- wchar_t filePath[65535];
- if(std::regex_match(destination.absoluteFilePath().toStdString(),regRead))
- filePath[QDir::toNativeSeparators(QStringLiteral("\\\\?\\")+destination.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
- else
- filePath[QDir::toNativeSeparators(destination.absoluteFilePath()).toWCharArray(filePath)]=L'\0';
- HANDLE hFileDestination = CreateFileW(filePath, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
- if(hFileDestination == INVALID_HANDLE_VALUE)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] open failed to write: "+QString::fromWCharArray(filePath).toStdString()+", error: "+std::to_string(GetLastError()));
- return false;
- }
- FILETIME ftCreate, ftAccess, ftWrite;
- ftCreate.dwLowDateTime=this->ftCreateL;
- ftCreate.dwHighDateTime=this->ftCreateH;
- ftAccess.dwLowDateTime=this->ftAccessL;
- ftAccess.dwHighDateTime=this->ftAccessH;
- ftWrite.dwLowDateTime=this->ftWriteL;
- ftWrite.dwHighDateTime=this->ftWriteH;
- if(!SetFileTime(hFileDestination, &ftCreate, &ftAccess, &ftWrite))
- {
- CloseHandle(hFileDestination);
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] unable to set the file time");
- return false;
- }
- CloseHandle(hFileDestination);
- return true;
- #endif
- #else
- return false;
- #endif
- #endif
- return false;
-}
-
-bool TransferThread::readFilePermissions(const QFile &source)
-{
- this->permissions=source.permissions();
- return true;
-}
-
-bool TransferThread::writeFilePermissions(QFile &destination)
-{
- return destination.setPermissions(this->permissions);
-}
-
-//skip the copy
-void TransferThread::skip()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start with stat: "+std::to_string(transfer_stat));
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] readIsOpeningVariable: "+std::to_string(readIsOpeningVariable)+", readIsOpenVariable: "+std::to_string(readIsOpenVariable)+", readIsReadyVariable: "+std::to_string(readIsReadyVariable)+", readIsFinishVariable: "+std::to_string(readIsFinishVariable)+", readIsClosedVariable: "+std::to_string(readIsClosedVariable));
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] writeIsOpeningVariable: "+std::to_string(writeIsOpeningVariable)+", writeIsOpenVariable: "+std::to_string(writeIsOpenVariable)+", writeIsReadyVariable: "+std::to_string(writeIsReadyVariable)+", writeIsFinishVariable: "+std::to_string(writeIsFinishVariable)+", writeIsClosedVariable: "+std::to_string(writeIsClosedVariable));
- switch(transfer_stat)
- {
- case TransferStat_WaitForTheTransfer:
- //needRemove=true;never put that's here, can product destruction of the file
- case TransferStat_PreOperation:
- if(needSkip)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] skip already in progress");
- return;
- }
- needSkip=true;
- //check if all is source and destination is closed
- if(remainFileOpen())
- {
- if(remainSourceOpen())
- readThread.stop();
- if(remainDestinationOpen())
- writeThread.stop();
- }
- else // wait nothing, just quit
- {
- transfer_stat=TransferStat_PostOperation;
- emit internalStartPostOperation();
- }
- break;
- case TransferStat_Transfer:
- case TransferStat_PostTransfer:
- if(needSkip)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] skip already in progress");
- return;
- }
- //needRemove=true;never put that's here, can product destruction of the file
- needSkip=true;
- if(canBeMovedDirectlyVariable || canBeCopiedDirectlyVariable)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] Do the direct FS fake close, canBeMovedDirectlyVariable: "+std::to_string(canBeMovedDirectlyVariable)+", canBeCopiedDirectlyVariable: "+std::to_string(canBeCopiedDirectlyVariable));
- readThread.fakeReadIsStarted();
- writeThread.fakeWriteIsStarted();
- readThread.fakeReadIsStopped();
- writeThread.fakeWriteIsStopped();
- return;
- }
- writeThread.flushBuffer();
- if(remainFileOpen())
- {
- if(remainSourceOpen())
- readThread.stop();
- if(remainDestinationOpen())
- writeThread.stop();
- }
- else // wait nothing, just quit
- {
- transfer_stat=TransferStat_PostOperation;
- emit internalStartPostOperation();
- }
- break;
- case TransferStat_Checksum:
- if(needSkip)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] skip already in progress");
- return;
- }
- //needRemove=true;never put that's here, can product destruction of the file
- needSkip=true;
- if(remainFileOpen())
- {
- if(remainSourceOpen())
- readThread.stop();
- if(remainDestinationOpen())
- writeThread.stop();
- }
- else // wait nothing, just quit
- {
- transfer_stat=TransferStat_PostOperation;
- emit internalStartPostOperation();
- }
- break;
- case TransferStat_PostOperation:
- if(needSkip)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] skip already in progress");
- return;
- }
- //needRemove=true;never put that's here, can product destruction of the file
- needSkip=true;
- writeThread.flushBuffer();
- emit internalStartPostOperation();
- break;
- default:
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] can skip in this state: "+std::to_string(transfer_stat));
- return;
- }
-}
-
-//return info about the copied size
-int64_t TransferThread::copiedSize()
-{
- switch(transfer_stat)
- {
- case TransferStat_Transfer:
- case TransferStat_PostOperation:
- case TransferStat_PostTransfer:
- return (readThread.getLastGoodPosition()+writeThread.getLastGoodPosition())/2;
- case TransferStat_Checksum:
- return transferSize;
- default:
- return 0;
- }
-}
-
-//retry after error
-void TransferThread::putAtBottom()
-{
- emit tryPutAtBottom();
-}
-
-#ifdef ULTRACOPIER_PLUGIN_RSYNC
-/// \brief set rsync
-void TransferThread::setRsync(const bool rsync)
-{
- this->rsync=rsync;
-}
-#endif
-
-void TransferThread::set_osBufferLimit(const unsigned int &osBufferLimit)
-{
- this->osBufferLimit=osBufferLimit;
-}
-
-#ifdef ULTRACOPIER_PLUGIN_DEBUG
-//to set the id
-void TransferThread::setId(int id)
-{
- this->id=id;
- readThread.setId(id);
- writeThread.setId(id);
-}
-
-char TransferThread::readingLetter() const
-{
- 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;
- case ReadThread::Checksum:
- return 'S';
- break;
- default:
- return '?';
- }
-}
-
-char TransferThread::writingLetter() const
-{
- 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;
- case WriteThread::Read:
- return 'R';
- break;
- case WriteThread::Checksum:
- return 'S';
- break;
- default:
- return '?';
- }
-}
-
-#endif
-
-void TransferThread::setMkpathTransfer(QSemaphore *mkpathTransfer)
-{
- this->mkpathTransfer=mkpathTransfer;
- writeThread.setMkpathTransfer(mkpathTransfer);
-}
-
-void TransferThread::set_doChecksum(bool doChecksum)
-{
- this->doChecksum=doChecksum;
-}
-
-void TransferThread::set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible)
-{
- this->checksumIgnoreIfImpossible=checksumIgnoreIfImpossible;
-}
-
-void TransferThread::set_checksumOnlyOnError(bool checksumOnlyOnError)
-{
- this->checksumOnlyOnError=checksumOnlyOnError;
-}
-
-void TransferThread::set_osBuffer(bool osBuffer)
-{
- this->osBuffer=osBuffer;
-}
-
-void TransferThread::set_osBufferLimited(bool osBufferLimited)
-{
- this->osBufferLimited=osBufferLimited;
-}
-
-//not copied size, because that's count to the checksum, ...
-uint64_t TransferThread::realByteTransfered() const
-{
- switch(transfer_stat)
- {
- case TransferStat_Transfer:
- case TransferStat_Checksum:
- return (readThread.getLastGoodPosition()+writeThread.getLastGoodPosition())/2;
- case TransferStat_PostTransfer:
- return (readThread.getLastGoodPosition()+writeThread.getLastGoodPosition())/2;
- case TransferStat_PostOperation:
- return transferSize;
- default:
- return 0;
- }
-}
-
-//first is read, second is write
-std::pair<uint64_t, uint64_t> TransferThread::progression() const
-{
- std::pair<uint64_t,uint64_t> returnVar;
- switch(transfer_stat)
- {
- case TransferStat_Transfer:
- returnVar.first=readThread.getLastGoodPosition();
- returnVar.second=writeThread.getLastGoodPosition();
- /*if(returnVar.first<returnVar.second)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+QStringLiteral("] read is smaller than write"));*/
- break;
- case TransferStat_Checksum:
- returnVar.first=readThread.getLastGoodPosition();
- returnVar.second=writeThread.getLastGoodPosition();
- break;
- case TransferStat_PostTransfer:
- returnVar.first=transferSize;
- returnVar.second=writeThread.getLastGoodPosition();
- /*if(returnVar.first<returnVar.second)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+QStringLiteral("] read is smaller than write"));*/
- break;
- case TransferStat_PostOperation:
- returnVar.first=transferSize;
- returnVar.second=transferSize;
- break;
- default:
- returnVar.first=0;
- returnVar.second=0;
- }
- return returnVar;
-}
-
-void TransferThread::setRenamingRules(const std::string &firstRenamingRule, const std::string &otherRenamingRule)
-{
- this->firstRenamingRule=firstRenamingRule;
- this->otherRenamingRule=otherRenamingRule;
-}
-
-void TransferThread::setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles)
-{
- this->deletePartiallyTransferredFiles=deletePartiallyTransferredFiles;
-}
-
-void TransferThread::setRenameTheOriginalDestination(const bool &renameTheOriginalDestination)
-{
- this->renameTheOriginalDestination=renameTheOriginalDestination;
-}
-
-void TransferThread::set_updateMount()
-{
- driveManagement.tryUpdate();
-}
diff --git a/plugins/CopyEngine/Ultracopier/TransferThread.h b/plugins/CopyEngine/Ultracopier/TransferThread.h
deleted file mode 100644
index fb64d6a..0000000
--- a/plugins/CopyEngine/Ultracopier/TransferThread.h
+++ /dev/null
@@ -1,292 +0,0 @@
-/** \file TransferThread.h
-\brief Thread changed to manage the inode operation, the signals, canceling, pre and post operations
-\author alpha_one_x86
-\licence GPL3, see the file COPYING */
-
-#ifndef TRANSFERTHREAD_H
-#define TRANSFERTHREAD_H
-
-#include <QThread>
-#include <QFileInfo>
-#include <regex>
-#include <vector>
-#include <string>
-#include <QDateTime>
-#include <QDir>
-#include <utility>
-
-#ifdef Q_OS_UNIX
- #include <utime.h>
- #include <time.h>
- #include <unistd.h>
- #include <sys/stat.h>
-#else
- #ifdef Q_OS_WIN32
- #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- #include <utime.h>
- #include <time.h>
- #include <unistd.h>
- #include <sys/stat.h>
- #endif
- #endif
-#endif
-
-#include "ReadThread.h"
-#include "WriteThread.h"
-#include "Environment.h"
-#include "DriveManagement.h"
-#include "StructEnumDefinition_CopyEngine.h"
-
-/// \brief Thread changed to manage the inode operation, the signals, canceling, pre and post operations
-class TransferThread : public QThread
-{
- Q_OBJECT
-public:
- explicit TransferThread();
- ~TransferThread();
- /// \brief get transfer stat
- TransferStat getStat() const;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- /// \brief to set the id
- void setId(int id);
- /// \brief get the reading letter
- char readingLetter() const;
- /// \brief get the writing letter
- char writingLetter() const;
- #endif
- /// \brief to have semaphore, and try create just one by one
- void setMkpathTransfer(QSemaphore *mkpathTransfer);
- /// \brief to store the transfer id
- uint64_t transferId;
- /// \brief to store the transfer size
- uint64_t transferSize;
- bool haveStartTime;
- QTime startTransferTime;
-
- void set_doChecksum(bool doChecksum);
- void set_checksumIgnoreIfImpossible(bool checksumIgnoreIfImpossible);
- void set_checksumOnlyOnError(bool checksumOnlyOnError);
- void set_osBuffer(bool osBuffer);
- void set_osBufferLimited(bool osBufferLimited);
-
- //not copied size, because that's count to the checksum, ...
- uint64_t realByteTransfered() const;
- std::pair<uint64_t, uint64_t> progression() const;
- static std::string resolvedName(const QFileInfo &inode);
- std::string getSourcePath() const;
- std::string getDestinationPath() const;
- QFileInfo getSourceInode() const;
- QFileInfo getDestinationInode() const;
- Ultracopier::CopyMode getMode() const;
-protected:
- void run();
-signals:
- //to send state
- void preOperationStopped() const;
- void checkIfItCanBeResumed() const;
- //void transferStarted();//not sended (and not used then)
- void readStopped() const;
- void writeStopped() const;
- void postOperationStopped() const;
- //get dialog
- void fileAlreadyExists(const QFileInfo &info,const QFileInfo &info2,const bool &isSame) const;
- void errorOnFile(const QFileInfo &info,const std::string &string,const ErrorType &errorType=ErrorType_Normal) const;
- //internal signal
- void internalStartPostOperation() const;
- void internalStartPreOperation() const;
- void internalStartResumeAfterErrorAndSeek() const;
- /// \brief To debug source
- void debugInformation(const Ultracopier::DebugLevel &level,std::string fonction,std::string text,std::string file,int ligne) const;
- void tryPutAtBottom() const;
- //force into the right thread
- void internalTryStartTheTransfer() const;
- /// \brief update the transfer stat
- void pushStat(const TransferStat &stat,const uint64_t &pos) const;
-public slots:
- /// \brief to start the transfer of data
- void startTheTransfer();
- /// \brief to set files to transfer
- bool setFiles(const QFileInfo& source,const int64_t &size,const QFileInfo& destination,const Ultracopier::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 std::string &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);
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- /// \brief set the current max speed in KB/s
- void setMultiForBigSpeed(const int &maxSpeed);
- #endif
- /// \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
- int64_t copiedSize();
- /// \brief put the current file at bottom
- void putAtBottom();
-
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- void setRsync(const bool rsync);
- #endif
-
- void set_osBufferLimit(const unsigned int &osBufferLimit);
- void setRenamingRules(const std::string &firstRenamingRule,const std::string &otherRenamingRule);
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- //speed limitation
- void timeOfTheBlockCopyFinished();
- #endif
-
- bool setParallelBuffer(const int &parallelBuffer);
- bool setSequentialBuffer(const int &sequentialBuffer);
- void setTransferAlgorithm(const TransferAlgorithm &transferAlgorithm);
- void setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles);
- void setRenameTheOriginalDestination(const bool &renameTheOriginalDestination);
- void set_updateMount();
-private slots:
- void preOperation();
- void readIsReady();
- void writeIsReady();
- void readIsFinish();
- void writeIsFinish();
- void readIsClosed();
- void writeIsClosed();
- void postOperation();
- void getWriteError();
- void getReadError();
- void readChecksumFinish(const QByteArray&);
- void writeChecksumFinish(const QByteArray&);
- void compareChecksum();
- //void syncAfterErrorAndReadFinish();
- void readThreadIsSeekToZeroAndWait();
- void writeThreadIsReopened();
- void readThreadResumeAfterError();
- //to filter the emition of signal
- void readIsStopped();
- void writeIsStopped();
- //force into the right thread
- void internalStartTheTransfer();
-private:
- enum MoveReturn
- {
- MoveReturn_skip=0,
- MoveReturn_moved=1,
- MoveReturn_error=2
- };
- TransferStat transfer_stat;
- ReadThread readThread;
- WriteThread writeThread;
- /*QString source;
- QString destination;*/
- Ultracopier::CopyMode mode;
- bool doRightTransfer;
- #ifdef ULTRACOPIER_PLUGIN_RSYNC
- bool rsync;
- #endif
- bool keepDate;
- //ready = open + ready to operation (no error to resolv)
- bool readIsReadyVariable;
- bool writeIsReadyVariable;
- //can be open but with error
- bool readIsOpeningVariable;//after call open() and before the end of internalOpen(), mostly to prevent internal error by open() when another is running
- bool writeIsOpeningVariable;//after call open() and before the end of internalOpen(), mostly to prevent internal error by open() when another is running
- bool readIsOpenVariable;
- bool writeIsOpenVariable;
- bool readIsFinishVariable;
- bool writeIsFinishVariable;
- bool readIsClosedVariable;
- bool writeIsClosedVariable;
- bool canBeMovedDirectlyVariable,canBeCopiedDirectlyVariable;
- DriveManagement driveManagement;
- QByteArray sourceChecksum,destinationChecksum;
- volatile bool stopIt;
- volatile bool canStartTransfer;
- bool retry;
- QFileInfo source;
- QFileInfo destination;
- int64_t size;
- FileExistsAction fileExistsAction;
- FileExistsAction alwaysDoFileExistsAction;
- bool needSkip,needRemove;
- QDateTime minTime;
- int id;
- QSemaphore *mkpathTransfer;
- bool doChecksum,real_doChecksum;
- bool checksumIgnoreIfImpossible;
- bool checksumOnlyOnError;
- bool deletePartiallyTransferredFiles;
- bool osBuffer;
- bool osBufferLimited;
- unsigned int osBufferLimit;
- std::string firstRenamingRule;
- std::string otherRenamingRule;
- //error management
- bool writeError,writeError_source_seeked,writeError_destination_reopened;
- bool readError;
- bool renameTheOriginalDestination;
- bool fileContentError;
- bool doTheDateTransfer;
- int parallelBuffer;
- int sequentialBuffer;
- int parallelizeIfSmallerThan;
- std::regex renameRegex;
- TransferAlgorithm transferAlgorithm;
- #ifdef Q_OS_UNIX
- utimbuf butime;
- #else
- #ifdef Q_OS_WIN32
- #ifdef ULTRACOPIER_PLUGIN_SET_TIME_UNIX_WAY
- utimbuf butime;
- #else
- uint32_t ftCreateL, ftAccessL, ftWriteL;
- uint32_t ftCreateH, ftAccessH, ftWriteH;
- std::regex regRead;
- #endif
- #endif
- #endif
- QFileDevice::Permissions permissions;
- bool havePermission;
- //different pre-operation
- bool isSame();
- bool destinationExists();
- bool checkAlwaysRename();///< return true if has been renamed
- bool canBeMovedDirectly() const;
- bool canBeCopiedDirectly() const;
- void tryMoveDirectly();
- void tryCopyDirectly();
- void ifCanStartTransfer();
- //fonction to edit the file date time
- bool readFileDateTime(const QFileInfo &source);
- bool writeFileDateTime(const QFileInfo &destination);
- bool readFilePermissions(const QFile &source);
- bool writeFilePermissions(QFile &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 checkIfAllIsClosedAndDoOperations();// return true if all is closed, and do some operations, don't use into condition to check if is closed!
- bool doFilePostOperation();
- //different pre-operation
- void tryOpen();
- bool remainFileOpen() const;
- bool remainSourceOpen() const;
- bool remainDestinationOpen() const;
-};
-
-#endif // TRANSFERTHREAD_H
diff --git a/plugins/CopyEngine/Ultracopier/WriteThread.cpp b/plugins/CopyEngine/Ultracopier/WriteThread.cpp
deleted file mode 100644
index bbb35fa..0000000
--- a/plugins/CopyEngine/Ultracopier/WriteThread.cpp
+++ /dev/null
@@ -1,976 +0,0 @@
-#include "WriteThread.h"
-
-#ifdef Q_OS_LINUX
-#include <fcntl.h>
-#endif
-#include <QDir>
-
-QMultiHash<QString,WriteThread *> WriteThread::writeFileList;
-QMutex WriteThread::writeFileListMutex;
-
-WriteThread::WriteThread()
-{
- deletePartiallyTransferredFiles = true;
- lastGoodPosition = 0;
- stopIt = false;
- isOpen.release();
- moveToThread(this);
- setObjectName(QStringLiteral("write"));
- //this->mkpathTransfer = mkpathTransfer;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat = Idle;
- #endif
- numberOfBlock = ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
- buffer = false;
- putInPause = false;
- needRemoveTheFile = false;
- blockSize = ULTRACOPIER_PLUGIN_DEFAULT_BLOCK_SIZE*1024;
- start();
-}
-
-WriteThread::~WriteThread()
-{
- stopIt=true;
- needRemoveTheFile=true;
- pauseMutex.release();
- writeFull.release();
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- waitNewClockForSpeed.release();
- waitNewClockForSpeed2.release();
- #endif
- writeFull.release();
- pauseMutex.release();
- // useless because stopIt will close all thread, but if thread not runing run it
- //endIsDetected();
- emit internalStartClose();
- isOpen.acquire();
- if(!file.fileName().isEmpty())
- resumeNotStarted();
- //disconnect(this);//-> do into ~TransferThread()
- quit();
- wait();
-}
-
-void WriteThread::run()
-{
- connect(this,&WriteThread::internalStartOpen, this,&WriteThread::internalOpen, Qt::QueuedConnection);
- connect(this,&WriteThread::internalStartReopen, this,&WriteThread::internalReopen, Qt::QueuedConnection);
- connect(this,&WriteThread::internalStartWrite, this,&WriteThread::internalWrite, Qt::QueuedConnection);
- connect(this,&WriteThread::internalStartClose, this,&WriteThread::internalCloseSlot, Qt::QueuedConnection);
- connect(this,&WriteThread::internalStartEndOfFile, this,&WriteThread::internalEndOfFile, Qt::QueuedConnection);
- connect(this,&WriteThread::internalStartFlushAndSeekToZero, this,&WriteThread::internalFlushAndSeekToZero, Qt::QueuedConnection);
- connect(this,&WriteThread::internalStartChecksum, this,&WriteThread::checkSum, Qt::QueuedConnection);
- exec();
-}
-
-bool WriteThread::internalOpen()
-{
- //do a bug
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] internalOpen destination: "+file.fileName().toStdString());
- if(stopIt)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
- emit closed();
- return false;
- }
- if(file.isOpen())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] already open! destination: "+file.fileName().toStdString());
- return false;
- }
- if(file.fileName().isEmpty())
- {
- errorString_internal=tr("Path resolution error (Empty path)").toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
- emit error();
- return false;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] before the mutex");
- //set to LISTBLOCKSIZE
- if(sequential)
- {
- while(writeFull.available()<1)
- writeFull.release();
- if(writeFull.available()>1)
- writeFull.acquire(writeFull.available()-1);
- }
- else
- {
- while(writeFull.available()<numberOfBlock)
- writeFull.release();
- if(writeFull.available()>numberOfBlock)
- writeFull.acquire(writeFull.available()-numberOfBlock);
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the mutex");
- stopIt=false;
- endDetected=false;
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=InodeOperation;
- #endif
- //mkpath check if exists and return true if already exists
- QFileInfo destinationInfo(file);
- QDir destinationFolder;
- {
- mkpathTransfer->acquire();
- if(!destinationFolder.exists(destinationInfo.absolutePath()))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] Try create the path: "+
- destinationInfo.absolutePath().toStdString());
- if(!destinationFolder.mkpath(destinationInfo.absolutePath()))
- {
- if(!destinationFolder.exists(destinationInfo.absolutePath()))
- {
- /// \todo do real folder error here
- errorString_internal="mkpath error on destination";
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable create the folder: %1, error: %2")
- .arg(destinationInfo.absolutePath())
- .arg(QString::fromStdString(errorString_internal))
- .toStdString());
- emit error();
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
- #endif
- mkpathTransfer->release();
- return false;
- }
- }
- }
- mkpathTransfer->release();
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the mkpath");
- if(stopIt)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
- emit closed();
- return false;
- }
- //try open it
- QIODevice::OpenMode flags=QIODevice::ReadWrite;
- if(!buffer)
- flags|=QIODevice::Unbuffered;
- {
- QMutexLocker lock_mutex(&writeFileListMutex);
- if(writeFileList.count(file.fileName(),this)==0)
- {
- writeFileList.insert(file.fileName(),this);
- if(writeFileList.count(file.fileName())>1)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] in waiting because same file is found");
- return false;
- }
- }
- }
- bool fileWasExists=file.exists();
- if(file.open(flags))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the open");
- {
- QMutexLocker lock_mutex(&accessList);
- if(!theBlockList.isEmpty())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] General file corruption detected");
- stopIt=true;
- file.close();
- resumeNotStarted();
- file.setFileName(QStringLiteral(""));
- return false;
- }
- }
- pauseMutex.tryAcquire(pauseMutex.available());
- #ifdef Q_OS_LINUX
- const int intfd=file.handle();
- if(intfd!=-1)
- posix_fadvise(intfd, 0, 0, POSIX_FADV_SEQUENTIAL);
- #endif
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] after the pause mutex");
- if(stopIt)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
- file.close();
- resumeNotStarted();
- file.setFileName(QStringLiteral(""));
- emit closed();
- return false;
- }
- if(!file.seek(0))
- {
- file.close();
- resumeNotStarted();
- file.setFileName(QStringLiteral(""));
- errorString_internal=file.errorString().toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to seek after open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
- emit error();
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
- #endif
- return false;
- }
- if(stopIt)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
- file.close();
- resumeNotStarted();
- file.setFileName(QStringLiteral(""));
- emit closed();
- return false;
- }
- if(!file.resize(startSize))
- {
- file.close();
- resumeNotStarted();
- file.setFileName(QStringLiteral(""));
- errorString_internal=file.errorString().toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to resize to %1 after open: %2, error: %3").arg(startSize).arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
- emit error();
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
- #endif
- return false;
- }
- if(stopIt)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
- file.close();
- resumeNotStarted();
- file.setFileName(QStringLiteral(""));
- emit closed();
- return false;
- }
- isOpen.acquire();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit opened()");
- emit opened();
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
- #endif
- needRemoveTheFile=false;
- postOperationRequested=false;
- return true;
- }
- else
- {
- if(!fileWasExists && file.exists())
- if(!file.remove())
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] file created but can't be removed");
- if(stopIt)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close because stopIt is at true");
- resumeNotStarted();
- file.setFileName(QStringLiteral(""));
- emit closed();
- return false;
- }
- errorString_internal=file.errorString().toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
- emit error();
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
- #endif
- return false;
- }
-}
-
-void WriteThread::open(const QFileInfo &file,const uint64_t &startSize,const bool &buffer,const int &numberOfBlock,const bool &sequential)
-{
- if(!isRunning())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] the thread not running to open destination: "+file.absoluteFilePath().toStdString()+", numberOfBlock: "+std::to_string(numberOfBlock));
- errorString_internal=tr("Internal error, please report it!").toStdString();
- emit error();
- return;
- }
- if(this->file.isOpen())
- {
- if(file.absoluteFilePath()==this->file.fileName())
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] Try reopen already opened same file: "+file.absoluteFilePath().toStdString());
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] previous file is already open: "+file.absoluteFilePath().toStdString());
- emit internalStartClose();
- isOpen.acquire();
- isOpen.release();
- }
- if(numberOfBlock<1 || (numberOfBlock>ULTRACOPIER_PLUGIN_MAX_PARALLEL_NUMBER_OF_BLOCK && numberOfBlock>ULTRACOPIER_PLUGIN_MAX_SEQUENTIAL_NUMBER_OF_BLOCK))
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] numberOfBlock wrong, set to default");
- this->numberOfBlock=ULTRACOPIER_PLUGIN_DEFAULT_PARALLEL_NUMBER_OF_BLOCK;
- }
- else
- this->numberOfBlock=numberOfBlock;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] "+QStringLiteral("open destination: %1, sequential: %2").arg(file.absoluteFilePath()).arg(sequential).toStdString());
- stopIt=false;
- fakeMode=false;
- lastGoodPosition=0;
- this->file.setFileName(file.absoluteFilePath());
- this->startSize=startSize;
- this->buffer=buffer;
- this->sequential=sequential;
- endDetected=false;
- writeFullBlocked=false;
- emit internalStartOpen();
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- numberOfBlockCopied=0;
- #endif
-}
-
-void WriteThread::endIsDetected()
-{
- if(endDetected)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] double event dropped");
- return;
- }
- endDetected=true;
- pauseMutex.release();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- emit internalStartEndOfFile();
-}
-
-std::string WriteThread::errorString() const
-{
- return errorString_internal;
-}
-
-void WriteThread::stop()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop()");
- needRemoveTheFile=true;
- stopIt=true;
- if(isOpen.available()>0)
- return;
- writeFull.release();
- pauseMutex.release();
- pauseMutex.release();
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- waitNewClockForSpeed.release();
- waitNewClockForSpeed2.release();
- #endif
- // useless because stopIt will close all thread, but if thread not runing run it
- endIsDetected();
- //for the stop for skip: void TransferThread::skip()
- emit internalStartClose();
-}
-
-void WriteThread::flushBuffer()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- writeFull.release();
- writeFull.acquire();
- pauseMutex.release();
- {
- QMutexLocker lock_mutex(&accessList);
- theBlockList.clear();
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop");
-}
-
-/// \brief buffer is empty
-bool WriteThread::bufferIsEmpty()
-{
- bool returnVal;
- {
- QMutexLocker lock_mutex(&accessList);
- returnVal=theBlockList.isEmpty();
- }
- return returnVal;
-}
-
-void WriteThread::internalEndOfFile()
-{
- if(!bufferIsEmpty())
- {
- if(sequential)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start the write");
- emit internalStartWrite();
- }
- else
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] buffer is not empty!");
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] writeIsStopped");
- emit writeIsStopped();
- }
-}
-
-#ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
-/*! \brief Set the max speed
-\param tempMaxSpeed Set the max speed in KB/s, 0 for no limit */
-void WriteThread::setMultiForBigSpeed(const int &multiForBigSpeed)
-{
- this->multiForBigSpeed=multiForBigSpeed;
- waitNewClockForSpeed.release();
- waitNewClockForSpeed2.release();
-}
-
-/// \brief For give timer every X ms
-void WriteThread::timeOfTheBlockCopyFinished()
-{
- /* this is the old way to limit the speed, it product blocking
- *if(waitNewClockForSpeed.available()<ULTRACOPIER_PLUGIN_NUMSEMSPEEDMANAGEMENT)
- waitNewClockForSpeed.release();*/
-
- //try this new way:
- /* only if speed limited, else will accumulate waitNewClockForSpeed
- * Disabled because: Stop call of this method when no speed limit
- if(this->maxSpeed>0)*/
- if(waitNewClockForSpeed.available()<=1)
- waitNewClockForSpeed.release();
- if(waitNewClockForSpeed2.available()<=1)
- waitNewClockForSpeed2.release();
-}
-#endif
-
-void WriteThread::resumeNotStarted()
-{
- QMutexLocker lock_mutex(&writeFileListMutex);
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- if(!writeFileList.contains(file.fileName()))
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] file: \""+file.fileName().toStdString()+"\" for similar inode is not located into the list of "+std::to_string(writeFileList.size())+" items!");
- #endif
- writeFileList.remove(file.fileName(),this);
- if(writeFileList.contains(file.fileName()))
- {
- QList<WriteThread *> writeList=writeFileList.values(file.fileName());
- if(!writeList.isEmpty())
- writeList.first()->reemitStartOpen();
- return;
- }
-}
-
-void WriteThread::pause()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] try put read thread in pause");
- pauseMutex.tryAcquire(pauseMutex.available());
- putInPause=true;
- return;
-}
-
-void WriteThread::resume()
-{
- if(putInPause)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- putInPause=false;
- stopIt=false;
- }
- else
- return;
- if(!file.isOpen())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] file is not open");
- return;
- }
- pauseMutex.release();
-}
-
-void WriteThread::reemitStartOpen()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] start");
- emit internalStartOpen();
-}
-
-void WriteThread::postOperation()
-{
- if(postOperationRequested)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Critical,"["+std::to_string(id)+"] double event dropped");
- return;
- }
- postOperationRequested=true;
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- emit internalStartClose();
-}
-
-void WriteThread::internalCloseSlot()
-{
- internalClose();
-}
-
-void WriteThread::internalClose(bool emitSignal)
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] close for file: "+file.fileName().toStdString());
- /// \note never send signal here, because it's called by the destructor
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Close;
- #endif
- bool emit_closed=false;
- if(!fakeMode)
- {
- if(file.isOpen())
- {
- if(!needRemoveTheFile)
- {
- if(startSize!=lastGoodPosition)
- if(!file.resize(lastGoodPosition))
- {
- if(emitSignal)
- {
- errorString_internal=file.errorString().toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to seek after open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
- emit error();
- }
- else
- needRemoveTheFile=true;
- }
- }
- file.close();
- if(needRemoveTheFile || stopIt)
- {
- if(deletePartiallyTransferredFiles)
- {
- if(!file.remove())
- if(emitSignal)
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] unable to remove the destination file");
- }
- }
- //here and not after, because the transferThread don't need try close if not open
- if(emitSignal)
- emit_closed=true;
- }
- }
- else
- {
- //here and not after, because the transferThread don't need try close if not open
-
- if(emitSignal)
- emit_closed=true;
- }
- needRemoveTheFile=false;
- resumeNotStarted();
- //warning: file.setFileName(""); need be after resumeNotStarted()
- file.setFileName(QStringLiteral(""));
- if(emit_closed)
- emit closed();
-
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
- #endif
-
- /// \note always the last of this function
- if(!fakeMode)
- isOpen.release();
-}
-
-void WriteThread::internalReopen()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- QString tempFile=file.fileName();
- internalClose(false);
- flushBuffer();
- stopIt=false;
- lastGoodPosition=0;
- file.setFileName(tempFile);
- if(internalOpen())
- emit reopened();
-}
-
-void WriteThread::reopen()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] start");
- stopIt=true;
- endDetected=false;
- 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;
- postOperationRequested=false;
- emit opened();
-}
-
-/// \brief do the fake writeIsStarted
-void WriteThread::fakeWriteIsStarted()
-{
- emit writeIsStarted();
-}
-
-/// \brief do the fake writeIsStopped
-void WriteThread::fakeWriteIsStopped()
-{
- emit writeIsStopped();
-}
-
-/// do the checksum
-void WriteThread::startCheckSum()
-{
- emit internalStartChecksum();
-}
-
-/** \brief set block size
-\param block the new block size in B
-\return Return true if succes */
-bool WriteThread::setBlockSize(const int blockSize)
-{
- //can be smaller than min block size to do correct speed limitation
- if(blockSize>1 && blockSize<ULTRACOPIER_PLUGIN_MAX_BLOCK_SIZE*1024)
- {
- this->blockSize=blockSize;
- return true;
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"block size out of range: "+std::to_string(blockSize));
- return false;
- }
-}
-
-/// \brief get the last good position
-int64_t WriteThread::getLastGoodPosition() const
-{
- return lastGoodPosition;
-}
-
-void WriteThread::flushAndSeekToZero()
-{
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"flushAndSeekToZero: "+std::to_string(blockSize));
- stopIt=true;
- emit internalStartFlushAndSeekToZero();
-}
-
-
-void WriteThread::checkSum()
-{
- //QByteArray blockArray;
- QCryptographicHash hash(QCryptographicHash::Sha1);
- endDetected=false;
- lastGoodPosition=0;
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- numberOfBlockCopied=0;
- #endif
- if(!file.seek(0))
- {
- errorString_internal=file.errorString().toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to seek after open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
- emit error();
- return;
- }
- int sizeReaden=0;
- do
- {
- if(putInPause)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+"] write put in pause");
- if(stopIt)
- return;
- pauseMutex.acquire();
- if(stopIt)
- return;
- }
- //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: ").toStdString()+file.errorString().toStdString()+" ("+std::to_string(file.error())+")";
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("file.error()!=QFile::NoError: %1, error: %2").arg(QString::number(file.error())).arg(QString::fromStdString(errorString_internal)).toStdString());
- emit error();
- return;
- }
- sizeReaden=blockArray.size();
- if(sizeReaden>0)
- {
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Checksum;
- #endif
- hash.addData(blockArray);
- #ifdef ULTRACOPIER_PLUGIN_DEBUG
- stat=Idle;
- #endif
-
- if(stopIt)
- break;
-
- lastGoodPosition+=blockArray.size();
- }
- }
- while(sizeReaden>0 && !stopIt);
- if(lastGoodPosition>(quint64)file.size())
- {
- errorString_internal=tr("File truncated during read, possible data change").toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Source truncated during the read: %1 (%2)").arg(file.errorString()).arg(QString::number(file.error())).toStdString());
- emit error();
- return;
- }
- if(stopIt)
- {
-/* if(putInPause)
- emit isInPause();*/
- stopIt=false;
- return;
- }
- emit checksumFinish(hash.result());
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] stop the read");
-}
-
-void WriteThread::internalFlushAndSeekToZero()
-{
- flushBuffer();
- if(!file.seek(0))
- {
- errorString_internal=file.errorString().toStdString();
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Unable to seek after open: %1, error: %2").arg(file.fileName()).arg(QString::fromStdString(errorString_internal)).toStdString());
- emit error();
- return;
- }
- stopIt=false;
- emit flushedAndSeekedToZero();
-}
-
-void WriteThread::setMkpathTransfer(QSemaphore *mkpathTransfer)
-{
- this->mkpathTransfer=mkpathTransfer;
-}
-
-void WriteThread::setDeletePartiallyTransferredFiles(const bool &deletePartiallyTransferredFiles)
-{
- this->deletePartiallyTransferredFiles=deletePartiallyTransferredFiles;
-}
-
-bool WriteThread::write(const QByteArray &data)
-{
- if(stopIt)
- return false;
- bool atMax;
- if(sequential)
- {
- if(stopIt)
- return false;
- {
- QMutexLocker lock_mutex(&accessList);
- theBlockList.append(data);
- atMax=(theBlockList.size()>=numberOfBlock);
- }
- if(atMax)
- emit internalStartWrite();
- }
- else
- {
- if(stopIt)
- return false;
- {
- QMutexLocker lock_mutex(&accessList);
- theBlockList.append(data);
- atMax=(theBlockList.size()>=numberOfBlock);
- }
- emit internalStartWrite();
- }
- if(atMax)
- {
- writeFullBlocked=true;
- writeFull.acquire();
- writeFullBlocked=false;
- }
- if(stopIt)
- return false;
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- //wait for limitation speed if stop not query
- if(multiForBigSpeed>0)
- {
- if(sequential)
- {
- numberOfBlockCopied++;
- if(numberOfBlockCopied>=(multiForBigSpeed*2))
- {
- numberOfBlockCopied=0;
- waitNewClockForSpeed.acquire();
- }
- }
- else
- {
- numberOfBlockCopied2++;
- if(numberOfBlockCopied2>=multiForBigSpeed)
- {
- numberOfBlockCopied2=0;
- waitNewClockForSpeed2.acquire();
- }
- }
- }
- #endif
- if(stopIt)
- return false;
- return true;
-}
-
-void WriteThread::internalWrite()
-{
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- if(sequential)
- {
- multiForBigSpeed=0;
- QMutexLocker lock_mutex(&accessList);
- if(theBlockList.size()<numberOfBlock && !endDetected)
- return;
- }
- #endif
- bool haveBlock;
- do
- {
- if(putInPause)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Information,"["+std::to_string(id)+"] write put in pause");
- if(stopIt)
- return;
- pauseMutex.acquire();
- if(stopIt)
- return;
- }
- if(stopIt)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] stopIt");
- return;
- }
- if(stopIt)
- return;
- //read one block
- {
- QMutexLocker lock_mutex(&accessList);
- if(theBlockList.isEmpty())
- haveBlock=false;
- else
- {
- blockArray=theBlockList.first();
- if(multiForBigSpeed>0)
- {
- if(blockArray.size()==blockSize)
- {
- theBlockList.removeFirst();
- //if remove one block
- if(!sequential)
- writeFull.release();
- }
- else
- {
- blockArray.clear();
- while(blockArray.size()!=blockSize)
- {
- //if larger
- if(theBlockList.first().size()>blockSize)
- {
- blockArray+=theBlockList.first().mid(0,blockSize);
- theBlockList.first().remove(0,blockSize);
- if(!sequential)
- {
- //do write in loop to finish the actual block
- emit internalStartWrite();
- }
- break;
- }
- //if smaller
- else
- {
- blockArray+=theBlockList.first();
- theBlockList.removeFirst();
- //if remove one block
- if(!sequential)
- writeFull.release();
- if(theBlockList.isEmpty())
- break;
- }
- }
- }
- //haveBlock=!blockArray.isEmpty();
- }
- else
- {
- theBlockList.removeFirst();
- //if remove one block
- if(!sequential)
- writeFull.release();
- }
- haveBlock=true;
- }
- }
- if(stopIt)
- return;
- if(!haveBlock)
- {
- if(sequential)
- {
- if(endDetected)
- internalEndOfFile();
- else
- writeFull.release();
- return;
- }
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] End detected of the file");
- return;
- }
- #ifdef ULTRACOPIER_PLUGIN_SPEED_SUPPORT
- //wait for limitation speed if stop not query
- if(multiForBigSpeed>0)
- {
- numberOfBlockCopied++;
- if(sequential || (!sequential && writeFullBlocked))
- {
- if(numberOfBlockCopied>=(multiForBigSpeed*2))
- {
- numberOfBlockCopied=0;
- waitNewClockForSpeed.acquire();
- if(stopIt)
- break;
- }
- }
- else
- {
- if(numberOfBlockCopied>=multiForBigSpeed)
- {
- numberOfBlockCopied=0;
- waitNewClockForSpeed.acquire();
- if(stopIt)
- break;
- }
- }
- }
- #endif
- 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(lastGoodPosition==0)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Notice,"["+std::to_string(id)+"] emit writeIsStarted()");
- emit writeIsStarted();
- }
- if(stopIt)
- return;
- if(file.error()!=QFile::NoError)
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Error in writing: %1 (%2)").arg(file.errorString()).arg(file.error()).toStdString());
- errorString_internal=QStringLiteral("Error in writing: %1 (%2)").arg(file.errorString()).arg(file.error()).toStdString();
- stopIt=true;
- emit error();
- return;
- }
- if(bytesWriten!=blockArray.size())
- {
- ULTRACOPIER_DEBUGCONSOLE(Ultracopier::DebugLevel_Warning,"["+std::to_string(id)+"] "+QStringLiteral("Error in writing, bytesWriten: %1, blockArray.size(): %2").arg(bytesWriten).arg(blockArray.size()).toStdString());
- errorString_internal=QStringLiteral("Error in writing, bytesWriten: %1, blockArray.size(): %2").arg(bytesWriten).arg(blockArray.size()).toStdString();
- stopIt=true;
- emit error();
- return;
- }
- lastGoodPosition+=bytesWriten;
- } while(sequential);
-}