summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Preud'homme <robotux@celest.fr>2013-03-21 11:01:59 +0100
committerThomas Preud'homme <robotux@celest.fr>2013-03-21 11:01:59 +0100
commite297dbd8052ef4e66f069e2dd1865ae7fa8af28e (patch)
tree342fea0a2f6f33b8b62dad2d1729f8209da1a1ba
parent8f9f382e1c97cab2e72e97495650c73ac4b97314 (diff)
Imported Upstream version 0.3.1.0
-rw-r--r--CliParser.cpp106
-rw-r--r--CliParser.h9
-rw-r--r--CompilerInfo.h2
-rw-r--r--CopyEngineManager.cpp19
-rw-r--r--CopyEngineManager.h1
-rwxr-xr-xCopyListener.cpp75
-rwxr-xr-xCopyListener.h8
-rwxr-xr-x[-rw-r--r--]Core.cpp330
-rw-r--r--Core.h74
-rw-r--r--DebugEngine.h2
-rw-r--r--EventDispatcher.cpp50
-rw-r--r--EventDispatcher.h2
-rw-r--r--FacilityEngine.cpp86
-rw-r--r--FacilityEngine.h17
-rw-r--r--HelpDialog.cpp5
-rw-r--r--HelpDialog.ui6
-rwxr-xr-xLanguagesManager.cpp15
-rw-r--r--LanguagesManager.h1
-rw-r--r--LocalListener.cpp19
-rw-r--r--LocalListener.h7
-rw-r--r--LogThread.cpp2
-rwxr-xr-xOptionDialog.cpp337
-rwxr-xr-xOptionDialog.h15
-rw-r--r--OptionDialog.ui157
-rw-r--r--OptionEngine.cpp181
-rw-r--r--OptionEngine.h10
-rwxr-xr-xPluginLoader.cpp28
-rwxr-xr-xPluginLoader.h8
-rw-r--r--PluginsManager.cpp38
-rw-r--r--PluginsManager.h5
-rw-r--r--README21
-rw-r--r--README.sources32
-rw-r--r--ResourcesManager.cpp5
-rw-r--r--SessionLoader.cpp28
-rw-r--r--SessionLoader.h10
-rw-r--r--StructEnumDefinition.h14
-rw-r--r--SystrayIcon.cpp90
-rw-r--r--SystrayIcon.h28
-rw-r--r--ThemesManager.cpp141
-rw-r--r--ThemesManager.h3
-rw-r--r--Variable.h10
-rw-r--r--interface/FacilityInterface.h2
-rw-r--r--interface/PluginInterface_CopyEngine.h14
-rw-r--r--interface/PluginInterface_Listener.h6
-rw-r--r--interface/PluginInterface_PluginLoader.h7
-rw-r--r--interface/PluginInterface_SessionLoader.h7
-rw-r--r--interface/PluginInterface_Themes.h2
-rw-r--r--patch/comercial/rsync-copy-engine.patch902
-rw-r--r--patch/opensource/KDE-Ultracopier.patch290
-rw-r--r--patch/opensource/options-with-pass.patch336
-rw-r--r--plugins-alternative/CopyEngine/Rsync/AvancedQFile.cpp94
-rw-r--r--plugins-alternative/CopyEngine/Rsync/AvancedQFile.h32
-rw-r--r--plugins-alternative/CopyEngine/Rsync/CompilerInfo.h1
-rw-r--r--plugins-alternative/CopyEngine/Rsync/DebugEngineMacro.h25
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Environment.h12
-rw-r--r--plugins-alternative/CopyEngine/Rsync/FilterRules.cpp193
-rw-r--r--plugins-alternative/CopyEngine/Rsync/FilterRules.h46
-rw-r--r--plugins-alternative/CopyEngine/Rsync/FilterRules.ui162
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Filters.cpp456
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Filters.h44
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Filters.ui194
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/ar/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/de/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/el/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/es/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/fr/translation.ts810
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/hi/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/id/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/it/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/ja/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/ko/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/nl/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/no/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/pl/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/pt/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/ru/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/th/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/tr/translation.ts806
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Languages/zh/translation.ts806
-rwxr-xr-xplugins-alternative/CopyEngine/Rsync/ListThread.cpp1720
-rwxr-xr-xplugins-alternative/CopyEngine/Rsync/ListThread.h376
-rw-r--r--plugins-alternative/CopyEngine/Rsync/ListThread_InodeAction.cpp66
-rw-r--r--plugins-alternative/CopyEngine/Rsync/MkPath.cpp100
-rw-r--r--plugins-alternative/CopyEngine/Rsync/MkPath.h56
-rw-r--r--plugins-alternative/CopyEngine/Rsync/ReadThread.cpp597
-rw-r--r--plugins-alternative/CopyEngine/Rsync/ReadThread.h144
-rw-r--r--plugins-alternative/CopyEngine/Rsync/RenamingRules.cpp85
-rw-r--r--plugins-alternative/CopyEngine/Rsync/RenamingRules.h34
-rw-r--r--plugins-alternative/CopyEngine/Rsync/RenamingRules.ui129
-rw-r--r--plugins-alternative/CopyEngine/Rsync/RmPath.cpp179
-rw-r--r--plugins-alternative/CopyEngine/Rsync/RmPath.h58
-rw-r--r--plugins-alternative/CopyEngine/Rsync/StructEnumDefinition.h1
-rw-r--r--plugins-alternative/CopyEngine/Rsync/StructEnumDefinition_CopyEngine.h90
-rw-r--r--plugins-alternative/CopyEngine/Rsync/TransferThread.cpp1252
-rw-r--r--plugins-alternative/CopyEngine/Rsync/TransferThread.h221
-rw-r--r--plugins-alternative/CopyEngine/Rsync/Variable.h35
-rw-r--r--plugins-alternative/CopyEngine/Rsync/WriteThread.cpp508
-rw-r--r--plugins-alternative/CopyEngine/Rsync/WriteThread.h138
-rw-r--r--plugins-alternative/CopyEngine/Rsync/copyEngine-collision-and-error.cpp565
-rwxr-xr-xplugins-alternative/CopyEngine/Rsync/copyEngine.cpp819
-rwxr-xr-xplugins-alternative/CopyEngine/Rsync/copyEngine.h362
-rw-r--r--plugins-alternative/CopyEngine/Rsync/copyEngine.pro82
-rw-r--r--plugins-alternative/CopyEngine/Rsync/debugDialog.cpp70
-rw-r--r--plugins-alternative/CopyEngine/Rsync/debugDialog.h40
-rw-r--r--plugins-alternative/CopyEngine/Rsync/debugDialog.ui100
-rwxr-xr-xplugins-alternative/CopyEngine/Rsync/documentation.dox42
-rw-r--r--plugins-alternative/CopyEngine/Rsync/factory.cpp420
-rw-r--r--plugins-alternative/CopyEngine/Rsync/factory.h96
-rw-r--r--plugins-alternative/CopyEngine/Rsync/fileErrorDialog.cpp95
-rw-r--r--plugins-alternative/CopyEngine/Rsync/fileErrorDialog.h45
-rw-r--r--plugins-alternative/CopyEngine/Rsync/fileErrorDialog.ui220
-rw-r--r--plugins-alternative/CopyEngine/Rsync/fileExistsDialog.cpp189
-rw-r--r--plugins-alternative/CopyEngine/Rsync/fileExistsDialog.h58
-rw-r--r--plugins-alternative/CopyEngine/Rsync/fileExistsDialog.ui367
-rw-r--r--plugins-alternative/CopyEngine/Rsync/fileIsSameDialog.cpp156
-rw-r--r--plugins-alternative/CopyEngine/Rsync/fileIsSameDialog.h56
-rw-r--r--plugins-alternative/CopyEngine/Rsync/fileIsSameDialog.ui192
-rw-r--r--plugins-alternative/CopyEngine/Rsync/folderExistsDialog.cpp143
-rw-r--r--plugins-alternative/CopyEngine/Rsync/folderExistsDialog.h54
-rw-r--r--plugins-alternative/CopyEngine/Rsync/folderExistsDialog.ui282
-rw-r--r--plugins-alternative/CopyEngine/Rsync/informations.xml27
-rw-r--r--plugins-alternative/CopyEngine/Rsync/options.ui328
-rw-r--r--plugins-alternative/CopyEngine/Rsync/resources.qrc8
-rw-r--r--plugins-alternative/CopyEngine/Rsync/resources/add.pngbin0 -> 564 bytes
-rw-r--r--plugins-alternative/CopyEngine/Rsync/resources/edit.pngbin0 -> 563 bytes
-rw-r--r--plugins-alternative/CopyEngine/Rsync/resources/filter.pngbin0 -> 429 bytes
-rw-r--r--plugins-alternative/CopyEngine/Rsync/resources/remove.pngbin0 -> 722 bytes
-rw-r--r--plugins-alternative/CopyEngine/Rsync/scanFileOrFolder.cpp511
-rw-r--r--plugins-alternative/CopyEngine/Rsync/scanFileOrFolder.h91
-rw-r--r--plugins-alternative/Themes/Clean/Languages/ar/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/ar/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/Languages/de/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/de/translation.ts63
-rw-r--r--plugins-alternative/Themes/Clean/Languages/el/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/el/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/Languages/es/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/es/translation.ts63
-rw-r--r--plugins-alternative/Themes/Clean/Languages/fr/translation.qmbin1268 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/fr/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/Languages/hi/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/hi/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/Languages/id/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/id/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/Languages/it/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/it/translation.ts63
-rw-r--r--plugins-alternative/Themes/Clean/Languages/ja/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/ja/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/Languages/ko/translation.ts55
-rw-r--r--plugins-alternative/Themes/Clean/Languages/nl/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/nl/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/Languages/no/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/no/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/Languages/pl/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/pl/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/Languages/ru/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/ru/translation.ts63
-rw-r--r--plugins-alternative/Themes/Clean/Languages/th/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/th/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/Languages/tr/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/tr/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/Languages/zh/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Clean/Languages/zh/translation.ts43
-rw-r--r--plugins-alternative/Themes/Clean/informations.xml6
-rw-r--r--plugins-alternative/Themes/Clean/interface.cpp8
-rw-r--r--plugins-alternative/Themes/Clean/interface.h21
-rw-r--r--plugins-alternative/Themes/Clean/interface.pro9
-rw-r--r--plugins-alternative/Themes/Clean/interface.ui4
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/ar/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/ar/translation.ts52
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/de/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/de/translation.ts88
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/el/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/el/translation.ts52
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/es/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/es/translation.ts88
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/fr/translation.qmbin3356 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/fr/translation.ts54
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/hi/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/hi/translation.ts52
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/id/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/id/translation.ts52
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/it/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/it/translation.ts88
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/ja/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/ja/translation.ts52
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/ko/translation.ts93
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/nl/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/nl/translation.ts52
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/no/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/no/translation.ts52
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/pl/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/pl/translation.ts52
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/ru/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/ru/translation.ts88
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/th/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/th/translation.ts52
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/tr/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/tr/translation.ts52
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/zh/translation.qmbin327 -> 0 bytes
-rw-r--r--plugins-alternative/Themes/Teracopy/Languages/zh/translation.ts52
-rw-r--r--plugins-alternative/Themes/Teracopy/TransferModel.cpp441
-rw-r--r--plugins-alternative/Themes/Teracopy/TransferModel.h92
-rw-r--r--plugins-alternative/Themes/Teracopy/informations.xml6
-rw-r--r--plugins-alternative/Themes/Teracopy/interface.cpp208
-rw-r--r--plugins-alternative/Themes/Teracopy/interface.h11
-rw-r--r--plugins-alternative/Themes/Teracopy/interface.pro15
-rw-r--r--plugins-alternative/Themes/Teracopy/interface.ui23
-rw-r--r--plugins-alternative/Themes/Teracopy/resources/player_pause.pngbin0 -> 484 bytes
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/FilterRules.cpp193
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/FilterRules.h46
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/FilterRules.ui162
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Filters.cpp456
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Filters.h44
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Filters.ui194
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/ar/translation.ts570
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/de/translation.ts734
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/el/translation.ts570
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/es/translation.ts734
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/fr/translation.ts600
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/hi/translation.ts570
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/id/translation.ts570
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/it/translation.ts734
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/ja/translation.ts570
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/ko/translation.ts795
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/nl/translation.ts570
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/no/translation.ts570
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/pl/translation.ts570
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/pt/translation.ts570
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/ru/translation.ts734
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/th/translation.ts570
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/tr/translation.ts570
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Languages/zh/translation.ts570
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-0.3/ListThread.cpp490
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-0.3/ListThread.h58
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/ListThread_InodeAction.cpp4
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/ReadThread.cpp100
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/ReadThread.h17
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/RenamingRules.cpp85
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/RenamingRules.h34
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/RenamingRules.ui129
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/RmPath.cpp2
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/StructEnumDefinition_CopyEngine.h39
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/TransferThread.cpp422
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/TransferThread.h38
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/Variable.h2
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/WriteThread.cpp182
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/WriteThread.h28
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/copyEngine-collision-and-error.cpp6
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-0.3/copyEngine.cpp454
-rwxr-xr-x[-rw-r--r--]plugins/CopyEngine/Ultracopier-0.3/copyEngine.h98
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/copyEngine.pro28
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/factory.cpp188
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/factory.h14
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileErrorDialog.cpp33
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.cpp39
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileExistsDialog.h4
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.cpp39
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/fileIsSameDialog.h5
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.cpp51
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/folderExistsDialog.h6
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/informations.xml6
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/options.ui243
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/resources.qrc8
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/resources/add.pngbin0 -> 564 bytes
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/resources/edit.pngbin0 -> 563 bytes
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/resources/filter.pngbin0 -> 429 bytes
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/resources/remove.pngbin0 -> 722 bytes
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/scanFileOrFolder.cpp293
-rw-r--r--plugins/CopyEngine/Ultracopier-0.3/scanFileOrFolder.h18
-rw-r--r--plugins/Languages/ar/informations.xml2
-rw-r--r--plugins/Languages/ar/translation.ts698
-rw-r--r--plugins/Languages/de/informations.xml2
-rw-r--r--plugins/Languages/de/translation.ts988
-rw-r--r--plugins/Languages/el/informations.xml2
-rw-r--r--plugins/Languages/el/translation.ts698
-rw-r--r--plugins/Languages/es/informations.xml2
-rw-r--r--plugins/Languages/es/translation.ts762
-rw-r--r--plugins/Languages/fr/informations.xml4
-rw-r--r--plugins/Languages/fr/translation.ts720
-rw-r--r--plugins/Languages/hi/informations.xml2
-rw-r--r--plugins/Languages/hi/translation.ts698
-rw-r--r--plugins/Languages/id/informations.xml2
-rw-r--r--plugins/Languages/id/translation.ts698
-rw-r--r--plugins/Languages/it/informations.xml2
-rw-r--r--plugins/Languages/it/translation.ts827
-rw-r--r--plugins/Languages/ja/informations.xml2
-rw-r--r--plugins/Languages/ja/translation.ts721
-rw-r--r--plugins/Languages/ko/flag.pngbin0 -> 744 bytes
-rw-r--r--plugins/Languages/ko/informations.xml31
-rw-r--r--plugins/Languages/ko/translation.ts1147
-rw-r--r--plugins/Languages/nl/informations.xml2
-rw-r--r--plugins/Languages/nl/translation.ts698
-rw-r--r--plugins/Languages/no/informations.xml2
-rw-r--r--plugins/Languages/no/translation.ts698
-rw-r--r--plugins/Languages/pl/informations.xml2
-rw-r--r--plugins/Languages/pl/translation.ts698
-rw-r--r--plugins/Languages/pt/informations.xml2
-rw-r--r--plugins/Languages/pt/translation.ts698
-rw-r--r--plugins/Languages/ru/informations.xml2
-rw-r--r--plugins/Languages/ru/translation.ts992
-rw-r--r--plugins/Languages/th/informations.xml2
-rw-r--r--plugins/Languages/th/translation.ts698
-rw-r--r--plugins/Languages/tr/informations.xml2
-rw-r--r--plugins/Languages/tr/translation.ts698
-rw-r--r--plugins/Languages/zh/informations.xml2
-rw-r--r--plugins/Languages/zh/translation.ts721
-rw-r--r--plugins/Listener/catchcopy-v0002/informations.xml6
-rwxr-xr-xplugins/Listener/catchcopy-v0002/listener.cpp11
-rwxr-xr-xplugins/Listener/catchcopy-v0002/listener.h4
-rw-r--r--plugins/Listener/catchcopy-v0002/listener.pro2
-rw-r--r--plugins/Listener/dbus/Catchcopy.cpp15
-rw-r--r--plugins/Listener/dbus/Catchcopy.h20
-rw-r--r--plugins/Listener/dbus/DebugEngineMacro.h25
-rw-r--r--plugins/Listener/dbus/Environment.h11
-rw-r--r--plugins/Listener/dbus/StructEnumDefinition.h1
-rw-r--r--plugins/Listener/dbus/Variable.h16
-rwxr-xr-xplugins/Listener/dbus/documentation.dox33
-rw-r--r--plugins/Listener/dbus/informations.xml27
-rwxr-xr-xplugins/Listener/dbus/listener.cpp86
-rwxr-xr-xplugins/Listener/dbus/listener.h64
-rw-r--r--plugins/Listener/dbus/listener.pro14
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/ar/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/de/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/el/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/es/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/fr/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/hi/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/id/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/it/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/ja/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/ko/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/nl/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/no/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/pl/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/pt/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/ru/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/th/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/tr/translation.ts12
-rw-r--r--plugins/PluginLoader/catchcopy-v0002/Languages/zh/translation.ts12
-rwxr-xr-xplugins/PluginLoader/catchcopy-v0002/OptionsWidget.cpp39
-rwxr-xr-xplugins/PluginLoader/catchcopy-v0002/OptionsWidget.h30
-rwxr-xr-xplugins/PluginLoader/catchcopy-v0002/OptionsWidget.ui45
-rwxr-xr-xplugins/PluginLoader/catchcopy-v0002/informations.xml6
-rwxr-xr-xplugins/PluginLoader/catchcopy-v0002/pluginLoader.cpp207
-rwxr-xr-xplugins/PluginLoader/catchcopy-v0002/pluginLoader.h19
-rwxr-xr-xplugins/PluginLoader/catchcopy-v0002/pluginLoader.pro56
-rw-r--r--plugins/SessionLoader/KDE4/informations.xml6
-rw-r--r--plugins/SessionLoader/KDE4/sessionLoader.cpp19
-rw-r--r--plugins/SessionLoader/KDE4/sessionLoader.h7
-rw-r--r--plugins/SessionLoader/KDE4/sessionLoader.pro1
-rw-r--r--plugins/SessionLoader/Windows/informations.xml4
-rwxr-xr-xplugins/SessionLoader/Windows/sessionLoader.cpp11
-rwxr-xr-xplugins/SessionLoader/Windows/sessionLoader.h8
-rw-r--r--plugins/SessionLoader/Windows/sessionLoader.pro2
-rw-r--r--plugins/Themes/Oxygen/Languages/ar/translation.ts118
-rw-r--r--plugins/Themes/Oxygen/Languages/de/translation.ts186
-rw-r--r--plugins/Themes/Oxygen/Languages/el/translation.ts118
-rw-r--r--plugins/Themes/Oxygen/Languages/es/translation.ts190
-rw-r--r--plugins/Themes/Oxygen/Languages/fr/translation.ts122
-rw-r--r--plugins/Themes/Oxygen/Languages/hi/translation.ts118
-rw-r--r--plugins/Themes/Oxygen/Languages/id/translation.ts118
-rw-r--r--plugins/Themes/Oxygen/Languages/it/translation.ts190
-rw-r--r--plugins/Themes/Oxygen/Languages/ja/translation.ts112
-rw-r--r--plugins/Themes/Oxygen/Languages/ko/translation.ts200
-rw-r--r--plugins/Themes/Oxygen/Languages/nl/translation.ts118
-rw-r--r--plugins/Themes/Oxygen/Languages/no/translation.ts118
-rw-r--r--plugins/Themes/Oxygen/Languages/pl/translation.ts118
-rw-r--r--plugins/Themes/Oxygen/Languages/pt/translation.ts118
-rw-r--r--plugins/Themes/Oxygen/Languages/ru/translation.ts190
-rw-r--r--plugins/Themes/Oxygen/Languages/th/translation.ts118
-rw-r--r--plugins/Themes/Oxygen/Languages/tr/translation.ts118
-rw-r--r--plugins/Themes/Oxygen/Languages/zh/translation.ts112
-rw-r--r--plugins/Themes/Oxygen/TransferModel.cpp155
-rw-r--r--plugins/Themes/Oxygen/TransferModel.h18
-rw-r--r--plugins/Themes/Oxygen/factory.cpp24
-rw-r--r--plugins/Themes/Oxygen/factory.h4
-rw-r--r--plugins/Themes/Oxygen/informations.xml6
-rwxr-xr-xplugins/Themes/Oxygen/interface.cpp124
-rwxr-xr-xplugins/Themes/Oxygen/interface.h6
-rw-r--r--plugins/Themes/Oxygen/interface.pro9
-rw-r--r--plugins/Themes/Oxygen/interface.ui45
-rw-r--r--plugins/Themes/Oxygen/options.ui17
-rw-r--r--resources/options.pngbin0 -> 660 bytes
-rw-r--r--resources/resources-windows.rc19
-rw-r--r--resources/resources.qrc1
-rw-r--r--resources/ultracopier.exe.amd64.manifest14
-rw-r--r--resources/ultracopier.exe.x86.manifest14
-rw-r--r--ultracopier.pro7
388 files changed, 56193 insertions, 10396 deletions
diff --git a/CliParser.cpp b/CliParser.cpp
index ffd511d..13aeac1 100644
--- a/CliParser.cpp
+++ b/CliParser.cpp
@@ -7,12 +7,18 @@
#include "CliParser.h"
+#include <QDebug>
+
CliParser::CliParser(QObject *parent) :
QObject(parent)
{
}
-void CliParser::cli(const QStringList &ultracopierArguments,const bool &external)
+/** \brief method to parse the ultracopier arguments
+ \param ultracopierArguments the argument list
+ \param external true if the arguments come from other instance of ultracopier
+*/
+void CliParser::cli(const QStringList &ultracopierArguments,const bool &external,const bool &onlyCheck)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"ultracopierArguments: "+ultracopierArguments.join(";"));
if(ultracopierArguments.size()==1)
@@ -22,15 +28,73 @@ void CliParser::cli(const QStringList &ultracopierArguments,const bool &external
// else do nothing, is normal starting without arguements
return;
}
- if(ultracopierArguments.size()==2 && ultracopierArguments.last()=="quit" && external)
+ if(ultracopierArguments.size()==2)
{
- QCoreApplication::exit();
+ if(ultracopierArguments.last()=="quit" && external)
+ {
+ if(onlyCheck)
+ return;
+ QCoreApplication::exit();
+ return;
+ }
+ if(ultracopierArguments.last()=="--help")
+ {
+ showHelp(false);
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Command line not understand");
+ showHelp();
+ return;
+ }
+ if(ultracopierArguments.size()==3)
+ {
+ if(ultracopierArguments[1]=="Transfer-list")
+ {
+ if(onlyCheck)
+ return;
+ QFile transferFile(ultracopierArguments.last());
+ if(transferFile.open(QIODevice::ReadOnly))
+ {
+ QString content;
+ QByteArray data=transferFile.readLine(64);
+ if(data.size()<=0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Problem at the reading, or file size is null"));
+ QMessageBox::warning(NULL,tr("Warning"),tr("Problem at the reading, or file size is null"));
+ transferFile.close();
+ return;
+ }
+ content=QString::fromUtf8(data);
+ content.remove('\n');
+ QStringList transferListArguments=content.split(';');
+ if(transferListArguments.size()!=4 || transferListArguments[0]!="Ultracopier-0.3" || transferListArguments[1]!="Transfer-list")
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("This file is not supported transfer list"));
+ QMessageBox::warning(NULL,tr("Warning"),tr("This file is not supported transfer list"));
+ transferFile.close();
+ return;
+ }
+ transferFile.close();
+ emit newTransferList(transferListArguments[3],transferListArguments[2],ultracopierArguments.last());
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Unable to open the transfer list file: %1").arg(transferFile.errorString()));
+ QMessageBox::warning(NULL,tr("Warning"),tr("Unable to open the transfer list file"));
+ return;
+ }
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Command line not understand");
+ showHelp();
return;
}
if(ultracopierArguments.size()>3)
{
if(ultracopierArguments[1]=="Copy" || ultracopierArguments[1]=="cp")
{
+ if(onlyCheck)
+ return;
QStringList transferList=ultracopierArguments;
transferList.removeFirst();
transferList.removeFirst();
@@ -49,6 +113,8 @@ void CliParser::cli(const QStringList &ultracopierArguments,const bool &external
}
if(ultracopierArguments[1]=="Move" || ultracopierArguments[1]=="mv")
{
+ if(onlyCheck)
+ return;
QStringList transferList=ultracopierArguments;
transferList.removeFirst();
transferList.removeFirst();
@@ -66,8 +132,38 @@ void CliParser::cli(const QStringList &ultracopierArguments,const bool &external
return;
}
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Command line not understand");
- QMessageBox::warning(NULL,tr("Warning"),tr("Command line not understand"));
+ showHelp();
+ return;
}
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Command line not understand");
- QMessageBox::warning(NULL,tr("Warning"),tr("Command line not understand"));
+ showHelp();
+}
+
+/** \brief show the help
+ *\param incorrectArguments if the help is call because the arguments are wrong */
+void CliParser::showHelp(const bool &incorrectArguments)
+{
+ if(incorrectArguments)
+ qDebug() << "Incorrect arguments detected";
+ qDebug() << tr("The arguments possibles are:");
+ qDebug() << "--help : "+tr("To have this help");
+ qDebug() << "quit : "+tr("To quit the other instance running (if have)");
+ qDebug() << "Transfer-list [transfer list file] : "+tr("To pass transfer list to do");
+ qDebug() << "cp [source [source2]] [destination] : "+tr("To copy sources separated by space to destination. If destination is \"?\", ultracopier will ask it to the user");
+ qDebug() << "mv [source [source2]] [destination] : "+tr("Same as above, but with move");
+
+ QString message;
+ if(incorrectArguments)
+ message+="<b>"+tr("Command line not understand")+"</b><br />\n";
+ message+=+"<b></b>"+tr("The arguments possibles are:")+"\n<ul>";
+ message+="<li><b>--help</b> : "+tr("To have this help")+"</li>\n";
+ message+="<li><b>quit</b> : "+tr("To quit the other instance running (if have)")+"</li>\n";
+ message+="<li><b>Transfer-list [transfer list file]</b> : "+tr("To pass transfer list to do")+"</li>\n";
+ message+="<li><b>cp [source [source2]] [destination]</b> : "+tr("To copy sources separated by space to destination. If destination is \"?\", ultracopier will ask it to the user")+"</li>\n";
+ message+="<li><b>mv [source [source2]] [destination]</b> : "+tr("Same as above, but with move")+"</li>\n";
+ message+=+"</ul>";
+ if(incorrectArguments)
+ QMessageBox::warning(NULL,tr("Warning"),message);
+ else
+ QMessageBox::information(NULL,tr("Help"),message);
}
diff --git a/CliParser.h b/CliParser.h
index 92276c0..360f30e 100644
--- a/CliParser.h
+++ b/CliParser.h
@@ -11,6 +11,7 @@
#include <QObject>
#include <QMessageBox>
#include <QCoreApplication>
+#include <QFile>
#include "Environment.h"
@@ -25,7 +26,7 @@ public slots:
\param ultracopierArguments the argument list
\param external true if the arguments come from other instance of ultracopier
*/
- void cli(const QStringList &ultracopierArguments,const bool &external);
+ void cli(const QStringList &ultracopierArguments,const bool &external,const bool &onlyCheck);
signals:
/** new copy without destination have been pased by the CLI */
void newCopy(QStringList sources);
@@ -35,6 +36,12 @@ signals:
void newMove(QStringList sources);
/** new move with destination have been pased by the CLI */
void newMove(QStringList sources,QString destination);
+ /** new transfer list pased by the CLI */
+ void newTransferList(QString engine,QString mode,QString file);
+private:
+ /** \brief show the help
+ *\param incorrectArguments if the help is call because the arguments are wrong */
+ void showHelp(const bool &incorrectArguments=true);
};
#endif // CLIPARSER_H
diff --git a/CompilerInfo.h b/CompilerInfo.h
index 5209988..6cc079b 100644
--- a/CompilerInfo.h
+++ b/CompilerInfo.h
@@ -7,7 +7,7 @@
/// \def COMPILERINFO the string to identify the compiler
#if defined(Q_CC_GNU)
- #define COMPILERINFO QString("GCC build: ")+__DATE__+" "+__TIME__
+ #define COMPILERINFO QString("GCC %1.%2.%3 build: ").arg(__GNUC__).arg(__GNUC_MINOR__).arg(__GNUC_PATCHLEVEL__)+__DATE__+" "+__TIME__
#else
#if defined(__DATE__) && defined(__TIME__)
#define COMPILERINFO QString("Unknow compiler: ")+__DATE__+" "+__TIME__
diff --git a/CopyEngineManager.cpp b/CopyEngineManager.cpp
index 758d9b2..4808fc7 100644
--- a/CopyEngineManager.cpp
+++ b/CopyEngineManager.cpp
@@ -13,19 +13,20 @@
CopyEngineManager::CopyEngineManager(OptionDialog *optionDialog)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ connect(languages, SIGNAL(newLanguageLoaded(QString)), &facilityEngine,SLOT(retranslate()),Qt::DirectConnection);
this->optionDialog=optionDialog;
//setup the ui layout
plugins->lockPluginListEdition();
+ connect(this,SIGNAL(previouslyPluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
+ connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
+ connect(plugins,SIGNAL(onePluginWillBeRemoved(PluginsAvailable)), this,SLOT(onePluginWillBeRemoved(PluginsAvailable)),Qt::DirectConnection);
+ connect(plugins,SIGNAL(pluginListingIsfinish()), this,SLOT(allPluginIsloaded()),Qt::QueuedConnection);
QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_CopyEngine);
foreach(PluginsAvailable currentPlugin,list)
- onePluginAdded(currentPlugin);
- connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)));
- connect(plugins,SIGNAL(onePluginWillBeRemoved(PluginsAvailable)), this,SLOT(onePluginWillBeRemoved(PluginsAvailable)),Qt::DirectConnection);
- connect(plugins,SIGNAL(pluginListingIsfinish()), this,SLOT(allPluginIsloaded()));
+ emit previouslyPluginAdded(currentPlugin);
plugins->unlockPluginListEdition();
//load the options
isConnected=false;
- connect(languages, SIGNAL(newLanguageLoaded(QString)), &facilityEngine,SLOT(retranslate()));
}
void CopyEngineManager::onePluginAdded(const PluginsAvailable &plugin)
@@ -90,7 +91,7 @@ void CopyEngineManager::onePluginAdded(const PluginsAvailable &plugin)
newItem.canDoOnlyCopy=newItem.factory->canDoOnlyCopy();
newItem.type=newItem.factory->getCopyType();
newItem.transferListOperation=newItem.factory->getTransferListOperation();
- optionDialog->addCopyEngineWidget(newItem.name,newItem.optionsWidget);
+ optionDialog->addPluginOptionWidget(PluginType_CopyEngine,newItem.name,newItem.optionsWidget);
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"plugin: "+newItem.name+" loaded, send options");
//emit newCopyEngineOptions(plugin.path,newItem.name,newItem.optionsWidget);
pluginList << newItem;
@@ -130,7 +131,6 @@ void CopyEngineManager::onePluginWillBeUnloaded(const PluginsAvailable &plugin)
{
if(pluginList.at(index).path==plugin.path)
{
- optionDialog->removeCopyEngineWidget(pluginList.at(index).name);
delete pluginList.at(index).options;
delete pluginList.at(index).factory;
pluginList.at(index).pointer->unload();
@@ -210,6 +210,7 @@ CopyEngineManager::returnCopyEngine CopyEngineManager::getCopyEngine(const CopyM
int index=0;
while(index<pluginList.size())
{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("Check matching: %1").arg(pluginList.at(index).name));
if(pluginList.at(index).name==name)
{
if(mode==Move && pluginList.at(index).canDoOnlyCopy)
@@ -228,8 +229,8 @@ CopyEngineManager::returnCopyEngine CopyEngineManager::getCopyEngine(const CopyM
}
index++;
}
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Cannot find any engine with this name");
- QMessageBox::critical(NULL,tr("Warning"),tr("Cannot find any engine with this name"));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Cannot find any engine with this name: %1").arg(name));
+ QMessageBox::critical(NULL,tr("Warning"),tr("Cannot find any engine with this name: %1").arg(name));
temp.engine=NULL;
temp.type=File;
temp.canDoOnlyCopy=true;
diff --git a/CopyEngineManager.h b/CopyEngineManager.h
index afec5e5..1b3ce58 100644
--- a/CopyEngineManager.h
+++ b/CopyEngineManager.h
@@ -97,6 +97,7 @@ signals:
//void newCopyEngineOptions(QString,QString,QWidget *);
void addCopyEngine(QString name,bool canDoOnlyCopy);
void removeCopyEngine(QString name);
+ void previouslyPluginAdded(PluginsAvailable);
};
#endif // COPYENGINEMANAGER_H
diff --git a/CopyListener.cpp b/CopyListener.cpp
index 4387156..c648b97 100755
--- a/CopyListener.cpp
+++ b/CopyListener.cpp
@@ -7,11 +7,11 @@
#include "CopyListener.h"
-
-CopyListener::CopyListener(QObject *parent) :
- QObject(parent)
+CopyListener::CopyListener(OptionDialog *optionDialog)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ this->optionDialog=optionDialog;
+ pluginLoader=new PluginLoader(optionDialog);
//load the options
tryListen=false;
QList<QPair<QString, QVariant> > KeysList;
@@ -19,14 +19,15 @@ CopyListener::CopyListener(QObject *parent) :
options->addOptionGroup("CopyListener",KeysList);
plugins->lockPluginListEdition();
QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_Listener);
- foreach(PluginsAvailable currentPlugin,list)
- onePluginAdded(currentPlugin);
qRegisterMetaType<PluginsAvailable>("PluginsAvailable");
qRegisterMetaType<ListeningState>("ListeningState");
- connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)));
+ connect(this,SIGNAL(previouslyPluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
+ connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
connect(plugins,SIGNAL(onePluginWillBeRemoved(PluginsAvailable)), this,SLOT(onePluginWillBeRemoved(PluginsAvailable)),Qt::DirectConnection);
- connect(plugins,SIGNAL(pluginListingIsfinish()), this,SLOT(allPluginIsloaded()));
- connect(&pluginLoader,SIGNAL(pluginLoaderReady(CatchState,bool,bool)), this,SIGNAL(pluginLoaderReady(CatchState,bool,bool)));
+ connect(plugins,SIGNAL(pluginListingIsfinish()), this,SLOT(allPluginIsloaded()),Qt::QueuedConnection);
+ connect(pluginLoader,SIGNAL(pluginLoaderReady(CatchState,bool,bool)), this,SIGNAL(pluginLoaderReady(CatchState,bool,bool)));
+ foreach(PluginsAvailable currentPlugin,list)
+ emit previouslyPluginAdded(currentPlugin);
plugins->unlockPluginListEdition();
last_state=NotListening;
last_have_plugin=false;
@@ -39,6 +40,7 @@ CopyListener::~CopyListener()
QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_Listener);
foreach(PluginsAvailable currentPlugin,list)
onePluginWillBeRemoved(currentPlugin);
+ delete pluginLoader;
}
void CopyListener::resendState()
@@ -46,7 +48,7 @@ void CopyListener::resendState()
if(plugins->allPluginHaveBeenLoaded())
{
sendState(true);
- pluginLoader.resendState();
+ pluginLoader->resendState();
}
}
@@ -56,8 +58,8 @@ void CopyListener::onePluginAdded(const PluginsAvailable &plugin)
return;
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"try load: "+plugin.path+PluginsManager::getResolvedPluginName("listener"));
//setFileName
- QPluginLoader *pluginLoader=new QPluginLoader(plugin.path+PluginsManager::getResolvedPluginName("listener"));
- QObject *pluginInstance = pluginLoader->instance();
+ QPluginLoader *pluginOfPluginLoader=new QPluginLoader(plugin.path+PluginsManager::getResolvedPluginName("listener"));
+ QObject *pluginInstance = pluginOfPluginLoader->instance();
if(pluginInstance)
{
PluginInterface_Listener *listen = qobject_cast<PluginInterface_Listener *>(pluginInstance);
@@ -67,8 +69,8 @@ void CopyListener::onePluginAdded(const PluginsAvailable &plugin)
{
if(pluginList.at(index).listenInterface==listen)
{
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Plugin already found"));
- pluginLoader->unload();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Plugin already found %1 for %2").arg(pluginList.at(index).path).arg(plugin.path));
+ pluginOfPluginLoader->unload();
return;
}
index++;
@@ -85,12 +87,14 @@ void CopyListener::onePluginAdded(const PluginsAvailable &plugin)
connect(listen,SIGNAL(newMove(quint32,QStringList,QString)), this,SLOT(newPluginMove(quint32,QStringList,QString)));
PluginListener newPluginListener;
newPluginListener.listenInterface = listen;
- newPluginListener.pluginLoader = pluginLoader;
+ newPluginListener.pluginLoader = pluginOfPluginLoader;
newPluginListener.path = plugin.path+PluginsManager::getResolvedPluginName("listener");
newPluginListener.state = NotListening;
newPluginListener.inWaitOfReply = false;
newPluginListener.options=new LocalPluginOptions("Listener-"+plugin.name);
newPluginListener.listenInterface->setResources(newPluginListener.options,plugin.writablePath,plugin.path,ULTRACOPIER_VERSION_PORTABLE_BOOL);
+ optionDialog->addPluginOptionWidget(PluginType_Listener,plugin.name,newPluginListener.listenInterface->options());
+ connect(languages,SIGNAL(newLanguageLoaded(QString)),newPluginListener.listenInterface,SLOT(newLanguageLoaded()));
pluginList << newPluginListener;
connect(pluginList.last().listenInterface,SIGNAL(newState(ListeningState)),this,SLOT(newState(ListeningState)));
if(tryListen)
@@ -100,10 +104,10 @@ void CopyListener::onePluginAdded(const PluginsAvailable &plugin)
}
}
else
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to cast the plugin: "+pluginLoader->errorString());
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to cast the plugin: "+pluginOfPluginLoader->errorString());
}
else
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to load the plugin: "+pluginLoader->errorString());
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to load the plugin: "+pluginOfPluginLoader->errorString());
}
#ifdef ULTRACOPIER_DEBUG
@@ -184,14 +188,14 @@ void CopyListener::listen()
pluginList.at(index).listenInterface->listen();
index++;
}
- pluginLoader.load();
+ pluginLoader->load();
}
void CopyListener::close()
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
tryListen=false;
- pluginLoader.unload();
+ pluginLoader->unload();
int index=0;
while(index<pluginList.size())
{
@@ -202,31 +206,6 @@ void CopyListener::close()
copyRunningList.clear();
}
-QStringList CopyListener::parseWildcardSources(QStringList sources)
-{
- QStringList returnList;
- int index=0;
- while(index<sources.size())
- {
- if(sources.at(index).contains("*"))
- {
- QFileInfo info(sources.at(index));
- QDir folder(info.absoluteDir());
- QFileInfoList fileFile=folder.entryInfoList(QStringList() << info.fileName());
- int index=0;
- while(index<fileFile.size())
- {
- returnList << fileFile.at(index).absoluteFilePath();
- index++;
- }
- }
- else
- returnList << sources.at(index);
- index++;
- }
- return returnList;
-}
-
QStringList CopyListener::stripSeparator(QStringList sources)
{
int index=0;
@@ -242,28 +221,28 @@ QStringList CopyListener::stripSeparator(QStringList sources)
void CopyListener::newCopy(QStringList sources)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
- emit newCopy(incrementOrderId(),QStringList() << "file",stripSeparator(parseWildcardSources(sources)));
+ emit newCopy(incrementOrderId(),QStringList() << "file",stripSeparator(sources));
}
/** new copy with destination have been pased by the CLI */
void CopyListener::newCopy(QStringList sources,QString destination)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
- emit newCopy(incrementOrderId(),QStringList() << "file",stripSeparator(parseWildcardSources(sources)),"file",destination);
+ emit newCopy(incrementOrderId(),QStringList() << "file",stripSeparator(sources),"file",destination);
}
/** new move without destination have been pased by the CLI */
void CopyListener::newMove(QStringList sources)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
- emit newMove(incrementOrderId(),QStringList() << "file",stripSeparator(parseWildcardSources(sources)));
+ emit newMove(incrementOrderId(),QStringList() << "file",stripSeparator(sources));
}
/** new move with destination have been pased by the CLI */
void CopyListener::newMove(QStringList sources,QString destination)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
- emit newMove(incrementOrderId(),QStringList() << "file",stripSeparator(parseWildcardSources(sources)),"file",destination);
+ emit newMove(incrementOrderId(),QStringList() << "file",stripSeparator(sources),"file",destination);
}
void CopyListener::copyFinished(const quint32 & orderId,const bool &withError)
@@ -407,7 +386,7 @@ void CopyListener::sendState(bool force)
}
else
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("Skip the signal sending"));
- last_state=NotListening;
+ last_state=current_state;
last_have_plugin=have_plugin;
last_inWaitOfReply=found_inWaitOfReply;
}
diff --git a/CopyListener.h b/CopyListener.h
index c5cd84e..198ce9f 100755
--- a/CopyListener.h
+++ b/CopyListener.h
@@ -16,13 +16,14 @@
#include "Environment.h"
#include "GlobalClass.h"
#include "PluginLoader.h"
+#include "OptionDialog.h"
/** \brief to load all the listener and parse all event */
class CopyListener : public QObject, public GlobalClass
{
Q_OBJECT
public:
- explicit CopyListener(QObject *parent = 0);
+ explicit CopyListener(OptionDialog *optionDialog);
~CopyListener();
/** \brief send of one listener is loaded */
bool oneListenerIsLoaded();
@@ -78,6 +79,7 @@ class CopyListener : public QObject, public GlobalClass
void newMove(quint32 orderId,QStringList protocolsUsedForTheSources,QStringList sources,QString protocolsUsedForTheDestination,QString destination);
void listenerReady(ListeningState state,bool havePlugin,bool someAreInWaitOfReply);
void pluginLoaderReady(CatchState state,bool havePlugin,bool someAreInWaitOfReply);
+ void previouslyPluginAdded(PluginsAvailable);
private:
struct PluginListener
{
@@ -102,12 +104,12 @@ class CopyListener : public QObject, public GlobalClass
QList<CopyRunning> copyRunningList;
quint32 incrementOrderId();
bool tryListen;
- PluginLoader pluginLoader;
+ PluginLoader *pluginLoader;
ListeningState last_state;
bool last_have_plugin,last_inWaitOfReply;
void sendState(bool force=false);
- QStringList parseWildcardSources(QStringList sources);
QStringList stripSeparator(QStringList sources);
+ OptionDialog *optionDialog;
};
#endif // COPYLISTENER_H
diff --git a/Core.cpp b/Core.cpp
index f27181b..a12ba32 100644..100755
--- a/Core.cpp
+++ b/Core.cpp
@@ -20,13 +20,27 @@ Core::Core(CopyEngineManager *copyEngineList)
//connect(&copyEngineList, SIGNAL(newCanDoOnlyCopy(bool)), this, SIGNAL(newCanDoOnlyCopy(bool)));
connect(themes, SIGNAL(theThemeNeedBeUnloaded()), this, SLOT(unloadInterface()));
connect(themes, SIGNAL(theThemeIsReloaded()), this, SLOT(loadInterface()));
- connect(&forUpateInformation, SIGNAL(timeout()), this, SLOT(periodiqueSync()));
+ connect(&forUpateInformation, SIGNAL(timeout()), this, SLOT(periodicSynchronization()));
+
+ qRegisterMetaType<QList<returnActionOnCopyList> >("QList<returnActionOnCopyList>");
+ qRegisterMetaType<QList<ProgressionItem> >("QList<ProgressionItem>");
+ qRegisterMetaType<QList<int> >("QList<int>");
+ qRegisterMetaType<QList<QUrl> >("QList<QUrl>");
+ qRegisterMetaType<EngineActionInProgress>("EngineActionInProgress");
+ qRegisterMetaType<CopyMode >("CopyMode");
+ qRegisterMetaType<QList<returnActionOnCopyList> >("QList<returnActionOnCopyList>");
+ qRegisterMetaType<QList<ProgressionItem> >("QList<ProgressionItem>");
}
void Core::newCopy(const quint32 &orderId,const QStringList &protocolsUsedForTheSources,const QStringList &sources)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
- openNewCopy(Copy,false,protocolsUsedForTheSources);
+ if(openNewCopyEngineInstance(Copy,false,protocolsUsedForTheSources)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return;
+ }
copyList.last().orderId<<orderId;
copyList.last().engine->newCopy(sources);
copyList.last().interface->haveExternalOrder();
@@ -74,7 +88,12 @@ void Core::newCopy(const quint32 &orderId,const QStringList &protocolsUsedForThe
}
}
//else open new windows
- openNewCopy(Copy,false,protocolsUsedForTheSources,protocolsUsedForTheDestination);
+ if(openNewCopyEngineInstance(Copy,false,protocolsUsedForTheSources,protocolsUsedForTheDestination)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return;
+ }
copyList.last().orderId<<orderId;
copyList.last().engine->newCopy(sources,destination);
copyList.last().interface->haveExternalOrder();
@@ -82,7 +101,12 @@ void Core::newCopy(const quint32 &orderId,const QStringList &protocolsUsedForThe
void Core::newMove(const quint32 &orderId,const QStringList &protocolsUsedForTheSources,const QStringList &sources)
{
- openNewCopy(Move,false,protocolsUsedForTheSources);
+ if(openNewCopyEngineInstance(Move,false,protocolsUsedForTheSources)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return;
+ }
copyList.last().orderId<<orderId;
copyList.last().engine->newMove(sources);
copyList.last().interface->haveExternalOrder();
@@ -90,7 +114,7 @@ void Core::newMove(const quint32 &orderId,const QStringList &protocolsUsedForThe
void Core::newMove(const quint32 &orderId,const QStringList &protocolsUsedForTheSources,const QStringList &sources,const QString &protocolsUsedForTheDestination,const QString &destination)
{
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+sources.join(";")+", dest: "+destination);
//search to group the window
int GroupWindowWhen=options->getOptionValue("Ultracopier","GroupWindowWhen").toInt();
bool haveSameSource=false,haveSameDestination=false;
@@ -130,17 +154,27 @@ void Core::newMove(const quint32 &orderId,const QStringList &protocolsUsedForThe
}
}
//else open new windows
- openNewCopy(Move,false,protocolsUsedForTheSources,protocolsUsedForTheDestination);
+ if(openNewCopyEngineInstance(Move,false,protocolsUsedForTheSources,protocolsUsedForTheDestination)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return;
+ }
copyList.last().orderId<<orderId;
copyList.last().engine->newMove(sources,destination);
copyList.last().interface->haveExternalOrder();
}
-/// \todo name to open the right copy engine
+/// \brief name to open the right copy engine
void Core::addWindowCopyMove(const CopyMode &mode,const QString &name)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+name);
- openNewCopy(mode,false,name);
+ if(openNewCopyEngineInstance(mode,false,name)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return;
+ }
ActionOnManualOpen ActionOnManualOpen_value=(ActionOnManualOpen)options->getOptionValue("Ultracopier","ActionOnManualOpen").toInt();
if(ActionOnManualOpen_value!=ActionOnManualOpen_Nothing)
{
@@ -151,11 +185,56 @@ void Core::addWindowCopyMove(const CopyMode &mode,const QString &name)
}
}
-/// \todo name to open the right copy engine
+/// \brief name to open the right copy engine
void Core::addWindowTransfer(const QString &name)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start"+name);
- openNewCopy(Copy,true,name);
+ if(openNewCopyEngineInstance(Copy,true,name)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return;
+ }
+}
+
+/** new transfer list pased by the CLI */
+void Core::newTransferList(QString engine,QString mode,QString file)
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("engine: %1, mode: %2, file: %3").arg(engine).arg(mode).arg(file));
+ if(mode=="Transfer")
+ {
+ if(openNewCopyEngineInstance(Copy,true,engine)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return;
+ }
+ }
+ else if(mode=="Copy")
+ {
+ if(openNewCopyEngineInstance(Copy,false,engine)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return;
+ }
+ }
+ else if(mode=="Move")
+ {
+ if(openNewCopyEngineInstance(Move,false,engine)==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to get a copy engine instance");
+ QMessageBox::critical(NULL,tr("Error"),tr("Unable to get a copy engine instance"));
+ return;
+ }
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"The argument for the mode is not understand");
+ QMessageBox::critical(NULL,tr("Error"),tr("The argument for the mode is not understand"));
+ return;
+ }
+ copyList.last().engine->newTransferList(file);
}
void Core::loadInterface()
@@ -222,20 +301,37 @@ int Core::incrementId()
return nextId;
}
-int Core::openNewCopy(const CopyMode &mode,const bool &ignoreMode,const QStringList &protocolsUsedForTheSources,const QString &protocolsUsedForTheDestination)
+/** open with specific source/destination
+\param move Copy or move
+\param ignoreMode if need ignore the mode
+\param protocolsUsedForTheSources protocols used for sources
+\param protocolsUsedForTheDestination protocols used for destination
+*/
+int Core::openNewCopyEngineInstance(const CopyMode &mode,const bool &ignoreMode,const QStringList &protocolsUsedForTheSources,const QString &protocolsUsedForTheDestination)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
CopyEngineManager::returnCopyEngine returnInformations=copyEngineList->getCopyEngine(mode,protocolsUsedForTheSources,protocolsUsedForTheDestination);
+ if(returnInformations.engine==NULL)
+ return -1;
return connectCopyEngine(mode,ignoreMode,returnInformations);
}
-int Core::openNewCopy(const CopyMode &mode,const bool &ignoreMode,const QString &name)
+/** open with specific copy engine
+\param move Copy or move
+\param ignoreMode if need ignore the mode
+\param protocolsUsedForTheSources protocols used for sources
+\param protocolsUsedForTheDestination protocols used for destination
+*/
+int Core::openNewCopyEngineInstance(const CopyMode &mode,const bool &ignoreMode,const QString &name)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start, mode: "+QString::number(mode)+", name: "+name);
CopyEngineManager::returnCopyEngine returnInformations=copyEngineList->getCopyEngine(mode,name);
+ if(returnInformations.engine==NULL)
+ return -1;
return connectCopyEngine(mode,ignoreMode,returnInformations);
}
+/** Connect the copy engine instance provided previously to the management */
int Core::connectCopyEngine(const CopyMode &mode,bool ignoreMode,const CopyEngineManager::returnCopyEngine &returnInformations)
{
if(returnInformations.canDoOnlyCopy)
@@ -260,7 +356,8 @@ int Core::connectCopyEngine(const CopyMode &mode,bool ignoreMode,const CopyEngin
newItem.baseTime=0;
newItem.numberOfFile=0;
newItem.numberOfTransferedFile=0;
- newItem.sizeToCopy=0;
+ newItem.currentProgression=0;
+ newItem.totalProgression=0;
newItem.action=Idle;
newItem.lastProgression=0;//store the real byte transfered, used in time remaining calculation
newItem.isPaused=false;
@@ -273,7 +370,10 @@ int Core::connectCopyEngine(const CopyMode &mode,bool ignoreMode,const CopyEngin
newItem.copyEngineIsSync=true;
if(!ignoreMode)
+ {
newItem.interface->forceCopyMode(mode);
+ newItem.engine->forceMode(mode);
+ }
if(copyList.size()==0)
forUpateInformation.start();
copyList << newItem;
@@ -281,8 +381,8 @@ int Core::connectCopyEngine(const CopyMode &mode,bool ignoreMode,const CopyEngin
connectInterfaceAndSync(copyList.count()-1);
return newItem.id;
}
- delete newItem.engine;
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to load the interface, copy aborted");
+ delete newItem.engine;
QMessageBox::critical(NULL,tr("Error"),tr("Unable to load the interface, copy aborted"));
}
else
@@ -345,7 +445,7 @@ void Core::actionInProgess(const EngineActionInProgress &action)
}
}
//do sync
- periodiqueSync(index);
+ periodicSynchronization(index);
copyList[index].action=action;
if(copyList.at(index).interface!=NULL)
copyList.at(index).interface->actionInProgess(action);
@@ -408,6 +508,7 @@ void Core::isInPause(const bool &isPaused)
}
}
+/// \brief get the right copy instance (copy engine + interface), by signal emited from copy engine
int Core::indexCopySenderCopyEngine()
{
QObject * senderObject=sender();
@@ -430,6 +531,7 @@ int Core::indexCopySenderCopyEngine()
return -1;
}
+/// \brief get the right copy instance (copy engine + interface), by signal emited from interface
int Core::indexCopySenderInterface()
{
QObject * senderObject=sender();
@@ -473,16 +575,28 @@ void Core::connectEngine(const int &index)
disconnectEngine(index);
CopyInstance& currentCopyInstance=copyList[index];
- connect(currentCopyInstance.engine,SIGNAL(newFolderListing(QString)), this,SLOT(newFolderListing(QString)),Qt::QueuedConnection);//to check to change
- connect(currentCopyInstance.engine,SIGNAL(newCollisionAction(QString)), this,SLOT(newCollisionAction(QString)),Qt::QueuedConnection);
- connect(currentCopyInstance.engine,SIGNAL(newErrorAction(QString)), this,SLOT(newErrorAction(QString)),Qt::QueuedConnection);
- connect(currentCopyInstance.engine,SIGNAL(actionInProgess(EngineActionInProgress)), this,SLOT(actionInProgess(EngineActionInProgress)),Qt::QueuedConnection);
- connect(currentCopyInstance.engine,SIGNAL(isInPause(bool)), this,SLOT(isInPause(bool)),Qt::QueuedConnection);//to check to change
- connect(currentCopyInstance.engine,SIGNAL(cancelAll()), this,SLOT(copyInstanceCanceledByEngine()),Qt::QueuedConnection);
- connect(currentCopyInstance.engine,SIGNAL(error(QString,quint64,QDateTime,QString)), this,SLOT(error(QString,quint64,QDateTime,QString)),Qt::QueuedConnection);
- connect(currentCopyInstance.engine,SIGNAL(rmPath(QString)), this,SLOT(rmPath(QString)),Qt::QueuedConnection);
- connect(currentCopyInstance.engine,SIGNAL(mkPath(QString)), this,SLOT(mkPath(QString)),Qt::QueuedConnection);
- connect(currentCopyInstance.engine,SIGNAL(syncReady()), this,SLOT(syncReady()),Qt::QueuedConnection);
+ if(!connect(currentCopyInstance.engine,SIGNAL(newFolderListing(QString)), this,SLOT(newFolderListing(QString)),Qt::QueuedConnection))//to check to change
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the engine can not work correctly: %1: %2 for newFolderListing()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(newCollisionAction(QString)), this,SLOT(newCollisionAction(QString)),Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the engine can not work correctly: %1: %2 for newCollisionAction()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(newErrorAction(QString)), this,SLOT(newErrorAction(QString)),Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the engine can not work correctly: %1: %2 for newErrorAction()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(actionInProgess(EngineActionInProgress)), this,SLOT(actionInProgess(EngineActionInProgress)),Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the engine can not work correctly: %1: %2 for actionInProgess()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(isInPause(bool)), this,SLOT(isInPause(bool)),Qt::QueuedConnection))//to check to change
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the engine can not work correctly: %1: %2 for isInPause()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(cancelAll()), this,SLOT(copyInstanceCanceledByEngine()),Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the engine can not work correctly: %1: %2 for cancelAll()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(error(QString,quint64,QDateTime,QString)), this,SLOT(error(QString,quint64,QDateTime,QString)),Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the engine can not work correctly: %1: %2 for error()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(rmPath(QString)), this,SLOT(rmPath(QString)),Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the engine can not work correctly: %1: %2 for rmPath()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(mkPath(QString)), this,SLOT(mkPath(QString)),Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the engine can not work correctly: %1: %2 for mkPath()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(syncReady()), this,SLOT(syncReady()),Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the engine can not work correctly: %1: %2 for syncReady()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(canBeDeleted()), this,SLOT(deleteCopyEngine()),Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the engine can not work correctly: %1: %2 for syncReady()").arg(index).arg((quint64)sender()));
}
void Core::connectInterfaceAndSync(const int &index)
@@ -491,31 +605,55 @@ void Core::connectInterfaceAndSync(const int &index)
disconnectInterface(index);
CopyInstance& currentCopyInstance=copyList[index];
- connect(currentCopyInstance.interface,SIGNAL(pause()), currentCopyInstance.engine,SLOT(pause()));
- connect(currentCopyInstance.interface,SIGNAL(resume()), currentCopyInstance.engine,SLOT(resume()));
- connect(currentCopyInstance.interface,SIGNAL(skip(quint64)), currentCopyInstance.engine,SLOT(skip(quint64)));
- connect(currentCopyInstance.interface,SIGNAL(sendErrorAction(QString)), currentCopyInstance.engine,SLOT(setErrorAction(QString)));
- connect(currentCopyInstance.interface,SIGNAL(newSpeedLimitation(qint64)), currentCopyInstance.engine,SLOT(setSpeedLimitation(qint64)));
- connect(currentCopyInstance.interface,SIGNAL(sendCollisionAction(QString)), currentCopyInstance.engine,SLOT(setCollisionAction(QString)));
- connect(currentCopyInstance.interface,SIGNAL(userAddFolder(CopyMode)), currentCopyInstance.engine,SLOT(userAddFolder(CopyMode)));
- connect(currentCopyInstance.interface,SIGNAL(userAddFile(CopyMode)), currentCopyInstance.engine,SLOT(userAddFile(CopyMode)));
-
- connect(currentCopyInstance.interface,SIGNAL(removeItems(QList<int>)), currentCopyInstance.engine,SLOT(removeItems(QList<int>)));
- connect(currentCopyInstance.interface,SIGNAL(moveItemsOnTop(QList<int>)), currentCopyInstance.engine,SLOT(moveItemsOnTop(QList<int>)));
- connect(currentCopyInstance.interface,SIGNAL(moveItemsUp(QList<int>)), currentCopyInstance.engine,SLOT(moveItemsUp(QList<int>)));
- connect(currentCopyInstance.interface,SIGNAL(moveItemsDown(QList<int>)), currentCopyInstance.engine,SLOT(moveItemsDown(QList<int>)));
- connect(currentCopyInstance.interface,SIGNAL(moveItemsOnBottom(QList<int>)), currentCopyInstance.engine,SLOT(moveItemsOnBottom(QList<int>)));
- connect(currentCopyInstance.interface,SIGNAL(exportTransferList()), currentCopyInstance.engine,SLOT(exportTransferList()));
- connect(currentCopyInstance.interface,SIGNAL(importTransferList()), currentCopyInstance.engine,SLOT(importTransferList()));
-
- connect(currentCopyInstance.interface,SIGNAL(newSpeedLimitation(qint64)), this,SLOT(resetSpeedDetectedInterface()));
- connect(currentCopyInstance.interface,SIGNAL(resume()), this,SLOT(resetSpeedDetectedInterface()));
- connect(currentCopyInstance.interface,SIGNAL(cancel()), this,SLOT(copyInstanceCanceledByInterface()),Qt::QueuedConnection);
- connect(currentCopyInstance.interface,SIGNAL(urlDropped(QList<QUrl>)), this,SLOT(urlDropped(QList<QUrl>)),Qt::QueuedConnection);
- connect(currentCopyInstance.engine,SIGNAL(newActionOnList(QList<returnActionOnCopyList>)),this,SLOT(getActionOnList(QList<returnActionOnCopyList>)), Qt::QueuedConnection);
-
- connect(currentCopyInstance.engine,SIGNAL(pushFileProgression(QList<ProgressionItem>)), currentCopyInstance.interface,SLOT(setFileProgression(QList<ProgressionItem>)), Qt::QueuedConnection);
- connect(currentCopyInstance.engine,SIGNAL(pushGeneralProgression(quint64,quint64)), currentCopyInstance.interface,SLOT(setGeneralProgression(quint64,quint64)), Qt::QueuedConnection);
+ if(!connect(currentCopyInstance.interface,SIGNAL(pause()), currentCopyInstance.engine,SLOT(pause())))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for pause()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(resume()), currentCopyInstance.engine,SLOT(resume())))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for resume()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(skip(quint64)), currentCopyInstance.engine,SLOT(skip(quint64))))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for skip()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(sendErrorAction(QString)), currentCopyInstance.engine,SLOT(setErrorAction(QString))))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for sendErrorAction()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(newSpeedLimitation(qint64)), currentCopyInstance.engine,SLOT(setSpeedLimitation(qint64))))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for newSpeedLimitation()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(sendCollisionAction(QString)), currentCopyInstance.engine,SLOT(setCollisionAction(QString))))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for sendCollisionAction()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(userAddFolder(CopyMode)), currentCopyInstance.engine,SLOT(userAddFolder(CopyMode))))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for userAddFolder()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(userAddFile(CopyMode)), currentCopyInstance.engine,SLOT(userAddFile(CopyMode))))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for userAddFile()").arg(index).arg((quint64)sender()));
+
+ if(!connect(currentCopyInstance.interface,SIGNAL(removeItems(QList<int>)), currentCopyInstance.engine,SLOT(removeItems(QList<int>))))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for removeItems()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(moveItemsOnTop(QList<int>)), currentCopyInstance.engine,SLOT(moveItemsOnTop(QList<int>))))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for moveItemsOnTop()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(moveItemsUp(QList<int>)), currentCopyInstance.engine,SLOT(moveItemsUp(QList<int>))))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for moveItemsUp()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(moveItemsDown(QList<int>)), currentCopyInstance.engine,SLOT(moveItemsDown(QList<int>))))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for moveItemsDown()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(moveItemsOnBottom(QList<int>)), currentCopyInstance.engine,SLOT(moveItemsOnBottom(QList<int>))))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for moveItemsOnBottom()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(exportTransferList()), currentCopyInstance.engine,SLOT(exportTransferList())))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for exportTransferList()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(importTransferList()), currentCopyInstance.engine,SLOT(importTransferList())))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for importTransferList()").arg(index).arg((quint64)sender()));
+
+ if(!connect(currentCopyInstance.interface,SIGNAL(newSpeedLimitation(qint64)), this,SLOT(resetSpeedDetectedInterface())))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for newSpeedLimitation()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(resume()), this,SLOT(resetSpeedDetectedInterface())))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for resume()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(cancel()), this,SLOT(copyInstanceCanceledByInterface()),Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for cancel()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.interface,SIGNAL(urlDropped(QList<QUrl>)), this,SLOT(urlDropped(QList<QUrl>)),Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for urlDropped()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(newActionOnList(QList<returnActionOnCopyList>)),this,SLOT(getActionOnList(QList<returnActionOnCopyList>)), Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for newActionOnList()").arg(index).arg((quint64)sender()));
+
+ if(!connect(currentCopyInstance.engine,SIGNAL(pushFileProgression(QList<ProgressionItem>)), currentCopyInstance.interface,SLOT(setFileProgression(QList<ProgressionItem>)), Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for pushFileProgression()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(pushGeneralProgression(quint64,quint64)), currentCopyInstance.interface,SLOT(setGeneralProgression(quint64,quint64)), Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for pushGeneralProgression()").arg(index).arg((quint64)sender()));
+ if(!connect(currentCopyInstance.engine,SIGNAL(pushGeneralProgression(quint64,quint64)), this,SLOT(pushGeneralProgression(quint64,quint64)), Qt::QueuedConnection))
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("error at connect, the interface can not work correctly: %1: %2 for pushGeneralProgression() for this").arg(index).arg((quint64)sender()));
currentCopyInstance.interface->setSpeedLimitation(currentCopyInstance.engine->getSpeedLimitation());
currentCopyInstance.interface->setErrorAction(currentCopyInstance.engine->getErrorAction());
@@ -529,19 +667,21 @@ void Core::connectInterfaceAndSync(const int &index)
QWidget *tempWidget=currentCopyInstance.interface->getOptionsEngineWidget();
if(tempWidget!=NULL)
currentCopyInstance.interface->getOptionsEngineEnabled(currentCopyInstance.engine->getOptionsEngine(tempWidget));
+ //important, to have the modal dialog
+ currentCopyInstance.engine->setInterfacePointer(currentCopyInstance.interface);
//put entry into the interface
currentCopyInstance.engine->syncTransferList();
//force the updating, without wait the timer
- periodiqueSync(index);
+ periodicSynchronization(index);
}
void Core::disconnectEngine(const int &index)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start with index: %1").arg(index));
- CopyInstance& currentCopyInstance=copyList[index];
- disconnect(currentCopyInstance.engine,SIGNAL(newFolderListing(QString)), this,SLOT(newFolderListing(QString)));//to check to change
+// CopyInstance& currentCopyInstance=copyList[index];
+/* disconnect(currentCopyInstance.engine,SIGNAL(newFolderListing(QString)), this,SLOT(newFolderListing(QString)));//to check to change
disconnect(currentCopyInstance.engine,SIGNAL(newCollisionAction(QString)), this,SLOT(newCollisionAction(QString)));
disconnect(currentCopyInstance.engine,SIGNAL(newErrorAction(QString)), this,SLOT(newErrorAction(QString)));
disconnect(currentCopyInstance.engine,SIGNAL(actionInProgess(EngineActionInProgress)), this,SLOT(actionInProgess(EngineActionInProgress)));
@@ -549,14 +689,15 @@ void Core::disconnectEngine(const int &index)
disconnect(currentCopyInstance.engine,SIGNAL(cancelAll()), this,SLOT(copyInstanceCanceledByEngine()));
disconnect(currentCopyInstance.engine,SIGNAL(error(QString,quint64,QDateTime,QString)), this,SLOT(error(QString,quint64,QDateTime,QString)));
disconnect(currentCopyInstance.engine,SIGNAL(rmPath(QString)), this,SLOT(rmPath(QString)));
- disconnect(currentCopyInstance.engine,SIGNAL(mkPath(QString)), this,SLOT(mkPath(QString)));
+ disconnect(currentCopyInstance.engine,SIGNAL(mkPath(QString)), this,SLOT(mkPath(QString)));*/
}
void Core::disconnectInterface(const int &index)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start with index: %1").arg(index));
- CopyInstance& currentCopyInstance=copyList[index];
+ Q_UNUSED(index);
+/* CopyInstance& currentCopyInstance=copyList[index];
disconnect(currentCopyInstance.interface,SIGNAL(pause()), currentCopyInstance.engine,SLOT(pause()));
disconnect(currentCopyInstance.interface,SIGNAL(resume()), currentCopyInstance.engine,SLOT(resume()));
disconnect(currentCopyInstance.interface,SIGNAL(skip(quint64)), currentCopyInstance.engine,SLOT(skip(quint64)));
@@ -579,22 +720,22 @@ void Core::disconnectInterface(const int &index)
disconnect(currentCopyInstance.engine,SIGNAL(newActionOnList(QList<returnActionOnCopyList>)), currentCopyInstance.interface,SLOT(getActionOnList(QList<returnActionOnCopyList>)));
disconnect(currentCopyInstance.engine,SIGNAL(pushFileProgression(QList<ProgressionItem>)), currentCopyInstance.interface,SLOT(setFileProgression(QList<ProgressionItem>)));
- disconnect(currentCopyInstance.engine,SIGNAL(pushGeneralProgression(quint64,quint64)), currentCopyInstance.interface,SLOT(setGeneralProgression(quint64,quint64)));
+ disconnect(currentCopyInstance.engine,SIGNAL(pushGeneralProgression(quint64,quint64)), currentCopyInstance.interface,SLOT(setGeneralProgression(quint64,quint64)));*/
}
-void Core::periodiqueSync()
+void Core::periodicSynchronization()
{
index_sub_loop=0;
loop_size=copyList.size();
while(index_sub_loop<loop_size)
{
if(copyList.at(index_sub_loop).action==Copying || copyList.at(index_sub_loop).action==CopyingAndListing)
- periodiqueSync(index_sub_loop);
+ periodicSynchronization(index_sub_loop);
index_sub_loop++;
}
}
-void Core::periodiqueSync(const int &index)
+void Core::periodicSynchronization(const int &index)
{
CopyInstance& currentCopyInstance=copyList[index];
if(currentCopyInstance.engine==NULL || currentCopyInstance.interface==NULL)
@@ -607,24 +748,27 @@ void Core::periodiqueSync(const int &index)
if(!currentCopyInstance.isPaused)
{
//calcul the last difference of the transfere
- quint64 realByteTransfered=currentCopyInstance.engine->realByteTransfered();
- quint64 diffCopiedSize=0;
+ realByteTransfered=currentCopyInstance.engine->realByteTransfered();
+ diffCopiedSize=0;
if(realByteTransfered>=currentCopyInstance.lastProgression)
diffCopiedSize=realByteTransfered-currentCopyInstance.lastProgression;
currentCopyInstance.lastProgression=realByteTransfered;
- //do the remaining time calculation
- //byte per ms: lastProgression/(baseTime+currentCopyInstance.runningTime.elapsed()
- //currentCopyInstance.lastProgression
- if(currentCopyInstance.lastProgression==0)
+
+ // algo 1:
+ // ((double)currentProgression)/totalProgression -> example: done 80% -> 0.8
+ // baseTime+runningTime -> example: done into 80s, remaining time: 80/0.8-80=80*(1/0.8-1)=20s
+ // algo 2 (not used):
+ // remaining byte/current speed
+
+ transferAddedTime=currentCopyInstance.baseTime+currentCopyInstance.runningTime.elapsed();
+
+ //remaining time: (total byte - lastProgression)/byte per ms since the start
+ if(currentCopyInstance.totalProgression==0 || currentCopyInstance.currentProgression==0)
currentCopyInstance.interface->remainingTime(-1);
else
- currentCopyInstance.interface->remainingTime(
- (
- (double)(realByteTransfered)
- *(currentCopyInstance.baseTime+currentCopyInstance.runningTime.elapsed())
- /(currentCopyInstance.lastProgression)
- )/1000
- );
+ currentCopyInstance.interface->remainingTime(transferAddedTime*((double)currentCopyInstance.totalProgression/(double)currentCopyInstance.currentProgression-1)/1000);
+
+ //do the speed calculation
if(lastProgressionTime.isNull())
lastProgressionTime.start();
else
@@ -656,6 +800,7 @@ void Core::periodiqueSync(const int &index)
}
}
+/// \brief the copy engine have canceled the transfer
void Core::copyInstanceCanceledByEngine()
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
@@ -666,6 +811,7 @@ void Core::copyInstanceCanceledByEngine()
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to locate the copy engine sender");
}
+/// \brief the interface have canceled the transfer
void Core::copyInstanceCanceledByInterface()
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
@@ -676,6 +822,7 @@ void Core::copyInstanceCanceledByInterface()
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to locate the copy engine sender");
}
+/// \brief the transfer have been canceled
void Core::copyInstanceCanceledByIndex(const int &index)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start, remove with the index: "+QString::number(index));
@@ -684,7 +831,7 @@ void Core::copyInstanceCanceledByIndex(const int &index)
CopyInstance& currentCopyInstance=copyList[index];
currentCopyInstance.engine->cancel();
delete currentCopyInstance.nextConditionalSync;
- delete currentCopyInstance.engine;
+ currentCopyInstance.engine->cancel();
delete currentCopyInstance.interface;
index_sub_loop=0;
loop_size=currentCopyInstance.orderId.size();
@@ -700,6 +847,28 @@ void Core::copyInstanceCanceledByIndex(const int &index)
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"copyList.size(): "+QString::number(copyList.size()));
}
+/// \brief only when the copy engine say it's ready to delete them self, it call this
+void Core::deleteCopyEngine()
+{
+ QObject * senderObject=sender();
+ if(senderObject==NULL)
+ {
+ //QMessageBox::critical(NULL,tr("Internal error"),tr("A communication error occured between the interface and the copy plugin. Please report this bug."));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Qt sender() NULL");
+ return;
+ }
+ PluginInterface_CopyEngine * copyEngine = static_cast<PluginInterface_CopyEngine *>(senderObject);
+ if(copyEngine==NULL)
+ {
+ //QMessageBox::critical(NULL,tr("Internal error"),tr("A communication error occured between the interface and the copy plugin. Please report this bug."));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Qt sender() NULL");
+ return;
+ }
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start, delete the copy engine");
+ delete copyEngine;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"stop, delete the copy engine");
+}
+
//error occurred
void Core::error(const QString &path,const quint64 &size,const QDateTime &mtime,const QString &error)
{
@@ -725,6 +894,7 @@ void Core::mkPath(const QString &path)
log.mkPath(path);
}
+/// \brief to rsync after a new interface connection
void Core::syncReady()
{
int index=indexCopySenderCopyEngine();
@@ -736,6 +906,7 @@ void Core::syncReady()
void Core::getActionOnList(const QList<returnActionOnCopyList> & actionList)
{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
int index=indexCopySenderCopyEngine();
if(index!=-1)
{
@@ -746,6 +917,19 @@ void Core::getActionOnList(const QList<returnActionOnCopyList> & actionList)
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to locate the copy engine sender");
}
+void Core::pushGeneralProgression(const quint64 &current,const quint64 &total)
+{
+ int index=indexCopySenderCopyEngine();
+ if(index!=-1)
+ {
+ copyList[index].currentProgression=current;
+ copyList[index].totalProgression=total;
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to locate the copy engine sender");
+}
+
+/// \brief used to drag and drop files
void Core::urlDropped(const QList<QUrl> &urls)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
diff --git a/Core.h b/Core.h
index c0f948e..a3a9c2a 100644
--- a/Core.h
+++ b/Core.h
@@ -50,9 +50,9 @@ class Core : public QObject, public GlobalClass
CopyMode mode;
quint64 numberOfFile;
quint64 numberOfTransferedFile;
- quint64 sizeToCopy;
+ quint64 currentProgression,totalProgression;//store the file byte transfered, used into the remaining time
EngineActionInProgress action;
- quint64 lastProgression;//store the real byte transfered, used in time remaining calculation
+ quint64 lastProgression;//store the real byte transfered, used in speed calculation
QList<quint64> lastSpeedDetected;//stored in bytes
QList<double> lastSpeedTime;//stored in ms
QList<RunningTransfer> transferItemList;//full info of started item, to have wich progression to poll
@@ -72,27 +72,55 @@ class Core : public QObject, public GlobalClass
bool copyEngineIsSync;
};
QList<CopyInstance> copyList;
- int openNewCopy(const CopyMode &mode,const bool &ignoreMode,const QStringList &protocolsUsedForTheSources=QStringList(),const QString &protocolsUsedForTheDestination="");
- int openNewCopy(const CopyMode &mode,const bool &ignoreMode,const QString &name);
- int incrementId();
- int nextId;
- QList<int> idList;
- QTime lastProgressionTime;
+ /** open with specific source/destination
+ \param move Copy or move
+ \param ignoreMode if need ignore the mode
+ \param protocolsUsedForTheSources protocols used for sources
+ \param protocolsUsedForTheDestination protocols used for destination
+ */
+ int openNewCopyEngineInstance(const CopyMode &mode,const bool &ignoreMode,const QStringList &protocolsUsedForTheSources=QStringList(),const QString &protocolsUsedForTheDestination="");
+ /** open with specific copy engine
+ \param move Copy or move
+ \param ignoreMode if need ignore the mode
+ \param protocolsUsedForTheSources protocols used for sources
+ \param protocolsUsedForTheDestination protocols used for destination
+ */
+ int openNewCopyEngineInstance(const CopyMode &mode,const bool &ignoreMode,const QString &name);
+
+ /// \brief get the right copy instance (copy engine + interface), by signal emited from copy engine
int indexCopySenderCopyEngine();
+ /// \brief get the right copy instance (copy engine + interface), by signal emited from interface
int indexCopySenderInterface();
+
void connectEngine(const int &index);
void connectInterfaceAndSync(const int &index);
void disconnectEngine(const int &index);
void disconnectInterface(const int &index);
- void periodiqueSync(const int &index);
- QTimer forUpateInformation;
+
+ /** \brief update at periodic interval, the synchronization between copy engine and interface, but for specific entry
+ \see forUpateInformation */
+ void periodicSynchronization(const int &index);
+
+ //for the internal management
+ int incrementId();
+ int nextId;
+ QList<int> idList;
+ QTime lastProgressionTime;
+ QTimer forUpateInformation;///< used to call \see periodicSynchronization()
void resetSpeedDetected(const int &index);
+
+ /** Connect the copy engine instance provided previously to the management */
int connectCopyEngine(const CopyMode &mode,bool ignoreMode,const CopyEngineManager::returnCopyEngine &returnInformations);
- LogThread log;
+
+ LogThread log;///< To save the log like mkpath, rmpath, error, copy, ...
//temp variable
int index,index_sub_loop,loop_size,loop_sub_size;
double totTime;
double totSpeed;
+ quint64 realByteTransfered;
+ quint64 transferSpeed;
+ quint64 transferAddedTime;
+ quint64 diffCopiedSize;
signals:
void copyFinished(const quint32 & orderId,bool withError);
void copyCanceled(const quint32 & orderId);
@@ -109,28 +137,50 @@ class Core : public QObject, public GlobalClass
void addWindowCopyMove(const CopyMode &mode,const QString &name);
/** \brief open transfer (copy+move) windows with specific engine */
void addWindowTransfer(const QString &name);
+ /** new transfer list pased by the CLI */
+ void newTransferList(QString engine,QString mode,QString file);
private slots:
+ /// \brief the copy engine have canceled the transfer
void copyInstanceCanceledByEngine();
+ /// \brief the interface have canceled the transfer
void copyInstanceCanceledByInterface();
+ /// \brief the transfer have been canceled
void copyInstanceCanceledByIndex(const int &index);
+ /// \brief only when the copy engine say it's ready to delete them self, it call this
+ void deleteCopyEngine();
+
+ // some stat update
void actionInProgess(const EngineActionInProgress &action);
void newFolderListing(const QString &path);
void newCollisionAction(const QString &action);
void newErrorAction(const QString &action);
void isInPause(const bool&);
- void periodiqueSync();
+
+ /** \brief update at periodic interval, the synchronization between copy engine and interface
+ \see forUpateInformation */
+ void periodicSynchronization();
+
+ //reset some information
void resetSpeedDetectedEngine();
void resetSpeedDetectedInterface();
+
+ //load the interface
void loadInterface();
void unloadInterface();
+
//error occurred
void error(const QString &path,const quint64 &size,const QDateTime &mtime,const QString &error);
//for the extra logging
void rmPath(const QString &path);
void mkPath(const QString &path);
+
+ /// \brief used to drag and drop files
void urlDropped(const QList<QUrl> &urls);
+ /// \brief to rsync after a new interface connection
void syncReady();
+
void getActionOnList(const QList<returnActionOnCopyList> & actionList);
+ void pushGeneralProgression(const quint64 &current,const quint64 &total);
};
#endif // CORE_H
diff --git a/DebugEngine.h b/DebugEngine.h
index d717c2e..fb1eda9 100644
--- a/DebugEngine.h
+++ b/DebugEngine.h
@@ -66,7 +66,7 @@ class DebugEngine : public QObject, public Singleton<DebugEngine>
/** \brief ask to the user where save the bug report
\warning This function can be only call by the graphical thread */
void saveBugReport();
- /// \todo Put into DebugEngine the dialog to send by the net
+
void addDebugInformation(const DebugLevel_custom &level,const QString& fonction,const QString& text,QString file="",const int& ligne=-1,const QString& location="Core");
private:
/// \brief Initiate the ultracopier event dispatcher and check if no other session is running
diff --git a/EventDispatcher.cpp b/EventDispatcher.cpp
index ba8b45c..a19cfd4 100644
--- a/EventDispatcher.cpp
+++ b/EventDispatcher.cpp
@@ -20,21 +20,20 @@
#include <windows.h>
#endif
-/// \todo group the facility engine
-
/// \brief Initiate the ultracopier event dispatcher and check if no other session is running
EventDispatcher::EventDispatcher()
{
- connect(&localListener,SIGNAL(cli(QStringList,bool)),&cliParser,SLOT(cli(QStringList,bool)),Qt::QueuedConnection);
- connect(themes, SIGNAL(newThemeOptions(QWidget*,bool,bool)), &optionDialog, SLOT(newThemeOptions(QWidget*,bool,bool)));
- connect(&cliParser, SIGNAL(newCopy(QStringList)), &copyServer, SLOT(newCopy(QStringList)));
- connect(&cliParser, SIGNAL(newCopy(QStringList,QString)), &copyServer, SLOT(newCopy(QStringList,QString)));
- connect(&cliParser, SIGNAL(newMove(QStringList)), &copyServer, SLOT(newMove(QStringList)));
- connect(&cliParser, SIGNAL(newMove(QStringList,QString)), &copyServer, SLOT(newMove(QStringList,QString)));
+ copyServer=new CopyListener(&optionDialog);
+ connect(&localListener,SIGNAL(cli(QStringList,bool,bool)),&cliParser,SLOT(cli(QStringList,bool,bool)),Qt::QueuedConnection);
+ connect(themes, SIGNAL(newThemeOptions(QString,QWidget*,bool,bool)), &optionDialog, SLOT(newThemeOptions(QString,QWidget*,bool,bool)));
+ connect(&cliParser, SIGNAL(newCopy(QStringList)), copyServer, SLOT(newCopy(QStringList)));
+ connect(&cliParser, SIGNAL(newCopy(QStringList,QString)), copyServer, SLOT(newCopy(QStringList,QString)));
+ connect(&cliParser, SIGNAL(newMove(QStringList)), copyServer, SLOT(newMove(QStringList)));
+ connect(&cliParser, SIGNAL(newMove(QStringList,QString)), copyServer, SLOT(newMove(QStringList,QString)));
copyMoveEventIdIndex=0;
backgroundIcon=NULL;
stopIt=false;
- sessionloader=new SessionLoader(this);
+ sessionloader=new SessionLoader(&optionDialog);
copyEngineList=new CopyEngineManager(&optionDialog);
core=new Core(copyEngineList);
qRegisterMetaType<CatchState>("CatchState");
@@ -61,7 +60,7 @@ EventDispatcher::EventDispatcher()
KeysList.clear();
KeysList.append(qMakePair(QString("Last_version_used"),QVariant("na")));
KeysList.append(qMakePair(QString("ActionOnManualOpen"),QVariant(1)));
- KeysList.append(qMakePair(QString("GroupWindowWhen"),QVariant(3)));
+ KeysList.append(qMakePair(QString("GroupWindowWhen"),QVariant(0)));
options->addOptionGroup("Ultracopier",KeysList);
if(options->getOptionValue("Ultracopier","Last_version_used")!=QVariant("na") && options->getOptionValue("Ultracopier","Last_version_used")!=QVariant(ULTRACOPIER_VERSION))
{
@@ -78,6 +77,8 @@ EventDispatcher::EventDispatcher()
KeysList.clear();
KeysList.append(qMakePair(QString("List"),QVariant(QStringList() << "Ultracopier-0.3")));
options->addOptionGroup("CopyEngine",KeysList);
+
+ connect(&cliParser, SIGNAL(newTransferList(QString,QString,QString)),core, SLOT(newTransferList(QString,QString,QString)));
}
/// \brief Destroy the ultracopier event dispatcher
@@ -92,6 +93,7 @@ EventDispatcher::~EventDispatcher()
delete sessionloader;
if(backgroundIcon!=NULL)
delete backgroundIcon;
+ delete copyServer;
}
/// \brief return if need be close
@@ -117,15 +119,17 @@ void EventDispatcher::initFunction()
return;
}
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"Initialize the variable of event loop");
- connect(&copyServer, SIGNAL(newCopy(quint32,QStringList,QStringList)), core, SLOT(newCopy(quint32,QStringList,QStringList)));
- connect(&copyServer, SIGNAL(newCopy(quint32,QStringList,QStringList,QString,QString)), core, SLOT(newCopy(quint32,QStringList,QStringList,QString,QString)));
- connect(&copyServer, SIGNAL(newMove(quint32,QStringList,QStringList)), core, SLOT(newMove(quint32,QStringList,QStringList)));
- connect(&copyServer, SIGNAL(newMove(quint32,QStringList,QStringList,QString,QString)), core, SLOT(newMove(quint32,QStringList,QStringList,QString,QString)));
- connect(core, SIGNAL(copyFinished(quint32,bool)), &copyServer, SLOT(copyFinished(quint32,bool)));
- connect(core, SIGNAL(copyCanceled(quint32)), &copyServer, SLOT(copyCanceled(quint32)));
+ connect(copyServer, SIGNAL(newCopy(quint32,QStringList,QStringList)), core, SLOT(newCopy(quint32,QStringList,QStringList)));
+ connect(copyServer, SIGNAL(newCopy(quint32,QStringList,QStringList,QString,QString)), core, SLOT(newCopy(quint32,QStringList,QStringList,QString,QString)));
+ connect(copyServer, SIGNAL(newMove(quint32,QStringList,QStringList)), core, SLOT(newMove(quint32,QStringList,QStringList)));
+ connect(copyServer, SIGNAL(newMove(quint32,QStringList,QStringList,QString,QString)), core, SLOT(newMove(quint32,QStringList,QStringList,QString,QString)));
+ connect(core, SIGNAL(copyFinished(quint32,bool)), copyServer, SLOT(copyFinished(quint32,bool)));
+ connect(core, SIGNAL(copyCanceled(quint32)), copyServer, SLOT(copyCanceled(quint32)));
if(localListener.tryConnect())
{
stopIt=true;
+ //why before removed???
+ QCoreApplication::quit();
return;
}
localListener.listenServer();
@@ -139,13 +143,13 @@ void EventDispatcher::initFunction()
connect(backgroundIcon, SIGNAL(quit()),this,SLOT(quit()));
//show option is for OptionEngine object
connect(backgroundIcon, SIGNAL(showOptions()), &optionDialog, SLOT(show()));
- connect(&copyServer, SIGNAL(listenerReady(ListeningState,bool,bool)), backgroundIcon, SLOT(listenerReady(ListeningState,bool,bool)));
- connect(&copyServer, SIGNAL(pluginLoaderReady(CatchState,bool,bool)), backgroundIcon, SLOT(pluginLoaderReady(CatchState,bool,bool)));
- connect(backgroundIcon, SIGNAL(tryCatchCopy()), &copyServer, SLOT(listen()));
- connect(backgroundIcon, SIGNAL(tryUncatchCopy()), &copyServer, SLOT(close()));
+ connect(copyServer, SIGNAL(listenerReady(ListeningState,bool,bool)), backgroundIcon, SLOT(listenerReady(ListeningState,bool,bool)));
+ connect(copyServer, SIGNAL(pluginLoaderReady(CatchState,bool,bool)), backgroundIcon, SLOT(pluginLoaderReady(CatchState,bool,bool)));
+ connect(backgroundIcon, SIGNAL(tryCatchCopy()), copyServer, SLOT(listen()));
+ connect(backgroundIcon, SIGNAL(tryUncatchCopy()), copyServer, SLOT(close()));
if(options->getOptionValue("CopyListener","CatchCopyAsDefault").toBool())
- copyServer.listen();
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"copyServer.oneListenerIsLoaded(): "+QString::number(copyServer.oneListenerIsLoaded()));
+ copyServer->listen();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"copyServer.oneListenerIsLoaded(): "+QString::number(copyServer->oneListenerIsLoaded()));
//backgroundIcon->readyToListen(copyServer.oneListenerIsLoaded());
connect(backgroundIcon, SIGNAL(addWindowCopyMove(CopyMode,QString)), core, SLOT(addWindowCopyMove(CopyMode,QString)));
@@ -153,7 +157,7 @@ void EventDispatcher::initFunction()
connect(copyEngineList, SIGNAL(addCopyEngine(QString,bool)), backgroundIcon, SLOT(addCopyEngine(QString,bool)));
connect(copyEngineList, SIGNAL(removeCopyEngine(QString)), backgroundIcon, SLOT(removeCopyEngine(QString)));
copyEngineList->setIsConnected();
- copyServer.resendState();
+ copyServer->resendState();
}
//conntect the last chance signal before quit
connect(QCoreApplication::instance(),SIGNAL(aboutToQuit()),this,SLOT(quit()));
diff --git a/EventDispatcher.h b/EventDispatcher.h
index 6f583bb..35a5d07 100644
--- a/EventDispatcher.h
+++ b/EventDispatcher.h
@@ -73,7 +73,7 @@ class EventDispatcher : public QObject, public GlobalClass
/// \brief the session loader
SessionLoader *sessionloader;
bool stopIt;
- CopyListener copyServer;
+ CopyListener *copyServer;
Core *core;
OptionDialog optionDialog;
CopyEngineManager *copyEngineList;
diff --git a/FacilityEngine.cpp b/FacilityEngine.cpp
index 1f18894..30c5168 100644
--- a/FacilityEngine.cpp
+++ b/FacilityEngine.cpp
@@ -20,14 +20,6 @@ FacilityEngine::FacilityEngine()
/// \brief To force the text re-translation
void FacilityEngine::retranslate()
{
- //translated string
- Translation_Copy_engine=tr("Copy engine");
- Translation_Copy=tr("Copy");
- Translation_Move=tr("Move");
- Translation_Pause=tr("Pause");
- Translation_Resume=tr("Resume");
- Translation_Skip=tr("Skip");
- Translation_Unlimited=tr("Unlimited");
//undirect translated string
Translation_perSecond="/"+tr("s");
Translation_tooBig=tr("Too big");
@@ -40,6 +32,46 @@ void FacilityEngine::retranslate()
Translation_EB=tr("EB");
Translation_ZB=tr("ZB");
Translation_YB=tr("YB");
+ Translation_SimplifiedRemaningTime_LessThan10s=tr("Less than %10 seconds");
+ Translation_SimplifiedRemaningTime_AboutSeconds=tr("About %10 seconds remaining");
+ Translation_SimplifiedRemaningTime_AboutMinutes=tr("About %1 minutes remaining");
+ Translation_SimplifiedRemaningTime_AboutHours=tr("About %1 hours remaining");
+ //load the translations tab
+ translations["Copy engine"]=tr("Copy engine");
+ translations["Copy"]=tr("Copy");
+ translations["Move"]=tr("Move");
+ translations["Pause"]=tr("Pause");
+ translations["Resume"]=tr("Resume");
+ translations["Skip"]=tr("Skip");
+ translations["Unlimited"]=tr("Unlimited");
+ translations["Source"]=tr("Source");
+ translations["Size"]=tr("Size");
+ translations["Destination"]=tr("Destination");
+ translations["Quit"]=tr("Quit");
+ translations["Target"]=tr("Target");
+ translations["Time remaining:"]=tr("Time remaining:");
+ translations["Listing"]=tr("Listing");
+ translations["Copying"]=tr("Copying");
+ translations["Listing and copying"]=tr("Listing and copying");
+ translations["Time remaining:"]=tr("Time remaining:");
+ //for copy engine
+ translations["Ask"]=tr("Ask");
+ translations["Skip"]=tr("Skip");
+ translations["Overwrite"]=tr("Overwrite");
+ translations["Overwrite if newer"]=tr("Overwrite if newer");
+ translations["Overwrite if the last modification dates are different"]=tr("Overwrite if the last modification dates are different");
+ translations["Rename"]=tr("Rename");
+ translations["Put to end of the list"]=tr("Put to end of the list");
+ translations["Select source directory"]=tr("Select source directory");
+ translations["Select destination directory"]=tr("Select destination directory");
+ translations["Internal error"]=tr("Internal error");
+ translations["Select one or more files to open"]=tr("Select one or more files to open");
+ translations["All files"]=tr("All files");
+ translations["Save transfer list"]=tr("Save transfer list");
+ translations["Open transfer list"]=tr("Open transfer list");
+ translations["Transfer list"]=tr("Transfer list");
+ translations["Error"]=tr("Error");
+ translations["Not supported on this platform"]=tr("Not supported on this platform");
}
/// \brief convert size in Byte to String
@@ -108,22 +140,13 @@ QString FacilityEngine::sizeUnitToString(const SizeUnit &sizeUnit)
/// \brief translate the text
QString FacilityEngine::translateText(const QString &text)
{
- if(text=="Copy engine")
- return Translation_Copy_engine;
- if(text=="Copy")
- return Translation_Copy;
- if(text=="Move")
- return Translation_Move;
- if(text=="Pause")
- return Translation_Pause;
- if(text=="Resume")
- return Translation_Resume;
- if(text=="Skip")
- return Translation_Skip;
- if(text=="Unlimited")
- return Translation_Unlimited;
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"text: "+text);
- return text;
+ if(translations.contains(text))
+ return translations[text];
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"text: "+text);
+ return text;
+ }
}
/// \brief speed to string in byte per seconds
@@ -168,3 +191,18 @@ QVariant FacilityEngine::callFunctionality(const QString &fonctionnality,const Q
Q_UNUSED(args);
return QVariant();
}
+
+/// \brief Do the simplified time
+QString FacilityEngine::simplifiedRemainingTime(const quint32 &seconds)
+{
+ if(seconds<50)
+ {
+ if(seconds<10)
+ return Translation_SimplifiedRemaningTime_LessThan10s.arg(seconds/10+1);
+ else
+ return Translation_SimplifiedRemaningTime_AboutSeconds.arg(seconds/10+1);
+ }
+ if(seconds<3600)
+ return Translation_SimplifiedRemaningTime_AboutMinutes.arg(seconds/60);
+ return Translation_SimplifiedRemaningTime_AboutHours.arg(seconds/3600);
+}
diff --git a/FacilityEngine.h b/FacilityEngine.h
index 221f801..d5a6145 100644
--- a/FacilityEngine.h
+++ b/FacilityEngine.h
@@ -12,6 +12,7 @@
#include <QVariant>
#include <QString>
#include <QStringList>
+#include <QHash>
#include "interface/FacilityInterface.h"
#include "Environment.h"
@@ -39,15 +40,9 @@ public:
bool haveFunctionality(const QString &fonctionnality);
/// \brief call the fonctionnality
QVariant callFunctionality(const QString &fonctionnality,const QStringList &args=QStringList());
+ /// \brief Do the simplified time
+ QString simplifiedRemainingTime(const quint32 &seconds);
private:
- //translated string
- QString Translation_Copy_engine;
- QString Translation_Copy;
- QString Translation_Move;
- QString Translation_Pause;
- QString Translation_Resume;
- QString Translation_Skip;
- QString Translation_Unlimited;
//undirect translated string
QString Translation_perSecond;
QString Translation_tooBig;
@@ -60,8 +55,14 @@ private:
QString Translation_EB;
QString Translation_ZB;
QString Translation_YB;
+ //simplified remaining time
+ QString Translation_SimplifiedRemaningTime_LessThan10s;
+ QString Translation_SimplifiedRemaningTime_AboutSeconds;
+ QString Translation_SimplifiedRemaningTime_AboutMinutes;
+ QString Translation_SimplifiedRemaningTime_AboutHours;
//internal fonction
QString adaptString(const float &nb);
+ QHash<QString,QString> translations;
public slots:
/// \brief To force the text re-translation
void retranslate();
diff --git a/HelpDialog.cpp b/HelpDialog.cpp
index c9137e9..2d06d54 100644
--- a/HelpDialog.cpp
+++ b/HelpDialog.cpp
@@ -61,7 +61,11 @@ void HelpDialog::reloadTextValue()
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
QString text=ui->label_ultracopier->text();
+ #ifdef ULTRACOPIER_VERSION_ULTIMATE
+ text=text.replace("%1",QString("Ultimate %1").arg(ULTRACOPIER_VERSION));
+ #else
text=text.replace("%1",ULTRACOPIER_VERSION);
+ #endif
ui->label_ultracopier->setText(text);
text=ui->label_description->text();
@@ -77,6 +81,7 @@ void HelpDialog::reloadTextValue()
ui->label_description->setText(text);
text=ui->label_site->text();
+ //: This site need be the official site of ultracopier, into the right languages, english if not exists
text=text.replace("%1",tr("http://ultracopier.first-world.info/"));
ui->label_site->setText(text);
diff --git a/HelpDialog.ui b/HelpDialog.ui
index 0707ab0..1826120 100644
--- a/HelpDialog.ui
+++ b/HelpDialog.ui
@@ -67,7 +67,7 @@
<item>
<widget class="QLabel" name="label_description">
<property name="text">
- <string>Based on Qt. It provide advanced copier with more advanced feature. It's under GPL3.
+ <string extracomment="%1 will be replaced by a variable content (normal, debug, ...)">Based on Qt. It provide advanced copier with more advanced feature. It's under GPL3.
This version is compiled as version: %1.</string>
</property>
</widget>
@@ -75,7 +75,7 @@ This version is compiled as version: %1.</string>
<item>
<widget class="QLabel" name="label_site">
<property name="text">
- <string>For more informations see the website &lt;a href=&quot;%1&quot; rel=&quot;%1&quot; title=&quot;%1&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;%1&lt;/span&gt;&lt;/a&gt;</string>
+ <string extracomment="%1 will be remplaced by the website into the corresponding languages">&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;For more information see the website &lt;a href=&quot;%1&quot;&gt;&lt;span style=&quot; text-decoration: underline; color:#0057ae;&quot;&gt;%1&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
</property>
<property name="openExternalLinks">
<bool>true</bool>
@@ -85,7 +85,7 @@ This version is compiled as version: %1.</string>
<item>
<widget class="QLabel" name="label_platform">
<property name="text">
- <string>Platform: %1</string>
+ <string extracomment="%1 will be replaced by the platform (windows, mac, linux, ...)">Platform: %1</string>
</property>
</widget>
</item>
diff --git a/LanguagesManager.cpp b/LanguagesManager.cpp
index a5be40d..f178c90 100755
--- a/LanguagesManager.cpp
+++ b/LanguagesManager.cpp
@@ -31,13 +31,14 @@ LanguagesManager::LanguagesManager()
}
//load the plugins
plugins->lockPluginListEdition();
- QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_Languages);
- foreach(PluginsAvailable currentPlugin,list)
- onePluginAdded(currentPlugin);
qRegisterMetaType<PluginsAvailable>("PluginsAvailable");
- connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this, SLOT(onePluginAdded(PluginsAvailable)));
+ connect(this,SIGNAL(previouslyPluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
+ connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this, SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
connect(plugins,SIGNAL(onePluginWillBeRemoved(PluginsAvailable)), this, SLOT(onePluginWillBeRemoved(PluginsAvailable)),Qt::DirectConnection);
- connect(plugins,SIGNAL(pluginListingIsfinish()), this, SLOT(allPluginIsLoaded()));
+ connect(plugins,SIGNAL(pluginListingIsfinish()), this, SLOT(allPluginIsLoaded()),Qt::QueuedConnection);
+ QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_Languages);
+ foreach(PluginsAvailable currentPlugin,list)
+ emit previouslyPluginAdded(currentPlugin);
plugins->unlockPluginListEdition();
//load the GUI option
QList<QPair<QString, QVariant> > KeysList;
@@ -46,8 +47,8 @@ LanguagesManager::LanguagesManager()
options->addOptionGroup("Language",KeysList);
// connect(this, SIGNAL(newLanguageLoaded(QString)), plugins,SLOT(refreshPluginList(QString)));
// connect(this, SIGNAL(newLanguageLoaded(QString)), this,SLOT(retranslateTheUI()));
- connect(options,SIGNAL(newOptionValue(QString,QString,QVariant)), this, SLOT(newOptionValue(QString)));
- connect(this, SIGNAL(newLanguageLoaded(QString)), plugins,SIGNAL(newLanguageLoaded()));
+ connect(options,SIGNAL(newOptionValue(QString,QString,QVariant)), this, SLOT(newOptionValue(QString)),Qt::QueuedConnection);
+ connect(this, SIGNAL(newLanguageLoaded(QString)), plugins,SIGNAL(newLanguageLoaded()),Qt::QueuedConnection);
}
/// \brief Destroy the language manager
diff --git a/LanguagesManager.h b/LanguagesManager.h
index 6d59284..a517cac 100644
--- a/LanguagesManager.h
+++ b/LanguagesManager.h
@@ -76,6 +76,7 @@ class LanguagesManager : public QObject, public Singleton<LanguagesManager>
signals:
//send the language is loaded or the new language is loaded
void newLanguageLoaded(const QString &mainShortName);
+ void previouslyPluginAdded(PluginsAvailable);
};
#endif // LANGUAGES_MANAGER_H
diff --git a/LocalListener.cpp b/LocalListener.cpp
index d76b505..3fcee9f 100644
--- a/LocalListener.cpp
+++ b/LocalListener.cpp
@@ -14,6 +14,7 @@ LocalListener::LocalListener(QObject *parent) :
TimeOutQLocalSocket.setInterval(500);
TimeOutQLocalSocket.setSingleShot(true);
connect(&TimeOutQLocalSocket, SIGNAL(timeout()), this, SLOT(timeoutDectected()));
+ connect(plugins,SIGNAL(pluginListingIsfinish()),this,SLOT(allPluginIsloaded()),Qt::QueuedConnection);
}
LocalListener::~LocalListener()
@@ -43,6 +44,7 @@ bool LocalListener::tryConnect()
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"localSocket is not valid!");
return false;
}
+ emit cli(ultracopierArguments,false,true);
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"connection succes, number arguments given: "+QString::number(ultracopierArguments.size()));
#ifdef ULTRACOPIER_DEBUG
for (int i = 0; i < ultracopierArguments.size(); ++i) {
@@ -95,7 +97,6 @@ bool LocalListener::tryConnect()
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"connection failed, continu...");
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"ultracopierArguments: "+ultracopierArguments.join(";"));
- emit cli(ultracopierArguments,false);
return false;
}
}
@@ -180,7 +181,7 @@ void LocalListener::dataIncomming()
QStringList ultracopierArguments;
in >> ultracopierArguments;
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"ultracopierArguments: "+ultracopierArguments.join(";"));
- emit cli(ultracopierArguments,true);
+ emit cli(ultracopierArguments,true,false);
clientList[index].data.clear();
clientList[index].haveData=false;
}
@@ -199,7 +200,7 @@ void LocalListener::dataIncomming()
QStringList ultracopierArguments;
in >> ultracopierArguments;
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"ultracopierArguments: "+ultracopierArguments.join(";"));
- emit cli(ultracopierArguments,true);
+ emit cli(ultracopierArguments,true,false);
clientList[index].data.clear();
clientList[index].haveData=false;
}
@@ -263,3 +264,15 @@ void LocalListener::error(QLocalSocket::LocalSocketError theErrorDefine)
}
}
#endif
+
+/// \can now parse the cli
+void LocalListener::allPluginIsloaded()
+{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ QStringList ultracopierArguments=QCoreApplication::arguments();
+ //remove excutable path because is useless (unsafe to use)
+ ultracopierArguments.removeFirst();
+ //add the current path to file full path resolution if needed
+ ultracopierArguments.insert(0,QFSFileEngine::currentPath());
+ emit cli(ultracopierArguments,false,false);
+}
diff --git a/LocalListener.h b/LocalListener.h
index 50905a9..a0fbee1 100644
--- a/LocalListener.h
+++ b/LocalListener.h
@@ -21,9 +21,10 @@
#include "Environment.h"
#include "ExtraSocket.h"
+#include "GlobalClass.h"
/** \brief To have unique instance, and pass arguments to the existing instance if needed */
-class LocalListener : public QObject
+class LocalListener : public QObject, public GlobalClass
{
Q_OBJECT
public:
@@ -58,8 +59,10 @@ private slots:
\param theErrorDefine The error define */
void error(QLocalSocket::LocalSocketError theErrorDefine);
#endif
+ /// \can now parse the cli
+ void allPluginIsloaded();
signals:
- void cli(const QStringList &ultracopierArguments,const bool &external);
+ void cli(const QStringList &ultracopierArguments,const bool &external,const bool &onlyCheck);
};
#endif // LOCALLISTENER_H
diff --git a/LogThread.cpp b/LogThread.cpp
index 0255905..9064b07 100644
--- a/LogThread.cpp
+++ b/LogThread.cpp
@@ -62,7 +62,7 @@ void LogThread::openLogs()
return;
if(log.isOpen())
{
- QMessageBox::critical(NULL,tr("Error"),tr("log file already open, error: %1").arg(log.errorString()));
+ QMessageBox::critical(NULL,tr("Error"),tr("Log file already open, error: %1").arg(log.errorString()));
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("log file already open, error: %1").arg(log.errorString()));
return;
}
diff --git a/OptionDialog.cpp b/OptionDialog.cpp
index ebc76a7..fcfbf06 100755
--- a/OptionDialog.cpp
+++ b/OptionDialog.cpp
@@ -16,27 +16,27 @@ OptionDialog::OptionDialog() :
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
ignoreCopyEngineListEdition=false;
+ allPluginsIsLoaded=false;
ui->setupUi(this);
ui->treeWidget->topLevelItem(0)->setSelected(true);
- ui->treeWidget->topLevelItem(2)->setExpanded(true);
- ui->pluginList->topLevelItem(0)->setExpanded(true);
- ui->pluginList->topLevelItem(1)->setExpanded(true);
- ui->pluginList->topLevelItem(2)->setExpanded(true);
- ui->pluginList->topLevelItem(3)->setExpanded(true);
- ui->pluginList->topLevelItem(4)->setExpanded(true);
- ui->pluginList->topLevelItem(5)->setExpanded(true);
+ ui->treeWidget->topLevelItem(3)->setTextColor(0,QColor(150, 150, 150, 255));
+ ui->treeWidget->topLevelItem(4)->setTextColor(0,QColor(150, 150, 150, 255));
+ ui->treeWidget->topLevelItem(5)->setTextColor(0,QColor(150, 150, 150, 255));
+ ui->treeWidget->expandAll();
+ ui->pluginList->expandAll();
on_treeWidget_itemSelectionChanged();
//load the plugins
plugins->lockPluginListEdition();
QList<PluginsAvailable> list=plugins->getPlugins();
- foreach(PluginsAvailable currentPlugin,list)
- onePluginAdded(currentPlugin);
qRegisterMetaType<PluginsAvailable>("PluginsAvailable");
+ connect(this,SIGNAL(previouslyPluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
connect(plugins, SIGNAL(onePluginAdded(PluginsAvailable)), this, SLOT(onePluginAdded(PluginsAvailable)));
connect(plugins, SIGNAL(onePluginWillBeRemoved(PluginsAvailable)), this, SLOT(onePluginWillBeRemoved(PluginsAvailable)),Qt::DirectConnection);
- connect(plugins, SIGNAL(pluginListingIsfinish()), this, SLOT(loadOption()));
+ connect(plugins, SIGNAL(pluginListingIsfinish()), this, SLOT(loadOption()),Qt::QueuedConnection);
connect(options, SIGNAL(newOptionValue(QString,QString,QVariant)), this, SLOT(newOptionValue(QString,QString,QVariant)));
+ foreach(PluginsAvailable currentPlugin,list)
+ emit previouslyPluginAdded(currentPlugin);
plugins->unlockPluginListEdition();
defaultImportBackend=PluginsManager::ImportBackend_File;
#ifndef ULTRACOPIER_PLUGIN_SUPPORT
@@ -89,6 +89,27 @@ void OptionDialog::onePluginAdded(PluginsAvailable plugin)
void OptionDialog::onePluginWillBeRemoved(PluginsAvailable plugin)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ //remove if have options
+ index=0;
+ loop_size=pluginOptionsWidgetList.size();
+ if(plugin.category==PluginType_CopyEngine || plugin.category==PluginType_Listener || plugin.category==PluginType_PluginLoader || plugin.category==PluginType_SessionLoader)
+ {
+ while(index<loop_size)
+ {
+ if(plugin.category==pluginOptionsWidgetList.at(index).category && plugin.name==pluginOptionsWidgetList.at(index).name)
+ {
+ if(pluginOptionsWidgetList.at(index).item->isSelected())
+ {
+ pluginOptionsWidgetList.at(index).item->setSelected(false);
+ ui->treeWidget->topLevelItem(0)->setSelected(true);
+ }
+ delete pluginOptionsWidgetList.at(index).item;
+ break;
+ }
+ index++;
+ }
+ }
+ //remove from general list
index=0;
loop_size=pluginLink.size();
while(index<loop_size)
@@ -100,8 +121,6 @@ void OptionDialog::onePluginWillBeRemoved(PluginsAvailable plugin)
removeLanguage(plugin);
else if(plugin.category==PluginType_Themes)
removeTheme(plugin);
- else if(plugin.category==PluginType_CopyEngine)
- removeCopyEngine(plugin);
pluginLink.removeAt(index);
return;
}
@@ -134,6 +153,7 @@ void OptionDialog::removeLanguage(PluginsAvailable plugin)
void OptionDialog::addTheme(PluginsAvailable plugin)
{
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"plugin.name: "+plugin.name);
ui->Ultracopier_current_theme->addItem(plugin.name,plugin.name);
}
@@ -151,16 +171,22 @@ void OptionDialog::changeEvent(QEvent *e)
case QEvent::LanguageChange:
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"retranslate the ui");
ui->retranslateUi(this);
+ //old code to reload the widget because it dropped by the translation
+ /*
index=0;
- loop_size=copyEngineList.size();
+ loop_size=pluginOptionsWidgetList.size();
while(index<loop_size)
{
- if(copyEngineList.at(index).options!=NULL)
- ui->treeWidget->topLevelItem(2)->addChild(copyEngineList.at(index).item);
+ if(pluginOptionsWidgetList.at(index).options!=NULL)
+ ui->treeWidget->topLevelItem(2)->addChild(pluginOptionsWidgetList.at(index).item);
else
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("the copy engine %1 have not the options").arg(index));
index++;
- }
+ }*/
+ ui->treeWidget->topLevelItem(2)->setText(0,tr("Copy engine"));
+ ui->treeWidget->topLevelItem(3)->setText(0,tr("Listener"));
+ ui->treeWidget->topLevelItem(4)->setText(0,tr("Plugin loader"));
+ ui->treeWidget->topLevelItem(5)->setText(0,tr("Session loader"));
ui->labelLoadAtSession->setToolTip(tr("Disabled because you have any SessionLoader plugin"));
ui->LoadAtSessionStarting->setToolTip(tr("Disabled because you have any SessionLoader plugin"));
ui->ActionOnManualOpen->setItemText(0,tr("Do nothing"));
@@ -184,34 +210,68 @@ void OptionDialog::on_treeWidget_itemSelectionChanged()
if(listSelectedItem.size()!=1)
return;
QTreeWidgetItem * selectedItem=listSelectedItem.first();
+ //general
if(selectedItem==ui->treeWidget->topLevelItem(0))
ui->stackedWidget->setCurrentIndex(0);
+ //plugins
else if(selectedItem==ui->treeWidget->topLevelItem(1))
ui->stackedWidget->setCurrentIndex(1);
+ //Copy engine
else if(selectedItem==ui->treeWidget->topLevelItem(2))
ui->stackedWidget->setCurrentIndex(2);
- else if(selectedItem==ui->treeWidget->topLevelItem(3))
- ui->stackedWidget->setCurrentIndex(3);
- else if(selectedItem==ui->treeWidget->topLevelItem(4))
- ui->stackedWidget->setCurrentIndex(4);
+ //Listener
+ //do nothing
+ //PluginLoader
+ //do nothing
+ //SessionLoader
+ //do nothing
+ //Themes
+ else if(selectedItem==ui->treeWidget->topLevelItem(6))
+ ui->stackedWidget->setCurrentIndex(7);
+ //log
+ else if(selectedItem==ui->treeWidget->topLevelItem(7))
+ ui->stackedWidget->setCurrentIndex(8);
else
{
- loadedCopyEnginePlugin=0;
- index=0;
- loop_size=copyEngineList.size();
- while(index<loop_size)
+ int index;
+ if(selectedItem->parent()==ui->treeWidget->topLevelItem(2))
{
- if(copyEngineList.at(index).options!=NULL)
- loadedCopyEnginePlugin++;
- if(copyEngineList.at(index).item->isSelected())
- {
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Information,"ui->stackedWidget->setCurrentIndex("+QString::number(3+loadedCopyEnginePlugin)+")");
- ui->stackedWidget->setCurrentIndex(4+loadedCopyEnginePlugin);
- return;
- }
- index++;
+ ui->stackedWidget->setCurrentIndex(3);
+ index=selectedItem->parent()->indexOfChild(selectedItem);
+ if(index!=-1)
+ ui->stackedOptionsCopyEngine->setCurrentIndex(index);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"selection into of sub item wrong???");
+ }
+ else if(selectedItem->parent()==ui->treeWidget->topLevelItem(3))
+ {
+ ui->stackedWidget->setCurrentIndex(4);
+ index=selectedItem->parent()->indexOfChild(selectedItem);
+ if(index!=-1)
+ ui->stackedOptionsListener->setCurrentIndex(index);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"selection into of sub item wrong???");
+ }
+ else if(selectedItem->parent()==ui->treeWidget->topLevelItem(4))
+ {
+ ui->stackedWidget->setCurrentIndex(5);
+ index=selectedItem->parent()->indexOfChild(selectedItem);
+ if(index!=-1)
+ ui->stackedOptionsPluginLoader->setCurrentIndex(index);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"selection into of sub item wrong???");
+ }
+ else if(selectedItem->parent()==ui->treeWidget->topLevelItem(5))
+ {
+ ui->stackedWidget->setCurrentIndex(6);
+ index=selectedItem->parent()->indexOfChild(selectedItem);
+ if(index!=-1)
+ ui->stackedOptionsSessionLoader->setCurrentIndex(index);
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"selection into of sub item wrong???");
}
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"selection into option list cat not found");
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"selection into option list cat not found");
}
}
@@ -263,6 +323,8 @@ void OptionDialog::loadOption()
ui->labelLoadAtSession->setEnabled(false);
ui->LoadAtSessionStarting->setEnabled(false);
}
+ allPluginsIsLoaded=true;
+ on_Ultracopier_current_theme_currentIndexChanged(ui->Ultracopier_current_theme->currentIndex());
}
void OptionDialog::newOptionValue(QString group,QString name,QVariant value)
@@ -273,9 +335,20 @@ void OptionDialog::newOptionValue(QString group,QString name,QVariant value)
{
int index=ui->Ultracopier_current_theme->findData(value.toString());
if(index!=-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"Themes located: "+value.toString());
ui->Ultracopier_current_theme->setCurrentIndex(index);
- else if(ui->Ultracopier_current_theme->count()>0)
- options->setOptionValue("Themes","Ultracopier_current_theme",ui->Ultracopier_current_theme->itemData(ui->Ultracopier_current_theme->currentIndex()));
+ }
+ else
+ {
+ if(ui->Ultracopier_current_theme->count()>0)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Default to the current value: "+ui->Ultracopier_current_theme->itemData(ui->Ultracopier_current_theme->currentIndex()).toString());
+ options->setOptionValue("Themes","Ultracopier_current_theme",ui->Ultracopier_current_theme->itemData(ui->Ultracopier_current_theme->currentIndex()));
+ }
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"No themes: "+value.toString());
+ }
}
}
else if(group=="Language")
@@ -316,7 +389,18 @@ void OptionDialog::newOptionValue(QString group,QString name,QVariant value)
if(name=="List")
{
if(!ignoreCopyEngineListEdition)
- ui->CopyEngineList->addItems(value.toStringList());
+ {
+ QStringList copyEngine=value.toStringList();
+ copyEngine.removeDuplicates();
+ int index=0;
+ int loop_size=ui->CopyEngineList->count();
+ while(index<loop_size)
+ {
+ copyEngine.removeOne(ui->CopyEngineList->item(index)->text());
+ index++;
+ }
+ ui->CopyEngineList->addItems(copyEngine);
+ }
}
}
else if(group=="Write_log")
@@ -373,13 +457,31 @@ void OptionDialog::newOptionValue(QString group,QString name,QVariant value)
void OptionDialog::on_Ultracopier_current_theme_currentIndexChanged(int index)
{
- if(index!=-1 && plugins->allPluginHaveBeenLoaded())
+ if(index!=-1 && allPluginsIsLoaded)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"data value: "+ui->Ultracopier_current_theme->itemData(index).toString()+", string value: "+ui->Ultracopier_current_theme->itemText(index)+", index: "+QString::number(index));
options->setOptionValue("Themes","Ultracopier_current_theme",ui->Ultracopier_current_theme->itemData(index));
+ int index_loop=0;
+ loop_size=pluginOptionsWidgetList.size();
+ while(index_loop<loop_size)
+ {
+ if(pluginOptionsWidgetList.at(index_loop).name==ui->Ultracopier_current_theme->itemData(index).toString())
+ {
+ if(pluginOptionsWidgetList.at(index_loop).options==NULL)
+ ui->stackedWidgetThemes->setCurrentIndex(1);
+ else
+ ui->stackedWidgetThemes->setCurrentWidget(pluginOptionsWidgetList.at(index_loop).options);
+ return;
+ }
+ index_loop++;
+ }
+ ui->stackedWidgetThemes->setCurrentIndex(0);
+ }
}
void OptionDialog::on_Language_currentIndexChanged(int index)
{
- if(index!=-1 && plugins->allPluginHaveBeenLoaded())
+ if(index!=-1 && allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"data value: "+ui->Language->itemData(index).toString()+", string value: "+ui->Language->itemText(index)+", index: "+QString::number(index));
options->setOptionValue("Language","Language",ui->Language->itemData(index));
@@ -388,7 +490,7 @@ void OptionDialog::on_Language_currentIndexChanged(int index)
void OptionDialog::on_Language_autodetect_toggled(bool checked)
{
- if(plugins->allPluginHaveBeenLoaded())
+ if(allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
options->setOptionValue("Language","Language_autodetect",checked);
@@ -397,7 +499,7 @@ void OptionDialog::on_Language_autodetect_toggled(bool checked)
void OptionDialog::on_CatchCopyAsDefault_toggled(bool checked)
{
- if(plugins->allPluginHaveBeenLoaded())
+ if(allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
options->setOptionValue("CopyListener","CatchCopyAsDefault",checked);
@@ -406,7 +508,7 @@ void OptionDialog::on_CatchCopyAsDefault_toggled(bool checked)
void OptionDialog::on_LoadAtSessionStarting_toggled(bool checked)
{
- if(plugins->allPluginHaveBeenLoaded())
+ if(allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
options->setOptionValue("SessionLoader","LoadAtSessionStarting",checked);
@@ -415,7 +517,7 @@ void OptionDialog::on_LoadAtSessionStarting_toggled(bool checked)
void OptionDialog::on_CopyEngineList_itemSelectionChanged()
{
- if(ui->CopyEngineList->selectedItems().size()!=0)
+ if(ui->CopyEngineList->selectedItems().size()!=0 && ui->CopyEngineList->count()>1)
{
ui->toolButtonUp->setEnabled(true);
ui->toolButtonDown->setEnabled(true);
@@ -473,89 +575,88 @@ QStringList OptionDialog::copyEngineStringList()
return newList;
}
-void OptionDialog::newThemeOptions(QWidget* theNewOptionsWidget,bool isLoaded,bool havePlugin)
+void OptionDialog::newThemeOptions(QString name,QWidget* theNewOptionsWidget,bool isLoaded,bool havePlugin)
{
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
- while(ui->stackedWidgetThemes->count()>3)
- ui->stackedWidgetThemes->removeWidget(ui->stackedWidgetThemes->widget(3));
+ Q_UNUSED(isLoaded);
+ Q_UNUSED(havePlugin);
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start: isLoaded: %1, havePlugin: %2, name: %3").arg(isLoaded).arg(havePlugin).arg(name));
+ pluginOptionsWidget tempItem;
+ tempItem.name=name;
+ tempItem.item=NULL;
+ tempItem.options=theNewOptionsWidget;
+ tempItem.category=PluginType_Themes;
+ pluginOptionsWidgetList << tempItem;
if(theNewOptionsWidget!=NULL)
{
ui->stackedWidgetThemes->addWidget(theNewOptionsWidget);
- ui->stackedWidgetThemes->setCurrentWidget(theNewOptionsWidget);
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"set the last page");
}
- else
- {
- if(isLoaded)
- {
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"set the page, no option for this plugin");
- ui->stackedWidgetThemes->setCurrentIndex(1);
- }
- else if(!havePlugin)
- {
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"set the page, no plugin");
- ui->stackedWidgetThemes->setCurrentIndex(2);
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"set the page, unable to load plugin options");
- ui->stackedWidgetThemes->setCurrentIndex(0);
- }
- }
+ on_Ultracopier_current_theme_currentIndexChanged(ui->Ultracopier_current_theme->currentIndex());
}
-void OptionDialog::removeCopyEngine(PluginsAvailable plugin)
+void OptionDialog::addPluginOptionWidget(PluginType category,QString name,QWidget * options)
{
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
- removeCopyEngineWidget(plugin.name);
-}
-
-void OptionDialog::addCopyEngineWidget(QString name,QWidget * options)
-{
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start: %1").arg(name));
- index=0;
- loop_size=copyEngineList.size();
- while(index<loop_size)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start: %1, category: %2").arg(name).arg(category));
+ //prevent send the empty options
+ if(options!=NULL)
{
- if(copyEngineList.at(index).name==name)
+ index=0;
+ loop_size=pluginOptionsWidgetList.size();
+ while(index<loop_size)
{
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"already found: "+name);
+ if(pluginOptionsWidgetList.at(index).name==name)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"already found: "+name);
+ return;
+ }
+ index++;
+ }
+ //add to real list
+ pluginOptionsWidget temp;
+ temp.name=name;
+ temp.options=options;
+ temp.item=new QTreeWidgetItem(QStringList() << name);
+ temp.category=category;
+ pluginOptionsWidgetList << temp;
+ //add the specific options
+ switch(category)
+ {
+ case PluginType_CopyEngine:
+ ui->treeWidget->topLevelItem(2)->addChild(pluginOptionsWidgetList.at(index).item);
+ ui->stackedOptionsCopyEngine->addWidget(options);
+ break;
+ case PluginType_Listener:
+ ui->treeWidget->topLevelItem(3)->addChild(pluginOptionsWidgetList.at(index).item);
+ ui->stackedOptionsListener->addWidget(options);
+ break;
+ case PluginType_PluginLoader:
+ ui->treeWidget->topLevelItem(4)->addChild(pluginOptionsWidgetList.at(index).item);
+ ui->stackedOptionsPluginLoader->addWidget(options);
+ break;
+ case PluginType_SessionLoader:
+ ui->treeWidget->topLevelItem(5)->addChild(pluginOptionsWidgetList.at(index).item);
+ ui->stackedOptionsSessionLoader->addWidget(options);
+ break;
+ default:
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"Unable to parse this unknow type of plugin: "+name);
return;
}
- index++;
}
- pluginCopyEngine temp;
- temp.item=new QTreeWidgetItem(QStringList() << name);
- temp.name=name;
- temp.options=options;
- copyEngineList << temp;
- ui->treeWidget->topLevelItem(2)->addChild(copyEngineList.at(index).item);
- ui->stackedWidget->addWidget(options);
-}
-
-void OptionDialog::removeCopyEngineWidget(QString name)
-{
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
- index=0;
- loop_size=copyEngineList.size();
- while(index<loop_size)
+ //only for copy engine
+ if(category==PluginType_CopyEngine)
{
- if(copyEngineList.at(index).name==name)
+ //but can loaded by the previous options
+ index=0;
+ loop_size=ui->CopyEngineList->count();
+ while(index<loop_size)
{
- if(copyEngineList.at(index).options!=NULL)
- ui->stackedWidget->removeWidget(copyEngineList.at(index).options);
- if(copyEngineList.at(index).item->isSelected())
- {
- copyEngineList.at(index).item->setSelected(false);
- ui->treeWidget->topLevelItem(0)->setSelected(true);
- }
- delete copyEngineList.at(index).item;
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"ui->stackedWidget->count(): "+QString::number(ui->stackedWidget->count()));
- return;
+ if(ui->CopyEngineList->item(index)->text()==name)
+ break;
+ index++;
}
- index++;
+ if(index==loop_size)
+ ui->CopyEngineList->addItems(QStringList() << name);
}
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"not found is the list: "+name);
}
void OptionDialog::on_pluginList_itemSelectionChanged()
@@ -622,7 +723,7 @@ void OptionDialog::on_pluginAdd_clicked()
void OptionDialog::on_checkBox_Log_clicked()
{
- if(plugins->allPluginHaveBeenLoaded())
+ if(allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
options->setOptionValue("Write_log","enabled",ui->checkBox_Log->isChecked());
@@ -634,7 +735,7 @@ void OptionDialog::on_checkBox_Log_clicked()
void OptionDialog::on_lineEditLog_File_editingFinished()
{
- if(plugins->allPluginHaveBeenLoaded())
+ if(allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
options->setOptionValue("Write_log","file",ui->lineEditLog_File->text());
@@ -643,7 +744,7 @@ void OptionDialog::on_lineEditLog_File_editingFinished()
void OptionDialog::on_lineEditLog_transfer_format_editingFinished()
{
- if(plugins->allPluginHaveBeenLoaded())
+ if(allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
options->setOptionValue("Write_log","transfer_format",ui->lineEditLog_transfer_format->text());
@@ -652,7 +753,7 @@ void OptionDialog::on_lineEditLog_transfer_format_editingFinished()
void OptionDialog::on_lineEditLog_error_format_editingFinished()
{
- if(plugins->allPluginHaveBeenLoaded())
+ if(allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
options->setOptionValue("Write_log","error_format",ui->lineEditLog_error_format->text());
@@ -661,7 +762,7 @@ void OptionDialog::on_lineEditLog_error_format_editingFinished()
void OptionDialog::on_checkBoxLog_transfer_clicked()
{
- if(plugins->allPluginHaveBeenLoaded())
+ if(allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
options->setOptionValue("Write_log","transfer",ui->checkBoxLog_transfer->isChecked());
@@ -670,7 +771,7 @@ void OptionDialog::on_checkBoxLog_transfer_clicked()
void OptionDialog::on_checkBoxLog_error_clicked()
{
- if(plugins->allPluginHaveBeenLoaded())
+ if(allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
options->setOptionValue("Write_log","error",ui->checkBoxLog_error->isChecked());
@@ -679,7 +780,7 @@ void OptionDialog::on_checkBoxLog_error_clicked()
void OptionDialog::on_checkBoxLog_folder_clicked()
{
- if(plugins->allPluginHaveBeenLoaded())
+ if(allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
options->setOptionValue("Write_log","folder",ui->checkBoxLog_folder->isChecked());
@@ -698,7 +799,7 @@ void OptionDialog::on_pushButton_clicked()
void OptionDialog::on_checkBoxLog_sync_clicked()
{
- if(plugins->allPluginHaveBeenLoaded())
+ if(allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
options->setOptionValue("Write_log","sync",ui->checkBoxLog_sync->isChecked());
@@ -707,7 +808,7 @@ void OptionDialog::on_checkBoxLog_sync_clicked()
void OptionDialog::on_ActionOnManualOpen_currentIndexChanged(int index)
{
- if(index!=-1 && plugins->allPluginHaveBeenLoaded())
+ if(index!=-1 && allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"data value: "+ui->ActionOnManualOpen->itemData(index).toString()+", string value: "+ui->ActionOnManualOpen->itemText(index)+", index: "+QString::number(index));
options->setOptionValue("Ultracopier","ActionOnManualOpen",index);
@@ -716,7 +817,7 @@ void OptionDialog::on_ActionOnManualOpen_currentIndexChanged(int index)
void OptionDialog::on_GroupWindowWhen_currentIndexChanged(int index)
{
- if(index!=-1 && plugins->allPluginHaveBeenLoaded())
+ if(index!=-1 && allPluginsIsLoaded)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"data value: "+ui->GroupWindowWhen->itemData(index).toString()+", string value: "+ui->GroupWindowWhen->itemText(index)+", index: "+QString::number(index));
options->setOptionValue("Ultracopier","GroupWindowWhen",index);
diff --git a/OptionDialog.h b/OptionDialog.h
index 39a1baf..9b1911c 100755
--- a/OptionDialog.h
+++ b/OptionDialog.h
@@ -29,9 +29,7 @@ public:
explicit OptionDialog();
~OptionDialog();
/** \brief add the option widget from copy engine */
- void addCopyEngineWidget(QString name,QWidget * options);
- /** \brief remove the option widget from copy engine */
- void removeCopyEngineWidget(QString name);
+ void addPluginOptionWidget(PluginType category,QString name,QWidget * options);
protected:
void changeEvent(QEvent *e);
private slots:
@@ -76,26 +74,29 @@ private:
bool isWritable;
};
QList<pluginStore> pluginLink;
- struct pluginCopyEngine
+ struct pluginOptionsWidget
{
QString name;
QTreeWidgetItem * item;
QWidget *options;
+ PluginType category;
};
- QList<pluginCopyEngine> copyEngineList;
+ QList<pluginOptionsWidget> pluginOptionsWidgetList;
void addLanguage(PluginsAvailable plugin);
void removeLanguage(PluginsAvailable plugin);
void addTheme(PluginsAvailable plugin);
void removeTheme(PluginsAvailable plugin);
- void removeCopyEngine(PluginsAvailable plugin);
QStringList copyEngineStringList();
bool ignoreCopyEngineListEdition;
PluginsManager::ImportBackend defaultImportBackend;
int index,loop_size;
int loadedCopyEnginePlugin;
QTreeWidgetItem * treeWidgetItem;
+ bool allPluginsIsLoaded;
public slots:
- void newThemeOptions(QWidget* theNewOptionsWidget,bool isLoaded,bool havePlugin);
+ void newThemeOptions(QString name,QWidget* theNewOptionsWidget,bool isLoaded,bool havePlugin);
+signals:
+ void previouslyPluginAdded(PluginsAvailable);
};
#endif // OPTIONDIALOG_H
diff --git a/OptionDialog.ui b/OptionDialog.ui
index 873f75a..61f134d 100644
--- a/OptionDialog.ui
+++ b/OptionDialog.ui
@@ -13,6 +13,10 @@
<property name="windowTitle">
<string>Options</string>
</property>
+ <property name="windowIcon">
+ <iconset resource="resources/resources.qrc">
+ <normaloff>:/options.png</normaloff>:/options.png</iconset>
+ </property>
<layout class="QVBoxLayout" name="verticalLayout">
<property name="spacing">
<number>1</number>
@@ -64,6 +68,30 @@
</item>
<item>
<property name="text">
+ <string>Listener</string>
+ </property>
+ <property name="flags">
+ <set>ItemIsDragEnabled|ItemIsUserCheckable|ItemIsEnabled</set>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Plugin loader</string>
+ </property>
+ <property name="flags">
+ <set>ItemIsDragEnabled|ItemIsUserCheckable|ItemIsEnabled</set>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Session loader</string>
+ </property>
+ <property name="flags">
+ <set>ItemIsDragEnabled|ItemIsUserCheckable|ItemIsEnabled</set>
+ </property>
+ </item>
+ <item>
+ <property name="text">
<string>Themes</string>
</property>
</item>
@@ -77,7 +105,7 @@
<item>
<widget class="QStackedWidget" name="stackedWidget">
<property name="currentIndex">
- <number>0</number>
+ <number>8</number>
</property>
<widget class="QWidget" name="stackedWidgetGeneral">
<layout class="QVBoxLayout" name="verticalLayout_10">
@@ -198,7 +226,7 @@
<item row="5" column="0">
<widget class="QLabel" name="label_9">
<property name="text">
- <string>Group window when:</string>
+ <string>Group the windows when:</string>
</property>
</widget>
</item>
@@ -408,7 +436,35 @@
</item>
</layout>
</widget>
- <widget class="QWidget" name="page">
+ <widget class="QWidget" name="stackedWidgetCopyEngine_2">
+ <layout class="QHBoxLayout" name="horizontalLayout_5">
+ <item>
+ <widget class="QStackedWidget" name="stackedOptionsCopyEngine"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="stackedWidgetListener">
+ <layout class="QVBoxLayout" name="verticalLayout_11">
+ <item>
+ <widget class="QStackedWidget" name="stackedOptionsListener"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="stackedWidgetPluginLoader">
+ <layout class="QVBoxLayout" name="verticalLayout_12">
+ <item>
+ <widget class="QStackedWidget" name="stackedOptionsPluginLoader"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="stackedWidgetSessionLoader">
+ <layout class="QVBoxLayout" name="verticalLayout_13">
+ <item>
+ <widget class="QStackedWidget" name="stackedOptionsSessionLoader"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="stackedWidgetThemes_2">
<layout class="QVBoxLayout" name="verticalLayout_6">
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
@@ -568,61 +624,11 @@
</item>
</layout>
</widget>
- <widget class="QWidget" name="page_4">
- <layout class="QVBoxLayout" name="verticalLayout_9">
- <item>
- <spacer name="verticalSpacer_7">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>109</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="label_6">
- <property name="pixmap">
- <pixmap resource="resources/resources.qrc">:/none-128x128.png</pixmap>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_7">
- <property name="text">
- <string>No plugin loaded</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_6">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>109</height>
- </size>
- </property>
- </spacer>
- </item>
- </layout>
- </widget>
</widget>
</item>
</layout>
</widget>
- <widget class="QWidget" name="page_5">
+ <widget class="QWidget" name="stackedWidgetLog">
<layout class="QVBoxLayout" name="verticalLayout_5">
<item>
<widget class="QCheckBox" name="checkBox_Log">
@@ -678,10 +684,20 @@
<item>
<widget class="QLineEdit" name="lineEditLog_transfer_format">
<property name="toolTip">
- <string>The variables are %time%, %source%, %size%, %destination%</string>
+ <string extracomment="%time%, %source%, %size%, %destination% should not be translated">The variables are %time%, %source%, %size%, %destination%</string>
</property>
<property name="placeholderText">
- <string>Format</string>
+ <string notr="true">[%time%] %source% (%size%) %destination%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_6">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string extracomment="%time%, %source%, %size%, %destination% should not be translated">The variables are %time%, %source%, %size%, %destination%</string>
</property>
</widget>
</item>
@@ -698,10 +714,20 @@
<item>
<widget class="QLineEdit" name="lineEditLog_error_format">
<property name="toolTip">
- <string>The variables are %time%, %path%, %size%, %mtime%, %error%</string>
+ <string extracomment="%time%, %path%, %size%, %mtime%, %error% should not be translated">The variables are %time%, %path%, %size%, %mtime%, %error%</string>
</property>
<property name="placeholderText">
- <string>Format</string>
+ <string notr="true">[%time%] %path%, %error%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_7">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string extracomment="%time%, %path%, %size%, %mtime%, %error% should not be translated">The variables are %time%, %path%, %size%, %mtime%, %error%</string>
</property>
</widget>
</item>
@@ -720,8 +746,21 @@
<property name="enabled">
<bool>false</bool>
</property>
+ <property name="toolTip">
+ <string extracomment="%path%, %operation% should not be translated">The variables are %path%, %operation%</string>
+ </property>
<property name="placeholderText">
- <string>Format</string>
+ <string notr="true">[%time%] %operation% %path%</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QLabel" name="label_10">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string extracomment="%path%, %operation% should not be translated">The variables are %path%, %operation%</string>
</property>
</widget>
</item>
diff --git a/OptionEngine.cpp b/OptionEngine.cpp
index 807e027..a05d9b8 100644
--- a/OptionEngine.cpp
+++ b/OptionEngine.cpp
@@ -88,26 +88,11 @@ bool OptionEngine::addOptionGroup(const QString &groupName,const QList<QPair<QSt
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start(\""+groupName+"\",[...])");
//search if previous with the same name exists
- indexGroup=0;
- loop_size=GroupKeysList.size();
- while(indexGroup<loop_size)
+ if(GroupKeysList.contains(groupName))
{
- if(GroupKeysList.at(indexGroup).groupName==groupName)
- {
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"group already used previously");
- break;
- }
- indexGroup++;
- }
- //else create the entry
- if(indexGroup==loop_size)
- {
- OptionEngineGroup tempEntry;
- tempEntry.groupName=groupName;
- GroupKeysList << tempEntry;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"group already used previously");
+ return false;
}
- //here GroupKeysList.at(indexGroup) can be used
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"variable used: GroupKeysList.at("+QString::number(indexGroup)+")");
//if the backend is file, enter into the group
if(currentBackend==File)
settings->beginGroup(groupName);
@@ -118,29 +103,30 @@ bool OptionEngine::addOptionGroup(const QString &groupName,const QList<QPair<QSt
while(index<loop_size)
{
OptionEngineGroupKey theCurrentKey;
- theCurrentKey.variableName=KeysList.at(index).first;
theCurrentKey.defaultValue=KeysList.at(index).second;
- theCurrentKey.emptyList=false;
//if memory backend, load the default value into the current value
if(currentBackend==Memory)
theCurrentKey.currentValue=theCurrentKey.defaultValue;
- else if(settings->contains(theCurrentKey.variableName))//if file backend, load the default value from the file
- theCurrentKey.currentValue=settings->value(theCurrentKey.variableName);
- else //or if not found load the default value and set into the file
- {
- theCurrentKey.currentValue=theCurrentKey.defaultValue;
- //to switch default value if is unchanged
- //settings->setValue(theCurrentKey.variableName,theCurrentKey.defaultValue);
- }
- if(settings->status()!=QSettings::NoError)
+ else
{
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Have writing error, switch to memory only options");
- #ifdef ULTRACOPIER_VERSION_PORTABLE
- resources->disableWritablePath();
- #endif // ULTRACOPIER_VERSION_PORTABLE
- currentBackend=Memory;
+ if(settings->contains(KeysList.at(index).first))//if file backend, load the default value from the file
+ theCurrentKey.currentValue=settings->value(KeysList.at(index).first);
+ else //or if not found load the default value and set into the file
+ {
+ theCurrentKey.currentValue=theCurrentKey.defaultValue;
+ //to switch default value if is unchanged
+ //settings->setValue(KeysList.at(index).first,theCurrentKey.defaultValue);
+ }
+ if(settings->status()!=QSettings::NoError)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Have writing error, switch to memory only options");
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ resources->disableWritablePath();
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ currentBackend=Memory;
+ }
}
- GroupKeysList[indexGroup].KeysList << theCurrentKey;
+ GroupKeysList[groupName][KeysList.at(index).first]=theCurrentKey;
index++;
}
//if the backend is file, leave into the group
@@ -153,46 +139,24 @@ bool OptionEngine::addOptionGroup(const QString &groupName,const QList<QPair<QSt
bool OptionEngine::removeOptionGroup(const QString &groupName)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start, groupName: "+groupName);
- indexGroup=0;
- loop_size=GroupKeysList.size();
- while(indexGroup<loop_size)
- {
- if(GroupKeysList.at(indexGroup).groupName==groupName)
- {
- GroupKeysList.removeAt(indexGroup);
- return true;
- }
- indexGroup++;
- }
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName);
+ if(GroupKeysList.remove(groupName)!=1)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName);
return false;
}
/// \brief To get option value
QVariant OptionEngine::getOptionValue(const QString &groupName,const QString &variableName)
{
- indexGroup=0;
- loop_size=GroupKeysList.size();
- while(indexGroup<loop_size)
+ if(GroupKeysList.contains(groupName))
{
- if(GroupKeysList.at(indexGroup).groupName==groupName)
- {
- //search if previous with the same name exists
- indexGroupKey=0;
- loop_sub_size=GroupKeysList.at(indexGroup).KeysList.size();
- while(indexGroupKey<loop_sub_size)
- {
- if(GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).variableName==variableName)
- return GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).currentValue;
- indexGroupKey++;
- }
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName+", variableName: "+variableName);
- return QVariant();
- }
- indexGroup++;
+ if(GroupKeysList[groupName].contains(variableName))
+ return GroupKeysList[groupName][variableName].currentValue;
+ QMessageBox::critical(NULL,"Internal error",tr("Try get variable, but the variable is not found: %1 %2").arg(groupName).arg(variableName));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName+", variableName: "+variableName);
+ return QVariant();
}
- QMessageBox::critical(NULL,"Internal error","Get the option value but not found");
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"group \""+groupName+"\" not found, internal bug!");
+ QMessageBox::critical(NULL,"Internal error",tr("Try get variable, but the variable is not found: %1 %2").arg(groupName).arg(variableName));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("Try get variable, but the variable is not found: %1 %2").arg(groupName).arg(variableName));
//return default value
return QVariant();
}
@@ -201,67 +165,64 @@ QVariant OptionEngine::getOptionValue(const QString &groupName,const QString &va
void OptionEngine::setOptionValue(const QString &groupName,const QString &variableName,const QVariant &value)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"groupName: \""+groupName+"\", variableName: \""+variableName+"\", value: \""+value.toString()+"\"");
- indexGroup=0;
- loop_size=GroupKeysList.size();
- while(indexGroup<loop_size)
+
+ if(GroupKeysList.contains(groupName))
{
- if(GroupKeysList.at(indexGroup).groupName==groupName)
+ if(GroupKeysList[groupName].contains(variableName))
{
- //search if previous with the same name exists
- indexGroupKey=0;
- loop_sub_size=GroupKeysList.at(indexGroup).KeysList.size();
- while(indexGroupKey<loop_sub_size)
+ //prevent re-write the same value into the variable
+ if(GroupKeysList[groupName][variableName].currentValue==value)
+ return;
+ //write ONLY the new value
+ GroupKeysList[groupName][variableName].currentValue=value;
+ if(currentBackend==File)
{
- if(GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).variableName==variableName)
+ settings->beginGroup(groupName);
+ settings->setValue(variableName,value);
+ settings->endGroup();
+ if(settings->status()!=QSettings::NoError)
{
- if(GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).currentValue!=value) //protection to prevent same value writing
- {
- GroupKeysList[indexGroup].KeysList[indexGroupKey].currentValue=value;
- if(currentBackend==File)
- {
- settings->beginGroup(groupName);
- settings->setValue(variableName,value);
- settings->endGroup();
- if(settings->status()!=QSettings::NoError)
- {
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Have writing error, switch to memory only options");
- #ifdef ULTRACOPIER_VERSION_PORTABLE
- resources->disableWritablePath();
- #endif // ULTRACOPIER_VERSION_PORTABLE
- currentBackend=Memory;
- }
- }
- emit newOptionValue(groupName,variableName,value);
- }
- return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Have writing error, switch to memory only options");
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ resources->disableWritablePath();
+ #endif // ULTRACOPIER_VERSION_PORTABLE
+ currentBackend=Memory;
}
- indexGroupKey++;
}
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"value not found, internal bug, groupName: \""+groupName+"\", variableName: \""+variableName+"\", value: \""+value.toString()+"\"");
+ emit newOptionValue(groupName,variableName,value);
return;
}
- indexGroup++;
+ QMessageBox::critical(NULL,"Internal error",tr("Try get variable, but the variable is not found: %1 %2").arg(groupName).arg(variableName));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"value not found, internal bug, groupName: "+groupName+", variableName: "+variableName);
+ return;
}
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"group \""+groupName+"\" not found, internal bug, groupName: \""+groupName+"\", variableName: \""+variableName+"\", value: \""+value.toString()+"\"");
+ QMessageBox::critical(NULL,"Internal error",tr("Try get variable, but the variable is not found: %1 %2").arg(groupName).arg(variableName));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,QString("Try get variable, but the variable is not found: %1 %2").arg(groupName).arg(variableName));
}
//the reset of right value of widget need be do into the calling object
void OptionEngine::internal_resetToDefaultValue()
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
- int indexGroup=0;
- while(indexGroup<GroupKeysList.size())
+
+ QHash<QString,QHash<QString,OptionEngineGroupKey> >::const_iterator i = GroupKeysList.constBegin();
+ QHash<QString,QHash<QString,OptionEngineGroupKey> >::const_iterator i_end = GroupKeysList.constEnd();
+ QHash<QString,OptionEngineGroupKey>::const_iterator j;
+ QHash<QString,OptionEngineGroupKey>::const_iterator j_end;
+ while (i != i_end)
{
- //search if previous with the same name exists
- int indexGroupKey=0;
- while(indexGroupKey<GroupKeysList.at(indexGroup).KeysList.size())
+ j = i.value().constBegin();
+ j_end = i.value().constEnd();
+ while (j != j_end)
{
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"option check: "+GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).variableName);
- if(GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).currentValue!=GroupKeysList.at(indexGroup).KeysList.at(indexGroupKey).defaultValue)
- GroupKeysList[indexGroup].KeysList[indexGroupKey].currentValue=GroupKeysList[indexGroup].KeysList[indexGroupKey].defaultValue;
- indexGroupKey++;
+ if(j.value().currentValue!=j.value().defaultValue)
+ {
+ GroupKeysList[i.key()][j.key()].currentValue=j.value().defaultValue;
+ emit newOptionValue(i.key(),j.key(),j.value().currentValue);
+ }
+ ++j;
}
- indexGroup++;
+ ++i;
}
}
diff --git a/OptionEngine.h b/OptionEngine.h
index 9605535..0b13848 100644
--- a/OptionEngine.h
+++ b/OptionEngine.h
@@ -21,6 +21,7 @@
#include <QAbstractButton>
#include <QTimer>
#include <QWidget>
+#include <QHash>
#include "interface/OptionInterface.h"
@@ -60,20 +61,13 @@ class OptionEngine : public QObject, public Singleton<OptionEngine>
/// \brief OptionEngineGroupKey then: Group -> Key
struct OptionEngineGroupKey
{
- QString variableName;
QVariant defaultValue;
QVariant currentValue;
bool emptyList;
};
- /// \brief OptionEngineGroup then: Group
- struct OptionEngineGroup
- {
- QString groupName;
- QList<OptionEngineGroupKey> KeysList;
- };
/// \brief store the option group list
- QList<OptionEngineGroup> GroupKeysList;
+ QHash<QString,QHash<QString,OptionEngineGroupKey> > GroupKeysList;
QStringList unmanagedTabName;
/// \brief Enumeration of backend
enum Backend
diff --git a/PluginLoader.cpp b/PluginLoader.cpp
index 2a59cb9..1e63633 100755
--- a/PluginLoader.cpp
+++ b/PluginLoader.cpp
@@ -7,22 +7,23 @@
#include "PluginLoader.h"
-PluginLoader::PluginLoader(QObject *parent) :
- QObject(parent)
+PluginLoader::PluginLoader(OptionDialog *optionDialog)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ this->optionDialog=optionDialog;
//load the overall instance
plugins=PluginsManager::getInstance();
//load the plugin
plugins->lockPluginListEdition();
- QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_PluginLoader);
- foreach(PluginsAvailable currentPlugin,list)
- onePluginAdded(currentPlugin);
qRegisterMetaType<PluginsAvailable>("PluginsAvailable");
qRegisterMetaType<CatchState>("CatchState");
- connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)));
+ connect(this,SIGNAL(previouslyPluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
+ connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
connect(plugins,SIGNAL(onePluginWillBeRemoved(PluginsAvailable)), this,SLOT(onePluginWillBeRemoved(PluginsAvailable)),Qt::DirectConnection);
- connect(plugins,SIGNAL(pluginListingIsfinish()), this,SLOT(allPluginIsloaded()));
+ connect(plugins,SIGNAL(pluginListingIsfinish()), this,SLOT(allPluginIsloaded()),Qt::QueuedConnection);
+ QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_PluginLoader);
+ foreach(PluginsAvailable currentPlugin,list)
+ emit previouslyPluginAdded(currentPlugin);
plugins->unlockPluginListEdition();
needEnable=false;
last_state=Uncaught;
@@ -83,7 +84,9 @@ void PluginLoader::onePluginAdded(const PluginsAvailable &plugin)
newEntry.inWaitOfReply = false;
pluginList << newEntry;
PluginLoader->setResources(newEntry.options,plugin.writablePath,plugin.path,ULTRACOPIER_VERSION_PORTABLE_BOOL);
+ optionDialog->addPluginOptionWidget(PluginType_PluginLoader,plugin.name,newEntry.PluginLoaderInterface->options());
connect(pluginList.last().PluginLoaderInterface,SIGNAL(newState(CatchState)),this,SLOT(newState(CatchState)));
+ connect(languages,SIGNAL(newLanguageLoaded(QString)),newEntry.PluginLoaderInterface,SLOT(newLanguageLoaded()));
if(needEnable)
{
pluginList.last().inWaitOfReply=true;
@@ -133,6 +136,7 @@ void PluginLoader::load()
pluginList.at(index).PluginLoaderInterface->setEnabled(true);
index++;
}
+ sendState(true);
}
void PluginLoader::unload()
@@ -146,6 +150,7 @@ void PluginLoader::unload()
pluginList.at(index).PluginLoaderInterface->setEnabled(false);
index++;
}
+ sendState(true);
}
#ifdef ULTRACOPIER_DEBUG
@@ -185,7 +190,12 @@ void PluginLoader::sendState(bool force)
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("current_state: %1").arg(current_state));
if(current_state==Uncaught)
{
- if(found_not_listen && !found_listen)
+ if(!found_not_listen && !found_listen)
+ {
+ if(needEnable)
+ current_state=Caught;
+ }
+ else if(found_not_listen && !found_listen)
current_state=Uncaught;
else if(!found_not_listen && found_listen)
current_state=Caught;
@@ -200,7 +210,7 @@ void PluginLoader::sendState(bool force)
}
else
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("Skip the signal sending"));
- last_state=Uncaught;
+ last_state=current_state;
last_have_plugin=have_plugin;
last_inWaitOfReply=found_inWaitOfReply;
}
diff --git a/PluginLoader.h b/PluginLoader.h
index 0632709..010956a 100755
--- a/PluginLoader.h
+++ b/PluginLoader.h
@@ -20,14 +20,12 @@ This class load ALL plugin compatible to listen and catch the copy/move
#include "interface/PluginInterface_PluginLoader.h"
#include "PluginsManager.h"
#include "GlobalClass.h"
+#include "OptionDialog.h"
namespace Ui {
class PluginLoaderOptions;
}
-/// \todo PluginLoader -> put plugin by plugin loading to add plugin no reload all
-/// \todo async the plugin call
-
/** \brief Load the plugin
It use ResourcesManager(), but it provide more higher abstraction. It parse the plugins information, check it, check the dependancies.
@@ -38,7 +36,7 @@ class PluginLoader : public QObject, GlobalClass
{
Q_OBJECT
public:
- explicit PluginLoader(QObject *parent = 0);
+ explicit PluginLoader(OptionDialog *optionDialog);
~PluginLoader();
/** \brief to rended the state */
void resendState();
@@ -72,8 +70,10 @@ private:
CatchState last_state;
bool last_have_plugin,last_inWaitOfReply;
void sendState(bool force=false);
+ OptionDialog *optionDialog;
signals:
void pluginLoaderReady(CatchState state,bool havePlugin,bool someAreInWaitOfReply);
+ void previouslyPluginAdded(PluginsAvailable);
};
#endif // PluginLoader_H
diff --git a/PluginsManager.cpp b/PluginsManager.cpp
index 4dc9157..e3c71ec 100644
--- a/PluginsManager.cpp
+++ b/PluginsManager.cpp
@@ -29,10 +29,10 @@ PluginsManager::PluginsManager()
englishPluginType << "CopyEngine" << "Languages" << "Listener" << "PluginLoader" << "SessionLoader" << "Themes";
//catPlugin << tr("CopyEngine") << tr("Languages") << tr("Listener") << tr("PluginLoader") << tr("SessionLoader") << tr("Themes");
importingPlugin=false;
- connect(&decodeThread, SIGNAL(decodedIsFinish()), this, SLOT(decodingFinished()));
- connect(checkPluginThread, SIGNAL(authentifiedPath(QString)), this, SLOT(newAuthPath(QString)));
- connect(this, SIGNAL(finished()), this, SLOT(post_operation()));
- connect(this, SIGNAL(newLanguageLoaded()), &pluginInformationWindows, SLOT(retranslateInformation()));
+ connect(&decodeThread, SIGNAL(decodedIsFinish()), this, SLOT(decodingFinished()),Qt::QueuedConnection);
+ connect(checkPluginThread, SIGNAL(authentifiedPath(QString)), this, SLOT(newAuthPath(QString)),Qt::QueuedConnection);
+ connect(this, SIGNAL(finished()), this, SLOT(post_operation()),Qt::QueuedConnection);
+ connect(this, SIGNAL(newLanguageLoaded()), &pluginInformationWindows, SLOT(retranslateInformation()),Qt::QueuedConnection);
// connect(this, SIGNAL(pluginListingIsfinish()), options,SLOT(setInterfaceValue()));
//load the plugins list
/// \bug bug when I put here: moveToThread(this);, due to the direction connection to remove the plugin
@@ -100,9 +100,9 @@ void PluginsManager::run()
QDir dir(pluginComposed);
if(stopIt)
return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"search plugin into: "+pluginComposed);
if(dir.exists())
{
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"search plugin into: "+pluginComposed);
foreach(QString dirName, dir.entryList(QDir::Dirs|QDir::NoDotAndDotDot))
{
if(stopIt)
@@ -164,11 +164,12 @@ QString PluginsManager::categoryToTranslation(const PluginType &category)
bool PluginsManager::isSamePlugin(const PluginsAvailable &pluginA,const PluginsAvailable &pluginB)
{
- if(pluginA.category!=pluginB.category)
- return false;
+ /*if(pluginA.category!=pluginB.category)
+ return false;*/
+ //only this test should be suffisent
if(pluginA.path!=pluginB.path)
return false;
- if(pluginA.name!=pluginB.name)
+ /*if(pluginA.name!=pluginB.name)
return false;
if(pluginA.writablePath!=pluginB.writablePath)
return false;
@@ -177,7 +178,7 @@ bool PluginsManager::isSamePlugin(const PluginsAvailable &pluginA,const PluginsA
if(pluginA.version!=pluginB.version)
return false;
if(pluginA.informations!=pluginB.informations)
- return false;
+ return false;*/
return true;
}
@@ -215,6 +216,8 @@ bool PluginsManager::loadPluginInformation(const QString &path)
}
editionSemList.acquire();
pluginsList << tempPlugin;
+ if(tempPlugin.errorString=="")
+ pluginsListIndexed.insert(tempPlugin.category,tempPlugin);
editionSemList.release();
if(tempPlugin.errorString=="")
{
@@ -283,7 +286,7 @@ void PluginsManager::loadPluginXml(PluginsAvailable * thePlugin,const QByteArray
else if(tempCat=="Themes")
thePlugin->category=PluginType_Themes;
else
- thePlugin->errorString="Unknow category: "+(int)thePlugin->category;
+ thePlugin->errorString="Unknow category: "+QString::number((int)thePlugin->category);
if(thePlugin->errorString.isEmpty())
{
if(thePlugin->category!=PluginType_Languages)
@@ -578,15 +581,7 @@ bool PluginsManager::compareVersion(const QString &versionA,const QString &sign,
QList<PluginsAvailable> PluginsManager::getPluginsByCategory(const PluginType &category)
{
- QList<PluginsAvailable> list;
- int index=0,loop_size=pluginsList.size();
- while(index<loop_size)
- {
- if(pluginsList.at(index).category==category && pluginsList.at(index).errorString=="")
- list<<pluginsList.at(index);
- index++;
- }
- return list;
+ return pluginsListIndexed.values(category);
}
QList<PluginsAvailable> PluginsManager::getPlugins()
@@ -603,7 +598,6 @@ QList<PluginsAvailable> PluginsManager::getPlugins()
}
/// \brief show the information
-/// \todo pass plugin info
void PluginsManager::showInformation(const QString &path)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
@@ -636,7 +630,6 @@ void PluginsManager::removeThePluginSelected(const QString &path)
if(pluginsList.at(index).path==path)
{
QMessageBox::StandardButton reply;
- /// \todo check if previous version as internal, if yes ask if switch to it, else remove and do marked to disable the internal version too
// if(pluginsList.at(index).internalVersionAlternative.isEmpty())
reply = QMessageBox::question(NULL,tr("Remove %1").arg(pluginsList.at(index).name),tr("Are you sure about removing \"%1\" in version %2?").arg(pluginsList.at(index).name).arg(pluginsList.at(index).version),QMessageBox::Yes|QMessageBox::No,QMessageBox::No);
// else
@@ -649,8 +642,9 @@ void PluginsManager::removeThePluginSelected(const QString &path)
if(!ResourcesManager::removeFolder(pluginsList.at(index).path))
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to remove the plugin");
- QMessageBox::critical(NULL,tr("Error"),tr("Error while the removing plugin, please check right of remove on the folder: \n%1").arg(pluginsList.at(index).path));
+ QMessageBox::critical(NULL,tr("Error"),tr("Error while the removing plugin, please check the rights on the folder: \n%1").arg(pluginsList.at(index).path));
}
+ pluginsListIndexed.remove(pluginsList.at(index).category,pluginsList.at(index));
pluginsList.removeAt(index);
checkDependencies();
}
diff --git a/PluginsManager.h b/PluginsManager.h
index 0283279..7c2d035 100644
--- a/PluginsManager.h
+++ b/PluginsManager.h
@@ -45,9 +45,7 @@ class PluginsManager : public QThread, public Singleton<PluginsManager>
public:
/// \brief to get plugins of type specific
QList<PluginsAvailable> getPluginsByCategory(const PluginType &type);
- /** \brief to get plugins
- \todo check where is used to convert to PluginsAvailable
- */
+ /** \brief to get plugins */
QList<PluginsAvailable> getPlugins();
/// \brief get translated text
//QString getTranslatedText(PluginsAvailable plugin,QString informationName,QString mainShortName);
@@ -82,6 +80,7 @@ class PluginsManager : public QThread, public Singleton<PluginsManager>
ResourcesManager *resources;
/// \brief List of plugins
QList<PluginsAvailable> pluginsList;
+ QMultiMap<PluginType,PluginsAvailable> pluginsListIndexed;
/// \brief to load the multi-language balise
void loadBalise(const QDomElement &root,const QString &name,QList<QStringList> *informations,QString *errorString,bool needHaveOneEntryMinimum=true,bool multiLanguage=false,bool englishNeedBeFound=false);
/// \brief check the dependencies
diff --git a/README b/README
index 95a8b19..a07fc8a 100644
--- a/README
+++ b/README
@@ -33,24 +33,7 @@ See the wiki for the general documentation and how to for building: http://ultra
For the code documentation: http://doc-ultracopier.first-world.info/ (generated by doxygen)
The source proposed on the site is reconstritued source from: https://github.com/alphaonex86/Ultracopier to facilitate contribute effort.
-=======================================================
-Licence for the source ================================
-=======================================================
-All images into resources/ is extracted from the oxygen pack of KDE 4.8. Some are directly remaked from the png version.
-*.ts and *.qm into resources/ or plugins/Languages/ is under GPL3.
-All images into plugins/Languages/ are extracted from piwik.
-All informations.xml into plugins/Languages/ are under GPL3.
-All the file *.dox *.h *.cpp *.pro *.ui at the root, interface/ folder of the source are under GPL3.
-The files: QTarDecode.cpp, QTarDecode.h, QXzDecode.cpp,
-QXzDecode.h, QXzDecodeThread.cpp, QXzDecodeThread.h into: lib/qt-tar-xz/ are under GPL3.
-The other file into lib/qt-tar-xz/ is XZ Embedded.
-All *.qrc into resources/ are under GPL3.
-
======================================================
-Licensing of XZ Embedded =============================
+Warranty =============================================
======================================================
-
-All the files in this package have been written by Lasse Collin
-and/or Igor Pavlov. All these files have been put into the
-public domain. You can do whatever you want with these files.
-As usual, this software is provided "as is", without any warranty.
+Ultracopier in all version is shipped without warranty (0% of warranty). Only the stable version have warranty of be tested in lot of case. But in any case have warranty about data security, or other way of warranty. \ No newline at end of file
diff --git a/README.sources b/README.sources
new file mode 100644
index 0000000..d569b28
--- /dev/null
+++ b/README.sources
@@ -0,0 +1,32 @@
+See README to have general informations
+
+=======================================================
+Licence for the source ================================
+=======================================================
+All images into resources/ is extracted from the oxygen pack of KDE 4.8. Some are directly remaked from the png version.
+*.ts and *.qm into resources/ or plugins/Languages/ is under GPL3.
+All images into plugins/Languages/ are extracted from piwik.
+All informations.xml into plugins/Languages/ are under GPL3.
+All the file *.dox *.h *.cpp *.pro *.ui at the root, interface/ folder of the source are under GPL3.
+The files: QTarDecode.cpp, QTarDecode.h, QXzDecode.cpp,
+QXzDecode.h, QXzDecodeThread.cpp, QXzDecodeThread.h into: lib/qt-tar-xz/ are under GPL3.
+The other file into lib/qt-tar-xz/ is XZ Embedded.
+All *.qrc into resources/ are under GPL3.
+See after for the patch.
+
+=======================================================
+Licence for the patch =================================
+=======================================================
+The patchs under this folder are under GPL3:
+patch/opensource/
+The patchs under this folder are under GPL3 but the binary is sell to support ultracopier. It's mainly for commercial/companie usage.
+patch/comercial/
+
+======================================================
+Licensing of XZ Embedded =============================
+======================================================
+
+All the files in this package have been written by Lasse Collin
+and/or Igor Pavlov. All these files have been put into the
+public domain. You can do whatever you want with these files.
+As usual, this software is provided "as is", without any warranty. \ No newline at end of file
diff --git a/ResourcesManager.cpp b/ResourcesManager.cpp
index 008bf50..3971531 100644
--- a/ResourcesManager.cpp
+++ b/ResourcesManager.cpp
@@ -48,9 +48,10 @@ ResourcesManager::ResourcesManager()
#define EXTRA_HOME_PATH "/.config/Ultracopier/"
#endif
#ifdef Q_OS_LINUX
- QDir linuxDir("/usr/share/ultracopier/");
- if(linuxDir.exists())
+ if(QDir("/usr/share/ultracopier/").exists())
searchPath<<"/usr/share/ultracopier/";
+ if(QDir("/usr/lib/ultracopier/").exists())
+ searchPath<<"/usr/lib/ultracopier/";
#endif
//load the user path but only if exists and writable
QDir dir(QFSFileEngine::homePath()+EXTRA_HOME_PATH);
diff --git a/SessionLoader.cpp b/SessionLoader.cpp
index c459acf..6b606a0 100644
--- a/SessionLoader.cpp
+++ b/SessionLoader.cpp
@@ -7,24 +7,30 @@
#include "SessionLoader.h"
-SessionLoader::SessionLoader(QObject *parent) :
- QObject(parent)
+SessionLoader::SessionLoader(OptionDialog *optionDialog)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
+ this->optionDialog=optionDialog;
//load the options
QList<QPair<QString, QVariant> > KeysList;
+ #ifdef ULTRACOPIER_VERSION_PORTABLE
+ KeysList.append(qMakePair(QString("LoadAtSessionStarting"),QVariant(false)));
+ #else
KeysList.append(qMakePair(QString("LoadAtSessionStarting"),QVariant(true)));
+ #endif
options->addOptionGroup("SessionLoader",KeysList);
- connect(options,SIGNAL(newOptionValue(QString,QString,QVariant)), this, SLOT(newOptionValue(QString,QString,QVariant)));
+ connect(options,SIGNAL(newOptionValue(QString,QString,QVariant)), this, SLOT(newOptionValue(QString,QString,QVariant)),Qt::QueuedConnection);
//load the plugin
plugins->lockPluginListEdition();
- QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_SessionLoader);
- foreach(PluginsAvailable currentPlugin,list)
- onePluginAdded(currentPlugin);
qRegisterMetaType<PluginsAvailable>("PluginsAvailable");
- connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)));
+ connect(this,SIGNAL(previouslyPluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
+ connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
connect(plugins,SIGNAL(onePluginWillBeRemoved(PluginsAvailable)), this,SLOT(onePluginWillBeRemoved(PluginsAvailable)),Qt::DirectConnection);
+ QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_SessionLoader);
+ foreach(PluginsAvailable currentPlugin,list)
+ emit previouslyPluginAdded(currentPlugin);
plugins->unlockPluginListEdition();
+ shouldEnabled=options->getOptionValue("SessionLoader","LoadAtSessionStarting").toBool();
}
SessionLoader::~SessionLoader()
@@ -70,6 +76,9 @@ void SessionLoader::onePluginAdded(const PluginsAvailable &plugin)
newEntry.sessionLoaderInterface=sessionLoader;
newEntry.path=plugin.path;
newEntry.sessionLoaderInterface->setResources(newEntry.options,plugin.writablePath,plugin.path,ULTRACOPIER_VERSION_PORTABLE_BOOL);
+ newEntry.sessionLoaderInterface->setEnabled(shouldEnabled);
+ optionDialog->addPluginOptionWidget(PluginType_SessionLoader,plugin.name,newEntry.sessionLoaderInterface->options());
+ connect(languages,SIGNAL(newLanguageLoaded(QString)),newEntry.sessionLoaderInterface,SLOT(newLanguageLoaded()));
pluginList << newEntry;
}
else
@@ -102,9 +111,10 @@ void SessionLoader::onePluginWillBeRemoved(const PluginsAvailable &plugin)
void SessionLoader::newOptionValue(const QString &groupName,const QString &variableName,const QVariant &value)
{
- if(groupName=="SessionLoader" && variableName=="Enabled")
+ if(groupName=="SessionLoader" && variableName=="LoadAtSessionStarting")
{
- bool shouldEnabled=value.toBool();
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start, value: %1").arg(value.toBool()));
+ shouldEnabled=value.toBool();
int index=0;
while(index<pluginList.size())
{
diff --git a/SessionLoader.h b/SessionLoader.h
index 5676cec..28bb3aa 100644
--- a/SessionLoader.h
+++ b/SessionLoader.h
@@ -20,16 +20,14 @@ This class load ALL plugin compatible to listen and catch the copy/move
#include "interface/PluginInterface_SessionLoader.h"
#include "PluginsManager.h"
#include "GlobalClass.h"
-
-/// \todo SessionLoader -> put plugin by plugin loading to add plugin no reload all
-/// \todo async the plugin call
+#include "OptionDialog.h"
/** \brief manage all SessionLoader plugin */
class SessionLoader : public QObject, GlobalClass
{
Q_OBJECT
public:
- explicit SessionLoader(QObject *parent = 0);
+ explicit SessionLoader(OptionDialog *optionDialog);
~SessionLoader();
private slots:
void onePluginAdded(const PluginsAvailable &plugin);
@@ -48,6 +46,10 @@ class SessionLoader : public QObject, GlobalClass
LocalPluginOptions *options;
};
QList<LocalPlugin> pluginList;
+ bool shouldEnabled;
+ OptionDialog *optionDialog;
+ signals:
+ void previouslyPluginAdded(PluginsAvailable);
};
#endif // SESSIONLOADER_H
diff --git a/StructEnumDefinition.h b/StructEnumDefinition.h
index 79bdb7e..cb86306 100644
--- a/StructEnumDefinition.h
+++ b/StructEnumDefinition.h
@@ -3,8 +3,7 @@
\author alpha_one_x86
\version 0.3
\date 2010
-\licence GPL3, see the file COPYING
-\todo Add transfer state normal and custom */
+\licence GPL3, see the file COPYING */
#include <QVariant>
#include <QString>
@@ -60,12 +59,13 @@ enum EngineActionInProgress
CopyingAndListing = Listing | Copying
};
+/// \brief the level of information
enum DebugLevel
{
- DebugLevel_Information=0x00000001,
- DebugLevel_Critical=0x00000002,
- DebugLevel_Warning=0x00000003,
- DebugLevel_Notice=0x00000004
+ DebugLevel_Information=0x00000001, ///< Information like the compiler, OS, Qt version, all to know in witch condition ultracopier is launched
+ DebugLevel_Critical=0x00000002, ///< Critical error, where it don't know how skip it
+ DebugLevel_Warning=0x00000003, ///< Error, but have way to skip it
+ DebugLevel_Notice=0x00000004 ///< General information to debug, what file is open, what event is received, ...
};
enum SizeUnit
@@ -96,7 +96,7 @@ enum ActionTypeCopyList
MoveItem=0x00000000,
RemoveItem=0x00000001,
AddingItem=0x00000002,
- //Item action
+ //Item action, to inform the stat of one entry
PreOperation=0x00000003,
Transfer=0x00000004,
PostOperation=0x00000005,
diff --git a/SystrayIcon.cpp b/SystrayIcon.cpp
index b4fef7d..4a1c8f1 100644
--- a/SystrayIcon.cpp
+++ b/SystrayIcon.cpp
@@ -16,26 +16,30 @@ SystrayIcon::SystrayIcon()
//setup the systray icon
haveListenerInfo = false;
havePluginLoaderInfo = false;
- sysTrayIcon = new QSystemTrayIcon();
systrayMenu = new QMenu();
actionMenuAbout = new QAction(this);
actionMenuQuit = new QAction(this);
actionOptions = new QAction(this);
//actionTransfer = new QAction(this);
copyMenu = new QMenu();
- sysTrayIcon->setContextMenu(systrayMenu);
- sysTrayIcon->setToolTip("Ultracopier");
+ //to prevent init bug
+ stateListener=NotListening;
+ statePluginLoader=Uncaught;
+
+ setContextMenu(systrayMenu);
+ setToolTip("Ultracopier");
#ifdef Q_OS_WIN32
- sysTrayIcon->setIcon(QIcon(":/systray_Uncaught_Windows.png"));
+ setIcon(QIcon(":/systray_Uncaught_Windows.png"));
#else
- sysTrayIcon->setIcon(QIcon(":/systray_Uncaught_Unix.png"));
+ setIcon(QIcon(":/systray_Uncaught_Unix.png"));
#endif
- sysTrayIcon->show();
+ show();
//connect the action
+ connect(&timerCheckSetTooltip, SIGNAL(timeout()), this, SLOT(checkSetTooltip()));
connect(actionMenuQuit, SIGNAL(triggered()), this, SIGNAL(quit()));
connect(actionMenuAbout, SIGNAL(triggered()), this, SIGNAL(showHelp()));
connect(actionOptions, SIGNAL(triggered()), this, SIGNAL(showOptions()));
- connect(sysTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(CatchAction(QSystemTrayIcon::ActivationReason)));
+ connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(CatchAction(QSystemTrayIcon::ActivationReason)));
connect(plugins, SIGNAL(pluginListingIsfinish()), this, SLOT(reloadEngineList()));
//display the icon
updateCurrentTheme();
@@ -49,6 +53,13 @@ SystrayIcon::SystrayIcon()
systrayMenu->insertSeparator(actionOptions);
retranslateTheUI();
updateSystrayIcon();
+
+ timerCheckSetTooltip.setSingleShot(true);
+ timerCheckSetTooltip.start(1000);
+
+ //impossible with Qt on systray
+ /// \note important for drag and drop, \see dropEvent()
+ systrayMenu->setAcceptDrops(true);
}
/// \brief Hide and destroy the icon in the systray
@@ -59,7 +70,17 @@ SystrayIcon::~SystrayIcon()
delete actionOptions;
delete systrayMenu;
delete copyMenu;
- delete sysTrayIcon;
+}
+
+void SystrayIcon::checkSetTooltip()
+{
+ if(isSystemTrayAvailable())
+ {
+ setToolTip("Ultracopier");
+ updateSystrayIcon();
+ }
+ else
+ timerCheckSetTooltip.start();
}
void SystrayIcon::listenerReady(const ListeningState &state,const bool &havePlugin,const bool &someAreInWaitOfReply)
@@ -92,14 +113,14 @@ void SystrayIcon::showTryCatchMessageWithNoListener()
/// \brief To show a message linked to the systray icon
void SystrayIcon::showSystrayMessage(const QString& text)
{
- sysTrayIcon->showMessage(tr("Information"),text,QSystemTrayIcon::Information,0);
+ showMessage(tr("Information"),text,QSystemTrayIcon::Information,0);
}
/// \brief To update the systray icon
void SystrayIcon::updateSystrayIcon()
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("start, haveListenerInfo %1, havePluginLoaderInfo: %2").arg(haveListenerInfo).arg(havePluginLoaderInfo));
- QString toolTip;
+ QString toolTip="???";
QString icon;
if(!haveListenerInfo || !havePluginLoaderInfo)
{
@@ -112,8 +133,6 @@ void SystrayIcon::updateSystrayIcon()
CatchState statePluginLoader=this->statePluginLoader;
if(!haveListener)
stateListener=NotListening;
- if(!havePluginLoader)
- statePluginLoader=Caught;
if((stateListener==NotListening && statePluginLoader==Uncaught) || (stateListener==SemiListening && statePluginLoader==Semiuncaught) || (stateListener==FullListening && statePluginLoader==Caught))
{
if(stateListener==NotListening)
@@ -180,10 +199,48 @@ void SystrayIcon::updateSystrayIcon()
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"icon: systray_"+icon+"_Unix.png");
#endif
}
- sysTrayIcon->setIcon(theNewSystrayIcon);
- sysTrayIcon->setToolTip("Ultracopier - "+toolTip);
+ setIcon(theNewSystrayIcon);
+ setToolTip("Ultracopier - "+toolTip);
}
+/* drag event processing (impossible with Qt on systray)
+
+need setAcceptDrops(true); into the constructor
+need implementation to accept the drop:
+void dragEnterEvent(QDragEnterEvent* event);
+void dragMoveEvent(QDragMoveEvent* event);
+void dragLeaveEvent(QDragLeaveEvent* event);
+*/
+void SystrayIcon::dropEvent(QDropEvent *event)
+{
+ const QMimeData* mimeData = event->mimeData();
+ if(mimeData->hasUrls())
+ {
+ //impossible with Qt on systray
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"mimeData->urls().size()"+QString::number(mimeData->urls().size()));
+ emit urlDropped(mimeData->urls());
+ event->acceptProposedAction();
+ }
+}
+
+void SystrayIcon::dragEnterEvent(QDragEnterEvent* event)
+{
+ // if some actions should not be usable, like move, this code must be adopted
+ event->acceptProposedAction();
+}
+
+void SystrayIcon::dragMoveEvent(QDragMoveEvent* event)
+{
+ // if some actions should not be usable, like move, this code must be adopted
+ event->acceptProposedAction();
+}
+
+void SystrayIcon::dragLeaveEvent(QDragLeaveEvent* event)
+{
+ event->accept();
+}
+
+
/// \brief To update the current themes
void SystrayIcon::updateCurrentTheme()
{
@@ -231,12 +288,15 @@ void SystrayIcon::CatchAction(QSystemTrayIcon::ActivationReason reason)
if(reason==QSystemTrayIcon::DoubleClick || reason==QSystemTrayIcon::Trigger)
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"Double click on system tray icon");
- if(stateListener!=NotListening || statePluginLoader!=Uncaught)
+ if(stateListener!=NotListening)
emit tryUncatchCopy();
else
{
if(!haveListener)
+ {
showTryCatchMessageWithNoListener();
+ return;
+ }
emit tryCatchCopy();
}
}
diff --git a/SystrayIcon.h b/SystrayIcon.h
index 86d0668..b90cbea 100644
--- a/SystrayIcon.h
+++ b/SystrayIcon.h
@@ -12,6 +12,10 @@
#include <QObject>
#include <QAction>
#include <QMenu>
+#include <QTimer>
+#include <QDropEvent>
+#include <QList>
+#include <QUrl>
#include "Environment.h"
#include "GlobalClass.h"
@@ -19,7 +23,7 @@
/** \brief The systray icon
This class provide a systray icon and its functions */
-class SystrayIcon : public QObject, public GlobalClass
+class SystrayIcon : public QSystemTrayIcon, public GlobalClass
{
Q_OBJECT
public:
@@ -40,7 +44,6 @@ class SystrayIcon : public QObject, public GlobalClass
void addCopyEngine(const QString &name,const bool &canDoOnlyCopy);
void removeCopyEngine(const QString &name);
private:
- QSystemTrayIcon* sysTrayIcon; ///< Pointer on the systray icon
QMenu* systrayMenu; ///< Pointer on the menu
QMenu* copyMenu; ///< Pointer on the copy menu (move or copy)
QAction* actionMenuQuit; ///< Pointer on the Quit action
@@ -64,6 +67,25 @@ class SystrayIcon : public QObject, public GlobalClass
CatchState statePluginLoader;
bool haveListenerInfo,havePluginLoaderInfo;
bool haveListener,havePluginLoader;
+ QTimer timerCheckSetTooltip;
+ /** \brief drag event processing (impossible with Qt on systray)
+
+ need setAcceptDrops(true); into the constructor
+ need implementation to accept the drop:
+ void dragEnterEvent(QDragEnterEvent* event);
+ void dragMoveEvent(QDragMoveEvent* event);
+ void dragLeaveEvent(QDragLeaveEvent* event);
+ */
+ void dropEvent(QDropEvent *event);
+ /** \brief accept all event to allow the drag and drop
+ \see dropEvent() */
+ void dragEnterEvent(QDragEnterEvent* event);
+ /** \brief accept all event to allow the drag and drop
+ \see dropEvent() */
+ void dragMoveEvent(QDragMoveEvent* event);
+ /** \brief accept all event to allow the drag and drop
+ \see dropEvent() */
+ void dragLeaveEvent(QDragLeaveEvent* event);
private slots:
/// \brief To update the current themes
void updateCurrentTheme();
@@ -79,6 +101,7 @@ class SystrayIcon : public QObject, public GlobalClass
/// \brief to retranslate the ui
void retranslateTheUI();
void reloadEngineList();
+ void checkSetTooltip();
signals:
/// \brief Quit ultracopier
void quit();
@@ -95,6 +118,7 @@ class SystrayIcon : public QObject, public GlobalClass
\return The core object of the new window created */
void addWindowCopyMove(CopyMode mode,QString name);
void addWindowTransfer(QString name);
+ void urlDropped(QList<QUrl> urls);
};
#endif // SYSTRAY_ICON_H
diff --git a/ThemesManager.cpp b/ThemesManager.cpp
index fe62380..3881355 100644
--- a/ThemesManager.cpp
+++ b/ThemesManager.cpp
@@ -31,12 +31,13 @@ ThemesManager::ThemesManager()
//connect the plugin management
plugins->lockPluginListEdition();
+ connect(this,SIGNAL(previouslyPluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
+ connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)),Qt::QueuedConnection);
+ connect(plugins,SIGNAL(onePluginWillBeRemoved(PluginsAvailable)), this,SLOT(onePluginWillBeRemoved(PluginsAvailable)),Qt::DirectConnection);
+ connect(plugins,SIGNAL(pluginListingIsfinish()), this,SLOT(allPluginIsLoaded()),Qt::QueuedConnection);
QList<PluginsAvailable> list=plugins->getPluginsByCategory(PluginType_Themes);
foreach(PluginsAvailable currentPlugin,list)
- onePluginAdded(currentPlugin);
- connect(plugins,SIGNAL(onePluginAdded(PluginsAvailable)), this,SLOT(onePluginAdded(PluginsAvailable)));
- connect(plugins,SIGNAL(onePluginWillBeRemoved(PluginsAvailable)), this,SLOT(onePluginWillBeRemoved(PluginsAvailable)),Qt::DirectConnection);
- connect(plugins,SIGNAL(pluginListingIsfinish()), this,SLOT(allPluginIsLoaded()));
+ emit previouslyPluginAdded(currentPlugin);
plugins->unlockPluginListEdition();
//do the options
@@ -48,8 +49,8 @@ ThemesManager::ThemesManager()
defaultStylePath=":/Themes/"+QString(ULTRACOPIER_DEFAULT_STYLE)+"/";
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"Default style: "+defaultStylePath);
currentStylePath=defaultStylePath;
- connect(options, SIGNAL(newOptionValue(QString,QString,QVariant)), this, SLOT(newOptionValue(QString,QString,QVariant)));
- connect(languages, SIGNAL(newLanguageLoaded(QString)), &facilityEngine,SLOT(retranslate()));
+ connect(options, SIGNAL(newOptionValue(QString,QString,QVariant)), this, SLOT(newOptionValue(QString,QString,QVariant)),Qt::QueuedConnection);
+ connect(languages, SIGNAL(newLanguageLoaded(QString)), &facilityEngine,SLOT(retranslate()),Qt::QueuedConnection);
}
/// \brief Destroy the themes manager
@@ -70,13 +71,64 @@ void ThemesManager::onePluginAdded(const PluginsAvailable &plugin)
if(plugin.category!=PluginType_Themes)
return;
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+plugin.name);
- PluginsAvailableThemes newThemes;
- newThemes.plugin=plugin;
- newThemes.factory=NULL;
- newThemes.pluginLoader=NULL;
- pluginList << newThemes;
- //setFileName
- /**/
+ PluginsAvailableThemes newPlugin;
+ newPlugin.plugin=plugin;
+ QPluginLoader *pluginLoader=new QPluginLoader(newPlugin.plugin.path+QDir::separator()+plugins->getResolvedPluginName("interface"));
+ QObject *pluginInstance = pluginLoader->instance();
+ if(pluginInstance==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("unable to load the plugin %1: %2").arg(newPlugin.plugin.path+QDir::separator()+plugins->getResolvedPluginName("interface")).arg(pluginLoader->errorString()));
+ pluginLoader->unload();
+ }
+ else
+ {
+ PluginInterface_ThemesFactory *factory = qobject_cast<PluginInterface_ThemesFactory *>(pluginInstance);
+ //check if found
+ int indexTemp=0;
+ while(indexTemp<pluginList.size())
+ {
+ if(pluginList.at(indexTemp).factory==factory)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Plugin already found, current: %1, conflit plugin: %2, name: %3")
+ .arg(newPlugin.plugin.path+QDir::separator()+plugins->getResolvedPluginName("interface"))
+ .arg(pluginList.at(indexTemp).plugin.path+QDir::separator()+plugins->getResolvedPluginName("interface"))
+ .arg(newPlugin.plugin.name)
+ );
+ pluginLoader->unload();
+ emit newThemeOptions(newPlugin.plugin.name,NULL,false,true);
+ emit theThemeIsReloaded();
+ return;
+ }
+ indexTemp++;
+ }
+ if(factory==NULL)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("unable to cast the plugin: %1").arg(pluginLoader->errorString()));
+ pluginLoader->unload();
+ }
+ else
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("preload: %1, at the index: %2").arg(newPlugin.plugin.name).arg(QString::number(pluginList.size())));
+ #ifdef ULTRACOPIER_DEBUG
+ qRegisterMetaType<DebugLevel>("DebugLevel");
+ connect(factory,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)),this,SLOT(debugInformation(DebugLevel,QString,QString,QString,int)),Qt::QueuedConnection);
+ #endif // ULTRACOPIER_DEBUG
+ connect(languages,SIGNAL(newLanguageLoaded(QString)),factory,SLOT(newLanguageLoaded()));
+ newPlugin.factory=factory;
+ newPlugin.pluginLoader=pluginLoader;
+ newPlugin.options=new LocalPluginOptions("Themes-"+newPlugin.plugin.name);
+ newPlugin.factory->setResources(newPlugin.options,newPlugin.plugin.writablePath,newPlugin.plugin.path,&facilityEngine,ULTRACOPIER_VERSION_PORTABLE_BOOL);
+ currentStylePath=newPlugin.plugin.path;
+ pluginList << newPlugin;
+ if(plugins->allPluginHaveBeenLoaded())
+ allPluginIsLoaded();
+ emit newThemeOptions(newPlugin.plugin.name,newPlugin.factory->options(),true,true);
+ emit theThemeIsReloaded();
+ return;
+ }
+ }
+ emit newThemeOptions(newPlugin.plugin.name,NULL,false,true);
+ emit theThemeIsReloaded();
}
void ThemesManager::onePluginWillBeRemoved(const PluginsAvailable &plugin)
@@ -122,10 +174,8 @@ QIcon ThemesManager::loadIcon(const QString &fileName)
void ThemesManager::allPluginIsLoaded()
{
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
- currentPluginIndex=-1;
if(pluginList.size()==0)
{
- emit newThemeOptions(NULL,false,false);
emit theThemeIsReloaded();
return;
}
@@ -135,73 +185,24 @@ void ThemesManager::allPluginIsLoaded()
{
if(pluginList.at(index).plugin.name==name)
{
- QPluginLoader *pluginLoader=new QPluginLoader(pluginList.at(index).plugin.path+QDir::separator()+plugins->getResolvedPluginName("interface"));
- QObject *pluginInstance = pluginLoader->instance();
- if(pluginInstance==NULL)
- {
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("unable to load the plugin %1: %2").arg(pluginList.at(index).plugin.path+QDir::separator()+plugins->getResolvedPluginName("interface")).arg(pluginLoader->errorString()));
- pluginLoader->unload();
- }
- else
- {
- PluginInterface_ThemesFactory *factory = qobject_cast<PluginInterface_ThemesFactory *>(pluginInstance);
- //check if found
- int indexTemp=0;
- while(indexTemp<pluginList.size())
- {
- if(pluginList.at(indexTemp).factory==factory)
- {
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Plugin already found, current: %1, conflit plugin: %2, name: %3")
- .arg(pluginList.at(index).plugin.path+QDir::separator()+plugins->getResolvedPluginName("interface"))
- .arg(pluginList.at(indexTemp).plugin.path+QDir::separator()+plugins->getResolvedPluginName("interface"))
- .arg(name)
- );
- pluginLoader->unload();
- emit newThemeOptions(NULL,false,true);
- emit theThemeIsReloaded();
- return;
- }
- indexTemp++;
- }
- if(factory==NULL)
- {
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("unable to cast the plugin: %1").arg(pluginLoader->errorString()));
- pluginLoader->unload();
- }
- else
- {
- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"preload: "+name+", at the index: "+QString::number(index)+", name at this index: "+pluginList[index].plugin.name);
- #ifdef ULTRACOPIER_DEBUG
- qRegisterMetaType<DebugLevel>("DebugLevel");
- connect(factory,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)),this,SLOT(debugInformation(DebugLevel,QString,QString,QString,int)),Qt::QueuedConnection);
- #endif // ULTRACOPIER_DEBUG
- connect(languages,SIGNAL(newLanguageLoaded(QString)),factory,SLOT(newLanguageLoaded()));
- pluginList[index].factory=factory;
- pluginList[index].pluginLoader=pluginLoader;
- pluginList[index].options=new LocalPluginOptions("Themes-"+name);
- pluginList.at(index).factory->setResources(pluginList[index].options,pluginList.at(index).plugin.writablePath,pluginList.at(index).plugin.path,&facilityEngine,ULTRACOPIER_VERSION_PORTABLE_BOOL);
- currentPluginIndex=index;
- currentStylePath=pluginList[index].plugin.path;
- emit newThemeOptions(pluginList.at(index).factory->options(),true,true);
- emit theThemeIsReloaded();
- return;
- }
- }
- emit newThemeOptions(NULL,false,true);
+ currentPluginIndex=index;
emit theThemeIsReloaded();
return;
}
index++;
}
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"theme not found!");
- emit newThemeOptions(NULL,false,true);
+ currentPluginIndex=-1;
emit theThemeIsReloaded();
}
PluginInterface_Themes * ThemesManager::getThemesInstance()
{
if(currentPluginIndex==-1)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to load the interface, copy aborted");
return NULL;
+ }
ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"Send interface: "+pluginList.at(currentPluginIndex).plugin.name);
return pluginList.at(currentPluginIndex).factory->getInstance();
}
@@ -217,6 +218,8 @@ void ThemesManager::newOptionValue(const QString &group,const QString &name,cons
{
if(group=="Themes" && name=="Ultracopier_current_theme")
{
+ if(!plugins->allPluginHaveBeenLoaded())
+ return;
if(currentPluginIndex!=-1 && value.toString()!=pluginList.at(currentPluginIndex).plugin.name)
{
int tempCurrentPluginIndex=currentPluginIndex;
diff --git a/ThemesManager.h b/ThemesManager.h
index 9bfb36c..af30ee4 100644
--- a/ThemesManager.h
+++ b/ThemesManager.h
@@ -75,7 +75,8 @@ class ThemesManager : public QObject, public Singleton<ThemesManager>
/// \brief send this signal when the themes have changed
void theThemeNeedBeUnloaded();
void theThemeIsReloaded();
- void newThemeOptions(QWidget *,bool isLoaded,bool havePlugin);
+ void newThemeOptions(QString name,QWidget *,bool isLoaded,bool havePlugin);
+ void previouslyPluginAdded(PluginsAvailable);
private slots:
/// \brief reload the themes
void onePluginAdded(const PluginsAvailable &plugin);
diff --git a/Variable.h b/Variable.h
index 87e0c48..6e16355 100644
--- a/Variable.h
+++ b/Variable.h
@@ -13,12 +13,14 @@
/// \brief Max number of ligne show on the GUI
#define ULTRACOPIER_DEBUG_MAX_GUI_LINE 5000
/// \brief the version
-#define ULTRACOPIER_VERSION "0.3.0.5"
+#define ULTRACOPIER_VERSION "0.3.1.0"
/// \brief the windows version
-#define ULTRACOPIER_WINDOWS_VERSION 0,3,0,5
+#define ULTRACOPIER_WINDOWS_VERSION 0,3,1,0
// define if the version is portable or not
-//#define ULTRACOPIER_VERSION_PORTABLE
-//#define ULTRACOPIER_VERSION_PORTABLEAPPS
+////#define ULTRACOPIER_VERSION_PORTABLE
+////#define ULTRACOPIER_VERSION_PORTABLEAPPS
+// define if the version is ultimate, need change only the name in the code
+//#define ULTRACOPIER_VERSION_ULTIMATE
/// \brief define time to update the speed detection update ont the interface (in ms)
#define ULTRACOPIER_TIME_INTERFACE_UPDATE 500
diff --git a/interface/FacilityInterface.h b/interface/FacilityInterface.h
index d919498..1ced0a2 100644
--- a/interface/FacilityInterface.h
+++ b/interface/FacilityInterface.h
@@ -33,6 +33,8 @@ class FacilityInterface : public QObject
virtual bool haveFunctionality(const QString &fonctionnality) = 0;
/// \brief call the fonctionnality
virtual QVariant callFunctionality(const QString &fonctionnality,const QStringList &args=QStringList()) = 0;
+ /// \brief Do the simplified time
+ virtual QString simplifiedRemainingTime(const quint32 &seconds) = 0;
};
#endif // FACILITY_INTERFACE_H
diff --git a/interface/PluginInterface_CopyEngine.h b/interface/PluginInterface_CopyEngine.h
index b7198f2..fad97fe 100644
--- a/interface/PluginInterface_CopyEngine.h
+++ b/interface/PluginInterface_CopyEngine.h
@@ -70,6 +70,9 @@ class PluginInterface_CopyEngine : public QObject
* \param destination the destination to move
* \return true if the move have been accepted */
virtual bool newMove(const QStringList &sources,const QString &destination) = 0;
+ /** \brief send the new transfer list
+ * \param file the transfer list */
+ virtual void newTransferList(const QString &file) = 0;
/** \brief to get byte read, use by Ultracopier for the speed calculation
@@ -131,6 +134,10 @@ class PluginInterface_CopyEngine : public QObject
/** \brief move on bottom of the list the selected item
* \param ids ids is the id list of the selected items */
virtual void moveItemsOnBottom(const QList<int> &ids) = 0;
+
+
+ /** \brief give the forced mode, to export/import transfer list */
+ virtual void forceMode(const CopyMode &mode) = 0;
/// \brief export the transfer list into a file
virtual void exportTransferList() = 0;
/// \brief import the transfer list into a file
@@ -169,8 +176,11 @@ class PluginInterface_CopyEngine : public QObject
* first = current transfered byte, second = byte to transfer * /
void pushGeneralProgression(const quint64 &,const quint64 &);
-
+ //when the cancel is clicked on copy engine dialog
void cancelAll();
+
+ //when can be deleted
+ void canBeDeleted();
//send error occurred
void error(QString path,quint64 size,QDateTime mtime,QString error);
@@ -209,6 +219,6 @@ class PluginInterface_CopyEngineFactory : public QObject
};
-Q_DECLARE_INTERFACE(PluginInterface_CopyEngineFactory,"first-world.info.ultracopier.PluginInterface.CopyEngineFactory/0.3.0.5");
+Q_DECLARE_INTERFACE(PluginInterface_CopyEngineFactory,"first-world.info.ultracopier.PluginInterface.CopyEngineFactory/0.3.0.10");
#endif // PLUGININTERFACE_COPYENGINE_H
diff --git a/interface/PluginInterface_Listener.h b/interface/PluginInterface_Listener.h
index 7d6508b..5648ed8 100644
--- a/interface/PluginInterface_Listener.h
+++ b/interface/PluginInterface_Listener.h
@@ -29,11 +29,15 @@ class PluginInterface_Listener : public QObject
virtual const QString errorString() = 0;
/// \brief set the resources for the plugin
virtual void setResources(OptionInterface * options,QString writePath,QString pluginPath,bool portableVersion) = 0;
+ /// \brief to get the options widget, NULL if not have
+ virtual QWidget * options() = 0;
public slots:
/// \brief send when copy is finished
virtual void transferFinished(quint32 orderId,bool withError) = 0;
/// \brief send when copy is canceled
virtual void transferCanceled(quint32 orderId) = 0;
+ /// \brief to reload the translation, because the new language have been loaded
+ virtual void newLanguageLoaded() = 0;
/* signal to implement
signals:
void newState(ListeningState state);
@@ -43,6 +47,6 @@ class PluginInterface_Listener : public QObject
void newMove(quint32 orderId,QStringList sources,QString destination);*/
};
-Q_DECLARE_INTERFACE(PluginInterface_Listener,"first-world.info.ultracopier.PluginInterface.Listener/0.3.0.5");
+Q_DECLARE_INTERFACE(PluginInterface_Listener,"first-world.info.ultracopier.PluginInterface.Listener/0.3.0.8");
#endif // PLUGININTERFACE_LISTENER_H
diff --git a/interface/PluginInterface_PluginLoader.h b/interface/PluginInterface_PluginLoader.h
index e04bcd9..22f42ce 100644
--- a/interface/PluginInterface_PluginLoader.h
+++ b/interface/PluginInterface_PluginLoader.h
@@ -23,11 +23,16 @@ class PluginInterface_PluginLoader : public QObject
virtual void setEnabled(bool) = 0;
/// \brief to set resources, writePath can be empty if read only mode
virtual void setResources(OptionInterface * options,QString writePath,QString pluginPath,bool portableVersion) = 0;
+ /// \brief to get the options widget, NULL if not have
+ virtual QWidget * options() = 0;
+ public slots:
+ /// \brief to reload the translation, because the new language have been loaded
+ virtual void newLanguageLoaded() = 0;
/* signal to implement
signals:
void newState(CatchState);*/
};
-Q_DECLARE_INTERFACE(PluginInterface_PluginLoader,"first-world.info.ultracopier.PluginInterface.PluginLoader/0.3.0.1");
+Q_DECLARE_INTERFACE(PluginInterface_PluginLoader,"first-world.info.ultracopier.PluginInterface.PluginLoader/0.3.0.8");
#endif // PLUGININTERFACE_PLUGINLOADER_H
diff --git a/interface/PluginInterface_SessionLoader.h b/interface/PluginInterface_SessionLoader.h
index 2e49fa3..e73c9e3 100644
--- a/interface/PluginInterface_SessionLoader.h
+++ b/interface/PluginInterface_SessionLoader.h
@@ -24,8 +24,13 @@ class PluginInterface_SessionLoader : public QObject
virtual bool getEnabled() = 0;
/// \brief set the resources
virtual void setResources(OptionInterface * options,QString writePath,QString pluginPath,bool portableVersion) = 0;
+ /// \brief to get the options widget, NULL if not have
+ virtual QWidget * options() = 0;
+ public slots:
+ /// \brief to reload the translation, because the new language have been loaded
+ virtual void newLanguageLoaded() = 0;
};
-Q_DECLARE_INTERFACE(PluginInterface_SessionLoader,"first-world.info.ultracopier.PluginInterface.SessionLoader/0.3.0.4");
+Q_DECLARE_INTERFACE(PluginInterface_SessionLoader,"first-world.info.ultracopier.PluginInterface.SessionLoader/0.3.0.8");
#endif // PLUGININTERFACE_SESSIONLOADER_H
diff --git a/interface/PluginInterface_Themes.h b/interface/PluginInterface_Themes.h
index 8b9d40b..cfdb719 100644
--- a/interface/PluginInterface_Themes.h
+++ b/interface/PluginInterface_Themes.h
@@ -118,6 +118,6 @@ class PluginInterface_ThemesFactory : public QObject
virtual void newLanguageLoaded() = 0;
};
-Q_DECLARE_INTERFACE(PluginInterface_ThemesFactory,"first-world.info.ultracopier.PluginInterface.ThemesFactory/0.3.0.5");
+Q_DECLARE_INTERFACE(PluginInterface_ThemesFactory,"first-world.info.ultracopier.PluginInterface.ThemesFactory/0.3.0.8");
#endif // PLUGININTERFACE_THEMES_H
diff --git a/patch/comercial/rsync-copy-engine.patch b/patch/comercial/rsync-copy-engine.patch
new file mode 100644
index 0000000..f469d50
--- /dev/null
+++ b/patch/comercial/rsync-copy-engine.patch
@@ -0,0 +1,902 @@
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/ListThread.cpp Rsync/ListThread.cpp
+--- Ultracopier-0.3/ListThread.cpp 2012-06-26 14:12:53.082114806 +0200
++++ Rsync/ListThread.cpp 2012-06-29 22:21:40.395733284 +0200
+@@ -28,6 +28,7 @@
+ numberOfInodeOperation = 0;
+ maxSpeed = 0;
+ doRightTransfer = false;
++ rsync = false;
+ keepDate = false;
+ blockSize = 1024;
+ osBufferLimit = 512;
+@@ -265,6 +266,21 @@
+ this->autoStart=autoStart;
+ }
+
++/// \brief set rsync
++void ListThread::setRsync(const bool rsync)
++{
++ this->rsync=rsync;
++ int index=0;
++ loop_sub_size_transfer_thread_search=transferThreadList.size();
++ while(index<loop_sub_size_transfer_thread_search)
++ {
++ transferThreadList.at(index)->setRsync(rsync);
++ index++;
++ }
++ for(int i=0;i<scanFileOrFolderThreadsPool.size();i++)
++ scanFileOrFolderThreadsPool.at(i)->setRsync(rsync);
++}
++
+ //set check destination folder
+ void ListThread::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+ {
+@@ -327,11 +343,13 @@
+ #endif
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(newFolderListing(QString)), this,SIGNAL(newFolderListing(QString)));
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(addToRmPath(QString,int)), this,SLOT(addToRmPath(QString,int)), Qt::QueuedConnection);
++ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(addToRmForRsync(QString)), this,SLOT(addToRmForRsync(QString)), Qt::QueuedConnection);
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(addToMkPath(QString)), this,SLOT(addToMkPath(QString)), Qt::QueuedConnection);
+
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(errorOnFolder(QFileInfo,QString)), this,SLOT(errorOnFolder(QFileInfo,QString)), Qt::QueuedConnection);
+ connect(scanFileOrFolderThreadsPool.last(),SIGNAL(folderAlreadyExists(QFileInfo,QFileInfo,bool)), this,SLOT(folderAlreadyExists(QFileInfo,QFileInfo,bool)), Qt::QueuedConnection);
+
++ scanFileOrFolderThreadsPool.last()->setRsync(rsync);
+ scanFileOrFolderThreadsPool.last()->setFilters(include,exclude);
+ scanFileOrFolderThreadsPool.last()->setCheckDestinationFolderExists(checkDestinationFolderExists && alwaysDoThisActionForFolderExists!=FolderExists_Merge);
+ if(scanFileOrFolderThreadsPool.size()==1)
+@@ -761,6 +779,18 @@
+ actionToDoListInode_afterTheTransfer << temp;
+ }
+
++//rsync rm
++void ListThread::addToRmForRsync(const QString& inode)
++{
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"inode: "+inode);
++ actionToDoInode temp;
++ temp.type = ActionType_RmSync;
++ temp.id = generateIdNumber();
++ temp.folder.setFile(inode);
++ temp.isRunning = false;
++ actionToDoListInode << temp;
++}
++
+ //send action done
+ void ListThread::sendActionDone()
+ {
+@@ -1526,7 +1556,7 @@
+ loop_size=actionToDoListInode.size();
+ while(int_for_loop<loop_size)
+ {
+- if(actionToDoListInode.at(int_for_loop).type==ActionType_RmPath)
++ if(actionToDoListInode.at(int_for_loop).type==ActionType_RmPath || actionToDoListInode.at(int_for_loop).type==ActionType_RmSync)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("stop rmpath: %1").arg(actionToDoListInode.at(int_for_loop).folder.absoluteFilePath()));
+ actionToDoListInode.removeAt(int_for_loop);
+@@ -1658,6 +1688,7 @@
+ last->set_osBuffer(osBuffer);
+ last->set_osBufferLimited(osBufferLimited);
+ last->set_osBufferLimit(osBufferLimit);
++ last->setRsync(rsync);
+
+ #ifdef ULTRACOPIER_PLUGIN_DEBUG
+ connect(last,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)),this,SIGNAL(debugInformation(DebugLevel,QString,QString,QString,int)), Qt::QueuedConnection);
+@@ -1669,7 +1700,7 @@
+ connect(last,SIGNAL(preOperationStopped()), this,SLOT(doNewActions_start_transfer()), Qt::QueuedConnection);
+ connect(last,SIGNAL(postOperationStopped()), this,SLOT(transferInodeIsClosed()), Qt::QueuedConnection);
+ connect(last,SIGNAL(checkIfItCanBeResumed()), this,SLOT(restartTransferIfItCan()), Qt::QueuedConnection);
+- connect(last,SIGNAL(pushStat(TransferStat,quint64)), this,SLOT(newTransferStat(TransferStat,quint64)), Qt::QueuedConnection);
++ connect(last,SIGNAL(pushStat(TransferStat,quint64)), this,SLOT(newTransferStat(TransferStat,quint64)), Qt::QueuedConnection);
+
+ connect(this,SIGNAL(send_sendNewRenamingRules(QString,QString)), last,SLOT(setRenamingRules(QString,QString)), Qt::QueuedConnection);
+
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/ListThread.h Rsync/ListThread.h
+--- Ultracopier-0.3/ListThread.h 2012-06-25 16:46:19.931261209 +0200
++++ Rsync/ListThread.h 2012-06-29 21:53:37.495762350 +0200
+@@ -77,7 +77,8 @@
+ enum ActionType
+ {
+ ActionType_MkPath=1,
+- ActionType_RmPath=2
++ ActionType_RmPath=2,
++ ActionType_RmSync=3
+ };
+ /// \brief to store one action to do
+ struct actionToDoInode
+@@ -155,6 +156,8 @@
+ void setBlockSize(const int blockSize);
+ /// \brief set auto start
+ void setAutoStart(const bool autoStart);
++ /// \brief set rsync
++ void setRsync(const bool rsync);
+ /// \brief set check destination folder
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ /// \brief set data local to the thread
+@@ -196,6 +199,7 @@
+ quint64 bytesToTransfer;
+ quint64 bytesTransfered;
+ bool autoStart;
++ bool rsync;
+ bool putInPause;
+ QList<returnActionOnCopyList> actionDone;///< to action to send to the interface
+ quint64 idIncrementNumber;///< to store the last id returned
+@@ -302,6 +306,8 @@
+ quint64 addToMkPath(const QString& folder);
+ //add rm path to do
+ void addToRmPath(const QString& folder,const int& inodeToRemove);
++ //rsync rm
++ void addToRmForRsync(const QString& inode);
+ //send the progression, after full reset of the interface (then all is empty)
+ void syncTransferList_internal();
+ signals:
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/ListThread_InodeAction.cpp Rsync/ListThread_InodeAction.cpp
+--- Ultracopier-0.3/ListThread_InodeAction.cpp 2012-06-29 21:57:47.000000000 +0200
++++ Rsync/ListThread_InodeAction.cpp 2012-06-29 22:19:11.515735854 +0200
+@@ -19,6 +19,14 @@
+ if(numberOfInodeOperation>=ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT)
+ return;
+ break;
++case ActionType_RmSync:
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("launch rm to sync: %1").arg(currentActionToDoInode.folder.absoluteFilePath()));
++ rmPathQueue.addPath(currentActionToDoInode.folder.absoluteFilePath(),true);
++ currentActionToDoInode.isRunning=true;
++ numberOfInodeOperation++;
++ if(numberOfInodeOperation>=ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT)
++ return;
++break;
+ case ActionType_RmPath:
+ /* What is this code?
+ if((int_for_loop+number_rm_path_moved)>=(loop_size-1))
+@@ -34,7 +42,7 @@
+ if(numberOfTranferRuning>0)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("skipped because already inode = 0 and transfer is running: %1").arg(currentActionToDoInode.folder.absoluteFilePath()));
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,QString("launch rmpath: %1").arg(currentActionToDoInode.folder.absoluteFilePath()));
+- rmPathQueue.addPath(currentActionToDoInode.folder.absoluteFilePath());
++ rmPathQueue.addPath(currentActionToDoInode.folder.absoluteFilePath(),false);
+ currentActionToDoInode.isRunning=true;
+ numberOfInodeOperation++;
+ if(numberOfInodeOperation>=ULTRACOPIER_PLUGIN_MAXPARALLELINODEOPT)
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/RmPath.cpp Rsync/RmPath.cpp
+--- Ultracopier-0.3/RmPath.cpp 2012-06-29 22:37:41.715716675 +0200
++++ Rsync/RmPath.cpp 2012-06-29 22:42:25.105711780 +0200
+@@ -16,12 +16,12 @@
+ wait();
+ }
+
+-void RmPath::addPath(const QString &path)
++void RmPath::addPath(const QString &path,const bool &toSync)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+path);
+ if(stopIt)
+ return;
+- emit internalStartAddPath(path);
++ emit internalStartAddPath(path,toSync);
+ }
+
+ void RmPath::skip()
+@@ -38,7 +38,7 @@
+
+ void RmPath::run()
+ {
+- connect(this,SIGNAL(internalStartAddPath(QString)),this,SLOT(internalAddPath(QString)),Qt::QueuedConnection);
++ connect(this,SIGNAL(internalStartAddPath(QString,bool)),this,SLOT(internalAddPath(QString,bool)),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartDoThisPath()),this,SLOT(internalDoThisPath()),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartSkip()),this,SLOT(internalSkip()),Qt::QueuedConnection);
+ connect(this,SIGNAL(internalStartRetry()),this,SLOT(internalRetry()),Qt::QueuedConnection);
+@@ -50,23 +50,63 @@
+ if(waitAction || pathList.isEmpty())
+ return;
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+pathList.first());
+- if(!rmpath(pathList.first()))
++ if(!toSyncList.first())
+ {
+- if(stopIt)
++ if(!rmpath(pathList.first(),false))
++ {
++ if(stopIt)
++ return;
++ waitAction=true;
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to remove the folder: "+pathList.first());
++ emit errorOnFolder(pathList.first(),tr("Unable to remove the folder"));
+ return;
+- waitAction=true;
+- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to remove the folder: "+pathList.first());
+- emit errorOnFolder(pathList.first(),tr("Unable to remove the folder"));
+- return;
++ }
++ }
++ else
++ {
++ if(QFileInfo(pathList.first()).isDir())
++ {
++ if(!rmpath(pathList.first(),true))
++ {
++ if(stopIt)
++ return;
++ waitAction=true;
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to remove the folder: "+pathList.first());
++ emit errorOnFolder(pathList.first(),tr("Unable to remove the folder"));
++ return;
++ }
++ }
++ else if(!rmfile(pathList.first()))
++ {
++ if(stopIt)
++ return;
++ waitAction=true;
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"Unable to remove the file: "+pathList.first());
++ emit errorOnFolder(pathList.first(),tr("Unable to remove the file"));
++ return;
++ }
+ }
+ pathList.removeFirst();
++ toSyncList.removeFirst();
+ emit firstFolderFinish();
+ checkIfCanDoTheNext();
+ }
+
++bool RmPath::rmfile(QString filePath)
++{
++ QFile file(filePath);
++ if(!file.remove())
++ {
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to remove the file: "+file.fileName()+", error: "+file.errorString());
++ return false;
++ }
++ else
++ return true;
++}
++
+ /** remplace QDir::rmpath() because it return false if the folder not exists
+ and seam bug with parent folder */
+-bool RmPath::rmpath(const QDir &dir)
++bool RmPath::rmpath(const QDir &dir,const bool &toSync)
+ {
+ if(!dir.exists())
+ return true;
+@@ -77,28 +117,40 @@
+ QFileInfo fileInfo(list.at(i));
+ if(!fileInfo.isDir())
+ {
+- ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"found a file: "+fileInfo.fileName());
+- allHaveWork=false;
++ if(toSync)
++ {
++ if(!rmfile(fileInfo.absoluteFilePath()))
++ {
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to remove a file: "+fileInfo.fileName());
++ allHaveWork=false;
++ }
++ }
++ else
++ {
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"found a file: "+fileInfo.fileName());
++ allHaveWork=false;
++ }
+ }
+ else
+ {
+ //return the fonction for scan the new folder
+- if(!rmpath(dir.absolutePath()+'/'+fileInfo.fileName()+'/'))
++ if(!rmpath(dir.absolutePath()+'/'+fileInfo.fileName()+'/',toSync))
+ allHaveWork=false;
+ }
+ }
+ if(!allHaveWork)
+- return allHaveWork;
++ return false;
+ allHaveWork=dir.rmdir(dir.absolutePath());
+ if(!allHaveWork)
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,"unable to remove the folder: "+dir.absolutePath());
+ return allHaveWork;
+ }
+
+-void RmPath::internalAddPath(const QString &path)
++void RmPath::internalAddPath(const QString &path,const bool &toSync)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start: "+path);
+ pathList << path;
++ toSyncList << toSync;
+ if(!waitAction)
+ checkIfCanDoTheNext();
+ }
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/RmPath.h Rsync/RmPath.h
+--- Ultracopier-0.3/RmPath.h 2012-03-19 17:34:43.572371290 +0100
++++ Rsync/RmPath.h 2012-06-29 22:36:02.135718395 +0200
+@@ -24,11 +24,11 @@
+ explicit RmPath();
+ ~RmPath();
+ /// \brief add new path to remove
+- void addPath(const QString &path);
++ void addPath(const QString &path,const bool &toSync);
+ signals:
+ void errorOnFolder(const QFileInfo &,const QString &);
+ void firstFolderFinish();
+- void internalStartAddPath(const QString &path);
++ void internalStartAddPath(const QString &path,const bool &toSync);
+ void internalStartDoThisPath();
+ void internalStartSkip();
+ void internalStartRetry();
+@@ -42,12 +42,14 @@
+ bool stopIt;
+ bool skipIt;
+ QStringList pathList;
++ QList<bool> toSyncList;
+ void checkIfCanDoTheNext();
+ QDir dir;
+- bool rmpath(const QDir &dir);
++ bool rmpath(const QDir &dir,const bool &toSync);
++ bool rmfile(QString filePath);
+ private slots:
+ void internalDoThisPath();
+- void internalAddPath(const QString &path);
++ void internalAddPath(const QString &path,const bool &toSync);
+ void internalSkip();
+ void internalRetry();
+ };
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/TransferThread.cpp Rsync/TransferThread.cpp
+--- Ultracopier-0.3/TransferThread.cpp 2012-06-29 15:58:31.546130402 +0200
++++ Rsync/TransferThread.cpp 2012-06-29 18:58:24.095943961 +0200
+@@ -26,6 +26,7 @@
+ alwaysDoFileExistsAction= FileExists_NotSet;
+ readError = false;
+ writeError = false;
++ rsync = false;
+ this->mkpathTransfer = mkpathTransfer;
+ readThread.setWriteThread(&writeThread);
+
+@@ -278,7 +279,7 @@
+ {
+ //check if destination exists
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"["+QString::number(id)+"] overwrite: "+QString::number(fileExistsAction)+", always action: "+QString::number(alwaysDoFileExistsAction));
+- if(alwaysDoFileExistsAction==FileExists_Overwrite || readError || writeError)
++ if(alwaysDoFileExistsAction==FileExists_Overwrite || rsync || readError || writeError)
+ return false;
+ if(destinationInfo.exists())
+ {
+@@ -1124,6 +1125,12 @@
+ emit tryPutAtBottom();
+ }
+
++/// \brief set rsync
++void TransferThread::setRsync(const bool rsync)
++{
++ this->rsync=rsync;
++}
++
+ void TransferThread::set_osBufferLimit(unsigned int osBufferLimit)
+ {
+ this->osBufferLimit=osBufferLimit;
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/TransferThread.h Rsync/TransferThread.h
+--- Ultracopier-0.3/TransferThread.h 2012-06-26 11:10:54.541994070 +0200
++++ Rsync/TransferThread.h 2012-06-29 15:54:29.286134585 +0200
+@@ -113,6 +113,8 @@
+ qint64 copiedSize();
+ /// \brief put the current file at bottom
+ void putAtBottom();
++ /// \brief set rsync
++ void setRsync(const bool rsync);
+
+ void set_osBufferLimit(unsigned int osBufferLimit);
+ void setRenamingRules(QString firstRenamingRule,QString otherRenamingRule);
+@@ -166,6 +168,7 @@
+ bool readIsClosedVariable;
+ bool writeIsClosedVariable;
+ bool canBeMovedDirectlyVariable;
++ bool rsync;
+ QByteArray sourceChecksum,destinationChecksum;
+ volatile bool stopIt;
+ volatile bool canStartTransfer;
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/copyEngine.cpp Rsync/copyEngine.cpp
+--- Ultracopier-0.3/copyEngine.cpp 2012-06-26 14:14:40.892116001 +0200
++++ Rsync/copyEngine.cpp 2012-06-29 21:22:50.945794251 +0200
+@@ -186,6 +186,7 @@
+ connect(ui->keepDate, SIGNAL(toggled(bool)), &threadOfTheTransfer, SLOT(setKeepDate(bool)));
+ connect(ui->blockSize, SIGNAL(valueChanged(int)), &threadOfTheTransfer, SLOT(setBlockSize(int)));*/
+ connect(ui->autoStart, SIGNAL(toggled(bool)), this, SLOT(setAutoStart(bool)));
++ connect(ui->rsync, SIGNAL(toggled(bool)), this, SLOT(setRsync(bool)));
+ connect(ui->checkBoxDestinationFolderExists, SIGNAL(toggled(bool)), this, SLOT(setCheckDestinationFolderExists(bool)));
+ uiIsInstalled=true;
+ setRightTransfer(doRightTransfer);
+@@ -193,6 +194,7 @@
+ setSpeedLimitation(maxSpeed);
+ setBlockSize(blockSize);
+ setAutoStart(autoStart);
++ setRsync(rsync);
+ setCheckDestinationFolderExists(checkDestinationFolderExists);
+ set_doChecksum(doChecksum);
+ set_checksumIgnoreIfImpossible(checksumIgnoreIfImpossible);
+@@ -216,6 +218,7 @@
+ connect(ui->keepDate, SIGNAL(toggled(bool)), this,SLOT(setKeepDate(bool)));
+ connect(ui->blockSize, SIGNAL(valueChanged(int)), this,SLOT(setBlockSize(int)));
+ connect(ui->autoStart, SIGNAL(toggled(bool)), this,SLOT(setAutoStart(bool)));
++ connect(ui->rsync, SIGNAL(toggled(bool)), this,SLOT(setRsync(bool)));
+ connect(ui->doChecksum, SIGNAL(toggled(bool)), this,SLOT(doChecksum_toggled(bool)));
+ connect(ui->checksumIgnoreIfImpossible, SIGNAL(toggled(bool)), this,SLOT(checksumIgnoreIfImpossible_toggled(bool)));
+ connect(ui->checksumOnlyOnError, SIGNAL(toggled(bool)), this,SLOT(checksumOnlyOnError_toggled(bool)));
+@@ -505,6 +508,13 @@
+ /** \brief give the forced mode, to export/import transfer list */
+ void copyEngine::forceMode(const CopyMode &mode)
+ {
++ if(mode==Move)
++ {
++ listThread->setRsync(false);
++ rsync=false;
++ }
++ if(uiIsInstalled)
++ ui->rsync->setEnabled(mode==Copy);
+ if(forcedMode)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Warning,QString("Mode forced previously"));
+@@ -617,6 +627,19 @@
+ listThread->setAutoStart(autoStart);
+ }
+
++/// \brief set rsync
++void copyEngine::setRsync(const bool rsync)
++{
++ this->rsync=rsync;
++ if(uiIsInstalled)
++ {
++ ui->rsync->setChecked(rsync);
++ ui->rsync->setEnabled(forcedMode && mode==Copy);
++ ui->label_rsync->setEnabled(forcedMode && mode==Copy);
++ }
++ listThread->setRsync(rsync);
++}
++
+ //set check destination folder
+ void copyEngine::setCheckDestinationFolderExists(const bool checkDestinationFolderExists)
+ {
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/copyEngine.h Rsync/copyEngine.h
+--- Ultracopier-0.3/copyEngine.h 2012-06-25 16:50:12.191263770 +0200
++++ Rsync/copyEngine.h 2012-06-29 15:49:45.856139485 +0200
+@@ -60,6 +60,7 @@
+ bool keepDate;
+ int blockSize;
+ bool autoStart;
++ bool rsync;
+ bool checkDestinationFolderExists;
+ FileExistsAction alwaysDoThisActionForFileExists;
+ FileErrorAction alwaysDoThisActionForFileError;
+@@ -273,6 +274,8 @@
+ void setBlockSize(const int blockSize);
+ /// \brief set auto start
+ void setAutoStart(const bool autoStart);
++ /// \brief set rsync
++ void setRsync(const bool rsync);
+ /// \brief set if need check if the destination folder exists
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ /// \brief reset widget
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/copyEngine.pro.user Rsync/copyEngine.pro.user
+--- Ultracopier-0.3/copyEngine.pro.user 2012-06-26 15:50:53.722179836 +0200
++++ Rsync/copyEngine.pro.user 2012-06-29 22:42:24.025711798 +0200
+@@ -1,6 +1,6 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <!DOCTYPE QtCreatorProject>
+-<!-- Written by Qt Creator 2.5.0, 2012-06-26T15:50:53. -->
++<!-- Written by Qt Creator 2.5.0, 2012-06-29T22:42:24. -->
+ <qtcreator>
+ <data>
+ <variable>ProjectExplorer.Project.ActiveTarget</variable>
+@@ -163,7 +163,113 @@
+ <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId">2</value>
+ <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
+ </valuemap>
+- <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">2</value>
++ <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.2">
++ <value type="QString" key="ProjectExplorer.BuildCOnfiguration.ToolChain">ProjectExplorer.ToolChain.Gcc:{d6ee78f7-3364-4f54-a93f-b3c1e2a8c8c9}</value>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
++ <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
++ </valuemap>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
++ <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
++ </valuemap>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
++ <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
++ <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
++ <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 5.0.0 (qt-everywhere-opensource-src-5.0.0) Release</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
++ <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">0</value>
++ <value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/home/user/Desktop/ultracopier/sources/plugins/CopyEngine/copyEngine-build-desktop-Qt_5_0_0__qt-everywhere-opensource-src-5_0_0__Release</value>
++ <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId">3</value>
++ <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
++ </valuemap>
++ <valuemap type="QVariantMap" key="ProjectExplorer.Target.BuildConfiguration.3">
++ <value type="QString" key="ProjectExplorer.BuildCOnfiguration.ToolChain">ProjectExplorer.ToolChain.Gcc:{d6ee78f7-3364-4f54-a93f-b3c1e2a8c8c9}</value>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">qmake</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">QtProjectManager.QMakeBuildStep</value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibrary">false</value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.LinkQmlDebuggingLibraryAuto">true</value>
++ <value type="QString" key="QtProjectManager.QMakeBuildStep.QMakeArguments"></value>
++ <value type="bool" key="QtProjectManager.QMakeBuildStep.QMakeForced">false</value>
++ </valuemap>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.1">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
++ <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">false</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments"></value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">2</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Build</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Build</value>
++ </valuemap>
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.1">
++ <valuemap type="QVariantMap" key="ProjectExplorer.BuildStepList.Step.0">
++ <value type="bool" key="ProjectExplorer.BuildStep.Enabled">true</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Make</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.MakeStep</value>
++ <value type="bool" key="Qt4ProjectManager.MakeStep.Clean">true</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeArguments">clean</value>
++ <value type="QString" key="Qt4ProjectManager.MakeStep.MakeCommand"></value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">1</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Clean</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">ProjectExplorer.BuildSteps.Clean</value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.BuildConfiguration.BuildStepListCount">2</value>
++ <value type="bool" key="ProjectExplorer.BuildConfiguration.ClearSystemEnvironment">false</value>
++ <valuelist type="QVariantList" key="ProjectExplorer.BuildConfiguration.UserEnvironmentChanges"/>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DefaultDisplayName">Qt 5.0.0 (qt-everywhere-opensource-src-5.0.0) Debug</value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.DisplayName"></value>
++ <value type="QString" key="ProjectExplorer.ProjectConfiguration.Id">Qt4ProjectManager.Qt4BuildConfiguration</value>
++ <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildConfiguration">2</value>
++ <value type="QString" key="Qt4ProjectManager.Qt4BuildConfiguration.BuildDirectory">/home/user/Desktop/ultracopier/sources/plugins/CopyEngine/copyEngine-build-desktop-Qt_5_0_0__qt-everywhere-opensource-src-5_0_0__Debug</value>
++ <value type="int" key="Qt4ProjectManager.Qt4BuildConfiguration.QtVersionId">3</value>
++ <value type="bool" key="Qt4ProjectManager.Qt4BuildConfiguration.UseShadowBuild">true</value>
++ </valuemap>
++ <value type="int" key="ProjectExplorer.Target.BuildConfigurationCount">4</value>
+ <valuemap type="QVariantMap" key="ProjectExplorer.Target.DeployConfiguration.0">
+ <valuemap type="QVariantMap" key="ProjectExplorer.BuildConfiguration.BuildStepList.0">
+ <value type="int" key="ProjectExplorer.BuildStepList.StepsCount">0</value>
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/factory.cpp Rsync/factory.cpp
+--- Ultracopier-0.3/factory.cpp 2012-06-26 14:10:39.972113336 +0200
++++ Rsync/factory.cpp 2012-06-29 15:40:43.606148853 +0200
+@@ -35,6 +35,7 @@
+ connect(ui->keepDate, SIGNAL(toggled(bool)), this,SLOT(setKeepDate(bool)));
+ connect(ui->blockSize, SIGNAL(valueChanged(int)), this,SLOT(setBlockSize(int)));
+ connect(ui->autoStart, SIGNAL(toggled(bool)), this,SLOT(setAutoStart(bool)));
++ connect(ui->rsync, SIGNAL(toggled(bool)), this,SLOT(setRsync(bool)));
+ connect(ui->doChecksum, SIGNAL(toggled(bool)), this,SLOT(doChecksum_toggled(bool)));
+ connect(ui->checksumIgnoreIfImpossible, SIGNAL(toggled(bool)), this,SLOT(checksumIgnoreIfImpossible_toggled(bool)));
+ connect(ui->checksumOnlyOnError, SIGNAL(toggled(bool)), this,SLOT(checksumOnlyOnError_toggled(bool)));
+@@ -71,6 +72,7 @@
+ realObject->setKeepDate( optionsEngine->getOptionValue("keepDate").toBool());
+ realObject->setBlockSize( optionsEngine->getOptionValue("blockSize").toInt());
+ realObject->setAutoStart( optionsEngine->getOptionValue("autoStart").toBool());
++ realObject->setRsync( optionsEngine->getOptionValue("rsync").toBool());
+ realObject->on_comboBoxFolderColision_currentIndexChanged(ui->comboBoxFolderColision->currentIndex());
+ realObject->on_comboBoxFolderError_currentIndexChanged(ui->comboBoxFolderError->currentIndex());
+ realObject->setCheckDestinationFolderExists( optionsEngine->getOptionValue("checkDestinationFolder").toBool());
+@@ -123,6 +125,7 @@
+ KeysList.append(qMakePair(QString("keepDate"),QVariant(true)));
+ KeysList.append(qMakePair(QString("blockSize"),QVariant(1024)));//1024KB as default
+ KeysList.append(qMakePair(QString("autoStart"),QVariant(true)));
++ KeysList.append(qMakePair(QString("rsync"),QVariant(true)));
+ KeysList.append(qMakePair(QString("folderError"),QVariant(0)));
+ KeysList.append(qMakePair(QString("folderColision"),QVariant(0)));
+ KeysList.append(qMakePair(QString("checkDestinationFolder"),QVariant(true)));
+@@ -151,6 +154,7 @@
+ ui->keepDate->setChecked(optionsEngine->getOptionValue("keepDate").toBool());
+ ui->blockSize->setValue(optionsEngine->getOptionValue("blockSize").toUInt());
+ ui->autoStart->setChecked(optionsEngine->getOptionValue("autoStart").toBool());
++ ui->rsync->setChecked(optionsEngine->getOptionValue("rsync").toBool());
+ ui->comboBoxFolderError->setCurrentIndex(optionsEngine->getOptionValue("folderError").toUInt());
+ ui->comboBoxFolderColision->setCurrentIndex(optionsEngine->getOptionValue("folderColision").toUInt());
+ ui->checkBoxDestinationFolderExists->setChecked(optionsEngine->getOptionValue("checkDestinationFolder").toBool());
+@@ -287,6 +291,15 @@
+ else
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"internal error, crash prevented");
+ }
++
++void Factory::setRsync(bool rsync)
++{
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"the checkbox have changed");
++ if(optionsEngine!=NULL)
++ optionsEngine->setOptionValue("rsync",rsync);
++ else
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Critical,"internal error, crash prevented");
++}
+
+ void Factory::newLanguageLoaded()
+ {
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/factory.h Rsync/factory.h
+--- Ultracopier-0.3/factory.h 2012-05-19 15:44:05.354039716 +0200
++++ Rsync/factory.h 2012-06-29 15:40:20.016149261 +0200
+@@ -71,6 +71,7 @@
+ void setKeepDate(bool keepDate);
+ void setBlockSize(int blockSize);
+ void setAutoStart(bool autoStart);
++ void setRsync(bool rsync);
+ void showFilterDialog();
+ void sendNewFilters(QStringList includeStrings,QStringList includeOptions,QStringList excludeStrings,QStringList excludeOptions);
+ void doChecksum_toggled(bool);
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/informations.xml Rsync/informations.xml
+--- Ultracopier-0.3/informations.xml 2012-06-25 17:31:49.331291383 +0200
++++ Rsync/informations.xml 2012-06-29 15:11:53.696178734 +0200
+@@ -1,7 +1,7 @@
+ <?xml version="1.0" encoding="UTF-8"?>
+ <package>
+- <title xml:lang="en"><![CDATA[Copy engine of Ultracopier 0.3]]></title><!-- english is required -->
+- <title xml:lang="fr"><![CDATA[Moteur de copie d'ultracopier 0.3]]></title>
++ <title xml:lang="en"><![CDATA[Rsync copy engine]]></title><!-- english is required -->
++ <title xml:lang="fr"><![CDATA[Moteur de copie rsync]]></title>
+ <!-- What kind of plugin this is -->
+ <category>CopyEngine</category>
+ <!-- Who wrote this plugin -->
+@@ -14,12 +14,12 @@
+ <!-- the architecture code of this plugin, found PlatformMacro.h into ultracopier source -->
+ <architecture>linux-x86_64-pc</architecture>
+ <!-- Detailed description -->
+- <description xml:lang="en"><![CDATA[Copy engine of Ultracopier 0.3, do in Qt for all platform, and copy by stream]]></description>
+- <description xml:lang="fr"><![CDATA[Moteur de copie d'ultracopier 0.3, fait en Qt pour toutes les plateformes, et copie par stream]]></description>
++ <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>0.3.0.10</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-0.3</name>
++ <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. -->
+ <dependencies><![CDATA[
+ >=ultracopier-0.3.0.10
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/options.ui Rsync/options.ui
+--- Ultracopier-0.3/options.ui 2012-06-20 14:56:21.509908805 +0200
++++ Rsync/options.ui 2012-06-29 22:15:47.595739375 +0200
+@@ -6,8 +6,8 @@
+ <rect>
+ <x>0</x>
+ <y>0</y>
+- <width>356</width>
+- <height>376</height>
++ <width>354</width>
++ <height>399</height>
+ </rect>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+@@ -122,7 +122,7 @@
+ <item row="6" column="2">
+ <widget class="QCheckBox" name="checkBoxDestinationFolderExists"/>
+ </item>
+- <item row="7" column="0" colspan="3">
++ <item row="8" column="0" colspan="3">
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Checksum</string>
+@@ -175,24 +175,24 @@
+ </layout>
+ </widget>
+ </item>
+- <item row="8" column="1">
++ <item row="9" column="1">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Enable OS buffer</string>
+ </property>
+ </widget>
+ </item>
+- <item row="8" column="2">
++ <item row="9" column="2">
+ <widget class="QCheckBox" name="osBuffer"/>
+ </item>
+- <item row="9" column="0" colspan="2">
++ <item row="10" column="0" colspan="2">
+ <widget class="QCheckBox" name="osBufferLimited">
+ <property name="text">
+ <string>OS buffer only if smaller than</string>
+ </property>
+ </widget>
+ </item>
+- <item row="9" column="2">
++ <item row="10" column="2">
+ <widget class="QSpinBox" name="osBufferLimit">
+ <property name="suffix">
+ <string>KB</string>
+@@ -215,7 +215,7 @@
+ </property>
+ </widget>
+ </item>
+- <item row="12" column="1">
++ <item row="13" column="1">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+@@ -228,20 +228,34 @@
+ </property>
+ </spacer>
+ </item>
+- <item row="11" column="1">
++ <item row="12" column="1">
+ <widget class="QPushButton" name="filters">
+ <property name="text">
+ <string>Filters</string>
+ </property>
+ </widget>
+ </item>
+- <item row="10" column="1">
++ <item row="11" column="1">
+ <widget class="QPushButton" name="renamingRules">
+ <property name="text">
+ <string>Renaming rules</string>
+ </property>
+ </widget>
+ </item>
++ <item row="7" column="2">
++ <widget class="QCheckBox" name="rsync">
++ <property name="text">
++ <string/>
++ </property>
++ </widget>
++ </item>
++ <item row="7" column="0" colspan="2">
++ <widget class="QLabel" name="label_rsync">
++ <property name="text">
++ <string>Rsync (only in copy mode)</string>
++ </property>
++ </widget>
++ </item>
+ </layout>
+ </widget>
+ <resources/>
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/scanFileOrFolder.cpp Rsync/scanFileOrFolder.cpp
+--- Ultracopier-0.3/scanFileOrFolder.cpp 2012-05-23 11:06:25.001037392 +0200
++++ Rsync/scanFileOrFolder.cpp 2012-06-29 21:54:15.555761695 +0200
+@@ -1,9 +1,10 @@
+ #include "scanFileOrFolder.h"
+
+-#include <QMessageBox>
++#include <QDateTime>
+
+ scanFileOrFolder::scanFileOrFolder(CopyMode mode)
+ {
++ rsync=false;
+ stopped = true;
+ stopIt = false;
+ this->mode=mode;
+@@ -427,7 +428,17 @@
+ if(!included)
+ {}
+ else
+- emit fileTransfer(fileInfo.absoluteFilePath(),finalDest+fileName,mode);
++ {
++ bool sendToTransfer=false;
++ if(!rsync)
++ sendToTransfer=true;
++ else if(!QFile::exists(finalDest+fileName))
++ sendToTransfer=true;
++ else if(fileInfo.lastModified()!=QFileInfo(finalDest+fileName).lastModified())
++ sendToTransfer=true;
++ if(sendToTransfer)
++ emit fileTransfer(fileInfo.absoluteFilePath(),finalDest+fileName,mode);
++ }
+ }
+ }
+ }
+@@ -437,9 +448,43 @@
+ //listFolder(source,destination,suffixPath+fileInfo.fileName()+QDir::separator());
+ listFolder(source,destination,sourceSuffixPath+fileInfo.fileName()+"/",destinationSuffixPath+fileInfo.fileName()+"/");//put unix separator because it's transformed into that's under windows too
+ else
+- emit fileTransfer(fileInfo.absoluteFilePath(),finalDest+fileInfo.fileName(),mode);
++ {
++ bool sendToTransfer=false;
++ if(!rsync)
++ sendToTransfer=true;
++ else if(!QFile::exists(finalDest+fileInfo.fileName()))
++ sendToTransfer=true;
++ else if(fileInfo.lastModified()!=QFileInfo(finalDest+fileInfo.fileName()).lastModified())
++ sendToTransfer=true;
++ if(sendToTransfer)
++ emit fileTransfer(fileInfo.absoluteFilePath(),finalDest+fileInfo.fileName(),mode);
++ }
+ }
+ }
++ if(rsync)
++ {
++ //check the reverse path here
++ QFileInfoList entryListDestination=QDir(finalDest).entryInfoList(QDir::AllEntries|QDir::NoDotAndDotDot|QDir::Hidden|QDir::System,QDir::DirsFirst|QDir::Name|QDir::IgnoreCase);//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(finalDest+entryListDestination.at(indexDestination).fileName());
++ }
++ }
++ return;
++ }
++
+ if(mode==Move)
+ {
+ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"newSource: "+newSource+", sizeEntryList: "+QString::number(sizeEntryList));
+@@ -458,3 +503,9 @@
+ this->firstRenamingRule=firstRenamingRule;
+ this->otherRenamingRule=otherRenamingRule;
+ }
++
++/// \brief set rsync
++void scanFileOrFolder::setRsync(const bool rsync)
++{
++ this->rsync=rsync;
++}
+diff -U 3 -H -d -r -N -- Ultracopier-0.3/scanFileOrFolder.h Rsync/scanFileOrFolder.h
+--- Ultracopier-0.3/scanFileOrFolder.h 2012-05-20 20:32:43.695874620 +0200
++++ Rsync/scanFileOrFolder.h 2012-06-29 21:51:45.235764294 +0200
+@@ -38,6 +38,8 @@
+ /// \brief set if need check if the destination exists
+ void setCheckDestinationFolderExists(const bool checkDestinationFolderExists);
+ void setRenamingRules(QString firstRenamingRule,QString otherRenamingRule);
++ /// \brief set rsync
++ void setRsync(const bool rsync);
+ signals:
+ void fileTransfer(const QFileInfo &source,const QFileInfo &destination,const CopyMode &mode);
+ /// \brief To debug source
+@@ -49,6 +51,7 @@
+ void newFolderListing(const QString &path);
+ void addToMkPath(const QString& folder);
+ void addToRmPath(const QString& folder,const int& inodeToRemove);
++ void addToRmForRsync(const QString& inode);
+ public slots:
+ void addToList(const QStringList& sources,const QString& destination);
+ void setFilters(QList<Filters_rules> include,QList<Filters_rules> exclude);
+@@ -69,6 +72,7 @@
+ QString prefix;
+ QString suffix;
+ CopyMode mode;
++ bool rsync;
+ QList<Filters_rules> include,exclude;
+ QList<Filters_rules> include_send,exclude_send;
+ bool reloadTheNewFilters;
diff --git a/patch/opensource/KDE-Ultracopier.patch b/patch/opensource/KDE-Ultracopier.patch
new file mode 100644
index 0000000..4130c08
--- /dev/null
+++ b/patch/opensource/KDE-Ultracopier.patch
@@ -0,0 +1,290 @@
+diff -U 3 -H -d -r -N -- kde-baseapps-4.8.4/lib/konq/CMakeLists.txt kde-baseapps-4.8.4-ultracopier/lib/konq/CMakeLists.txt
+--- kde-baseapps-4.8.4/lib/konq/CMakeLists.txt 2011-09-26 11:43:17.390868969 +0200
++++ kde-baseapps-4.8.4-ultracopier/lib/konq/CMakeLists.txt 2012-06-27 09:54:15.909492978 +0200
+@@ -9,6 +9,7 @@
+ include_directories( ${ZLIB_INCLUDE_DIR} )
+
+ set(konq_LIB_SRCS
++ ClientCatchcopy.cpp
+ konq_popupmenu.cpp # used by konqueror, kfind, folderview, kickoff
+ konq_popupmenuplugin.cpp # for KonqPopupMenu and its plugins
+ konq_dndpopupmenuplugin.cpp # for KonqDndPopupMenu and its plugins
+@@ -53,6 +54,7 @@
+
+ install( FILES directory_bookmarkbar.desktop DESTINATION ${DATA_INSTALL_DIR}/kbookmark )
+ install( FILES
++ ClientCatchcopy.h
+ konq_popupmenu.h
+ konq_popupmenuinformation.h
+ konq_popupmenuplugin.h
+diff -U 3 -H -d -r -N -- kde-baseapps-4.8.4/lib/konq/ClientCatchcopy.cpp kde-baseapps-4.8.4-ultracopier/lib/konq/ClientCatchcopy.cpp
+--- kde-baseapps-4.8.4/lib/konq/ClientCatchcopy.cpp 1970-01-01 01:00:00.000000000 +0100
++++ kde-baseapps-4.8.4-ultracopier/lib/konq/ClientCatchcopy.cpp 2012-06-27 10:28:25.049457581 +0200
+@@ -0,0 +1,142 @@
++/** \file ClientCatchcopy.cpp
++\brief Define the catchcopy client
++\author alpha_one_x86
++\version 0002
++\date 2010 */
++
++#include "ClientCatchcopy.h"
++
++ClientCatchcopy::ClientCatchcopy()
++{
++ disconnectedFromSocket();
++ connect(&socket, SIGNAL(disconnected()), this, SLOT(disconnectedFromSocket()));
++ connect(&socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
++ connect(&socket, SIGNAL(connected()), this, SLOT(socketIsConnected()));
++}
++
++void ClientCatchcopy::socketIsConnected()
++{
++ sendProtocol();
++}
++
++void ClientCatchcopy::connectToServer()
++{
++ socket.connectToServer(pathSocket());
++ socket.waitForConnected();
++}
++
++const QString ClientCatchcopy::pathSocket()
++{
++#ifdef Q_OS_UNIX
++ return "advanced-copier-"+QString::number(getuid());
++#else
++ QString userName;
++ DWORD size=0;
++ if(GetUserNameW(NULL,&size) || (GetLastError()!=ERROR_INSUFFICIENT_BUFFER))
++ {
++ }
++ else
++ {
++ WCHAR * userNameW=new WCHAR[size];
++ if(GetUserNameW(userNameW,&size))
++ {
++ userName.fromWCharArray(userNameW,size*2);
++ userName=QString(QByteArray((char*)userNameW,size*2-2).toHex());
++ }
++ delete userNameW;
++ }
++ return "advanced-copier-"+userName;
++#endif
++}
++
++void ClientCatchcopy::disconnectFromServer()
++{
++ socket.abort();
++ socket.disconnectFromServer();
++}
++
++/// \brief to send stream of string list
++quint32 ClientCatchcopy::sendRawOrderList(const QStringList & order)
++{
++ if(!socket.isValid())
++ return -1;
++ if(socket.state()!=QLocalSocket::ConnectedState)
++ return -1;
++ idNextOrder++;
++ if(idNextOrder>2000000000)
++ idNextOrder=0;
++ QByteArray block;
++ QDataStream out(&block, QIODevice::WriteOnly);
++ out.setVersion(QDataStream::Qt_4_4);
++ out << int(0);
++ out << idNextOrder;
++ out << order;
++ out.device()->seek(0);
++ out << block.size();
++ do //cut string list and send it as block of 32KB
++ {
++ QByteArray blockToSend;
++ int byteWriten;
++ blockToSend=block.left(32*1024);//32KB
++ block.remove(0,blockToSend.size());
++ byteWriten = socket.write(blockToSend);
++ if(!socket.isValid())
++ return -1;
++ if(socket.errorString()!="Unknown error" && socket.errorString()!="")
++ return -1;
++ if(blockToSend.size()!=byteWriten)
++ return -1;
++ }
++ while(block.size());
++ return idNextOrder;
++}
++
++void ClientCatchcopy::readyRead()
++{
++ while(socket.bytesAvailable()>0)
++ {
++ socket.readAll();
++ }
++}
++
++void ClientCatchcopy::disconnectedFromSocket()
++{
++ idNextOrder = 0;
++}
++
++/// \brief to send the protocol version used
++void ClientCatchcopy::sendProtocol()
++{
++ sendRawOrderList(QStringList() << "protocol" << "0002");
++}
++
++void ClientCatchcopy::setClientName(const QString & name)
++{
++ sendRawOrderList(QStringList() << "client" << name);
++}
++
++bool ClientCatchcopy::addCopyWithDestination(const QStringList & sources,const QString & destination)
++{
++ if(socket.state()==QLocalSocket::UnconnectedState)
++ connectToServer();
++ if(socket.state()==QLocalSocket::ConnectedState)
++ {
++ sendRawOrderList(QStringList() << "cp" << sources << destination);
++ return true;
++ }
++ else
++ return false;
++}
++
++bool ClientCatchcopy::addMoveWithDestination(const QStringList & sources,const QString & destination)
++{
++ if(socket.state()==QLocalSocket::UnconnectedState)
++ connectToServer();
++ if(socket.state()==QLocalSocket::ConnectedState)
++ {
++ sendRawOrderList(QStringList() << "mv" << sources << destination);
++ return true;
++ }
++ else
++ return false;
++}
+diff -U 3 -H -d -r -N -- kde-baseapps-4.8.4/lib/konq/ClientCatchcopy.h kde-baseapps-4.8.4-ultracopier/lib/konq/ClientCatchcopy.h
+--- kde-baseapps-4.8.4/lib/konq/ClientCatchcopy.h 1970-01-01 01:00:00.000000000 +0100
++++ kde-baseapps-4.8.4-ultracopier/lib/konq/ClientCatchcopy.h 2012-06-27 10:28:52.169457112 +0200
+@@ -0,0 +1,58 @@
++/** \file ClientCatchcopy.h
++\brief Define the catchcopy client
++\author alpha_one_x86
++\version 0002
++\date 2010 */
++
++#ifndef CLIENTCATCHCOPY_H
++#define CLIENTCATCHCOPY_H
++
++#include <QObject>
++#include <QLocalSocket>
++#include <QStringList>
++#include <QString>
++#include <QByteArray>
++
++#ifdef Q_OS_UNIX
++ #include <unistd.h>
++ #include <sys/types.h>
++#else
++ #include <windows.h>
++#endif
++
++/// \brief Define the catchcopy client
++class ClientCatchcopy : public QObject
++{
++ Q_OBJECT
++ public:
++ ClientCatchcopy();
++ public slots:
++ void connectToServer();
++ void disconnectFromServer();
++ //to test and internal use
++ /// \brief set the client name
++ void setClientName(const QString & name);
++ /// \brief add copy with destination
++ bool addCopyWithDestination(const QStringList & sources,const QString & destination);
++ /// \brief add move with destination
++ bool addMoveWithDestination(const QStringList & sources,const QString & destination);
++ private:
++ /// \brief to send order
++ void sendProtocol();
++
++ const QString pathSocket();
++ quint32 idNextOrder;
++ //the local socket
++ QLocalSocket socket;
++
++ /// \brief to send stream of string list
++ quint32 sendRawOrderList(const QStringList & order);
++ private slots:
++ void readyRead();
++ void disconnectedFromSocket();
++ void socketIsConnected();
++ protected:
++ bool parseReply(quint32 orderId,quint32 returnCode,QStringList returnList);
++};
++
++#endif // CLIENTCATCHCOPY_H
+diff -U 3 -H -d -r -N -- kde-baseapps-4.8.4/lib/konq/konq_operations.cpp kde-baseapps-4.8.4-ultracopier/lib/konq/konq_operations.cpp
+--- kde-baseapps-4.8.4/lib/konq/konq_operations.cpp 2011-09-26 11:43:17.392868951 +0200
++++ kde-baseapps-4.8.4-ultracopier/lib/konq/konq_operations.cpp 2012-06-27 10:29:32.879456409 +0200
+@@ -154,6 +154,8 @@
+ }
+ }
+
++ClientCatchcopy KonqOperations::clientCatchcopy;
++
+ void KonqOperations::copy( QWidget * parent, Operation method, const KUrl::List & selectedUrls, const KUrl& destUrl )
+ {
+ kDebug(1203) << parent->metaObject()->className() << selectedUrls << destUrl;
+@@ -175,7 +177,30 @@
+ else if (method == MOVE)
+ job = KIO::move( selectedUrls, destUrl );
+ else
++ {
++ QStringList selectedFiles;
++ bool isLocal=true;
++ int index=0;
++ while(index<selectedUrls.size())
++ {
++ if(!selectedUrls.at(index).isLocalFile())
++ {
++ isLocal=false;
++ break;
++ }
++ selectedFiles << selectedUrls.at(index).toLocalFile();
++ index++;
++ }
++ isLocal&=destUrl.isLocalFile();
++ if(isLocal)
++ {
++ if(clientCatchcopy.addCopyWithDestination(selectedFiles,destUrl.toLocalFile()))
++ return;
++ }
++ else
+ job = KIO::copy( selectedUrls, destUrl );
++
++ }
+
+ op->setOperation( job, method, destUrl );
+
+diff -U 3 -H -d -r -N -- kde-baseapps-4.8.4/lib/konq/konq_operations.h kde-baseapps-4.8.4-ultracopier/lib/konq/konq_operations.h
+--- kde-baseapps-4.8.4/lib/konq/konq_operations.h 2011-07-27 20:36:39.112044764 +0200
++++ kde-baseapps-4.8.4-ultracopier/lib/konq/konq_operations.h 2012-06-27 09:31:29.109516591 +0200
+@@ -23,6 +23,8 @@
+ #ifndef __konq_operations_h__
+ #define __konq_operations_h__
+
++#include "ClientCatchcopy.h"
++
+ #include <kurl.h>
+ #include <libkonq_export.h>
+
+@@ -221,6 +223,7 @@
+
+ private:
+ QWidget* parentWidget() const;
++ static ClientCatchcopy clientCatchcopy;
+ void _del( Operation method, const KUrl::List & selectedUrls, ConfirmationType confirmation );
+ void _restoreTrashedItems( const KUrl::List& urls );
+ void _statUrl( const KUrl & url, const QObject *receiver, const char *member );
diff --git a/patch/opensource/options-with-pass.patch b/patch/opensource/options-with-pass.patch
new file mode 100644
index 0000000..c53cefd
--- /dev/null
+++ b/patch/opensource/options-with-pass.patch
@@ -0,0 +1,336 @@
+diff -U 3 -H -d -r -N -- sources/EventDispatcher.cpp sources-with-pass/EventDispatcher.cpp
+--- sources/EventDispatcher.cpp 2012-02-20 11:16:29.402151959 +0100
++++ sources-with-pass/EventDispatcher.cpp 2012-02-21 19:16:06.540690161 +0100
+@@ -52,6 +52,8 @@
+ KeysList.append(qMakePair(QString("Last_version_used"),QVariant("na")));
+ KeysList.append(qMakePair(QString("ActionOnManualOpen"),QVariant(1)));
+ KeysList.append(qMakePair(QString("GroupWindowWhen"),QVariant(0)));
++ KeysList.append(qMakePair(QString("checkBoxPass"),QVariant(true)));
++ KeysList.append(qMakePair(QString("Password"),QVariant("admin")));
+ options->addOptionGroup("Ultracopier",KeysList);
+ if(options->getOptionValue("Ultracopier","Last_version_used")!=QVariant("na") && options->getOptionValue("Ultracopier","Last_version_used")!=QVariant(ULTRACOPIER_VERSION))
+ {
+diff -U 3 -H -d -r -N -- sources/OptionDialog.cpp sources-with-pass/OptionDialog.cpp
+--- sources/OptionDialog.cpp 2012-02-21 19:22:24.990694347 +0100
++++ sources-with-pass/OptionDialog.cpp 2012-02-21 19:24:59.290696056 +0100
+@@ -222,6 +222,8 @@
+ newOptionValue("Themes", "Ultracopier_current_theme", options->getOptionValue("Themes","Ultracopier_current_theme"));
+ newOptionValue("Ultracopier", "ActionOnManualOpen", options->getOptionValue("Ultracopier","ActionOnManualOpen"));
+ newOptionValue("Ultracopier", "GroupWindowWhen", options->getOptionValue("Ultracopier","GroupWindowWhen"));
++ newOptionValue("Ultracopier", "checkBoxPass", options->getOptionValue("Ultracopier","checkBoxPass"));
++ newOptionValue("Ultracopier", "Password", options->getOptionValue("Ultracopier","Password"));
+ newOptionValue("Language", "Language", options->getOptionValue("Language","Language"));
+ newOptionValue("Language", "Language_autodetect", options->getOptionValue("Language","Language_autodetect"));
+ newOptionValue("SessionLoader", "LoadAtSessionStarting", options->getOptionValue("SessionLoader","LoadAtSessionStarting"));
+@@ -361,6 +363,14 @@
+ {
+ ui->GroupWindowWhen->setCurrentIndex(value.toInt());
+ }
++ if(name=="checkBoxPass")
++ {
++ ui->checkBoxPass->setChecked(value.toBool());
++ }
++ if(name=="Password")
++ {
++ ui->Password->setText(value.toString());
++ }
+ }
+ }
+
+@@ -706,3 +716,21 @@
+ options->setOptionValue("Ultracopier","ActionOnManualOpen",index);
+ }
+ }
++
++void OptionDialog::on_checkBoxPass_toggled(bool checked)
++{
++ if(index!=-1 && plugins->allPluginHaveBeenLoaded())
++ {
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
++ options->setOptionValue("Ultracopier","checkBoxPass",checked);
++ }
++}
++
++void OptionDialog::on_Password_editingFinished()
++{
++ if(index!=-1 && plugins->allPluginHaveBeenLoaded())
++ {
++ ULTRACOPIER_DEBUGCONSOLE(DebugLevel_Notice,"start");
++ options->setOptionValue("Ultracopier","Password",ui->Password->text());
++ }
++}
+diff -U 3 -H -d -r -N -- sources/OptionDialog.h sources-with-pass/OptionDialog.h
+--- sources/OptionDialog.h 2012-02-21 19:22:33.220694431 +0100
++++ sources-with-pass/OptionDialog.h 2012-02-21 19:25:05.490696125 +0100
+@@ -57,7 +57,8 @@
+ void on_checkBoxLog_folder_clicked();
+ void on_checkBoxLog_sync_clicked();
+ void on_ActionOnManualOpen_currentIndexChanged(int index);
+-
++ void on_checkBoxPass_toggled(bool checked);
++ void on_Password_editingFinished();
+ private:
+ Ui::OptionDialog *ui;
+ struct pluginStore
+diff -U 3 -H -d -r -N -- sources/OptionDialog.ui sources-with-pass/OptionDialog.ui
+--- sources/OptionDialog.ui 2012-02-10 19:52:43.711122987 +0100
++++ sources-with-pass/OptionDialog.ui 2012-02-21 19:16:55.130690698 +0100
+@@ -6,7 +6,7 @@
+ <rect>
+ <x>0</x>
+ <y>0</y>
+- <width>638</width>
++ <width>717</width>
+ <height>455</height>
+ </rect>
+ </property>
+@@ -80,6 +80,9 @@
+ <layout class="QVBoxLayout" name="verticalLayout_10">
+ <item>
+ <layout class="QFormLayout" name="formLayout_2">
++ <property name="fieldGrowthPolicy">
++ <enum>QFormLayout::ExpandingFieldsGrow</enum>
++ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="labelLanguage">
+ <property name="text">
+@@ -158,6 +161,13 @@
+ </item>
+ </widget>
+ </item>
++ <item row="5" column="0">
++ <widget class="QLabel" name="label_9">
++ <property name="text">
++ <string>Group window when:</string>
++ </property>
++ </widget>
++ </item>
+ <item row="5" column="1">
+ <widget class="QComboBox" name="GroupWindowWhen">
+ <item>
+@@ -192,10 +202,20 @@
+ </item>
+ </widget>
+ </item>
+- <item row="5" column="0">
+- <widget class="QLabel" name="label_9">
++ <item row="6" column="0">
++ <widget class="QCheckBox" name="checkBoxPass">
+ <property name="text">
+- <string>Group window when:</string>
++ <string>Protect options with a pass:</string>
++ </property>
++ </widget>
++ </item>
++ <item row="6" column="1">
++ <widget class="QLineEdit" name="Password">
++ <property name="enabled">
++ <bool>false</bool>
++ </property>
++ <property name="echoMode">
++ <enum>QLineEdit::Password</enum>
+ </property>
+ </widget>
+ </item>
+@@ -770,12 +790,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>313</x>
+- <y>13</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>533</x>
+- <y>44</y>
++ <x>237</x>
++ <y>9</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -786,12 +806,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>583</x>
+- <y>20</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>584</x>
+- <y>40</y>
++ <x>300</x>
++ <y>9</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -802,12 +822,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>345</x>
+- <y>21</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>582</x>
+- <y>105</y>
++ <x>301</x>
++ <y>14</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -818,12 +838,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>348</x>
+- <y>25</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>557</x>
+- <y>156</y>
++ <x>301</x>
++ <y>19</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -834,12 +854,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>537</x>
+- <y>105</y>
++ <x>301</x>
++ <y>14</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>533</x>
+- <y>131</y>
++ <x>301</x>
++ <y>16</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -850,12 +870,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>501</x>
+- <y>156</y>
++ <x>301</x>
++ <y>19</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>501</x>
+- <y>182</y>
++ <x>301</x>
++ <y>22</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -866,12 +886,12 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>269</x>
+- <y>15</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>456</x>
+- <y>207</y>
++ <x>301</x>
++ <y>25</y>
+ </hint>
+ </hints>
+ </connection>
+@@ -882,12 +902,28 @@
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+- <x>334</x>
+- <y>12</y>
++ <x>301</x>
++ <y>5</y>
+ </hint>
+ <hint type="destinationlabel">
+- <x>304</x>
+- <y>69</y>
++ <x>301</x>
++ <y>11</y>
++ </hint>
++ </hints>
++ </connection>
++ <connection>
++ <sender>checkBoxPass</sender>
++ <signal>toggled(bool)</signal>
++ <receiver>Password</receiver>
++ <slot>setEnabled(bool)</slot>
++ <hints>
++ <hint type="sourcelabel">
++ <x>412</x>
++ <y>169</y>
++ </hint>
++ <hint type="destinationlabel">
++ <x>482</x>
++ <y>172</y>
+ </hint>
+ </hints>
+ </connection>
+diff -U 3 -H -d -r -N -- sources/SystrayIcon.cpp sources-with-pass/SystrayIcon.cpp
+--- sources/SystrayIcon.cpp 2012-02-05 14:25:43.462930072 +0100
++++ sources-with-pass/SystrayIcon.cpp 2012-02-21 19:35:36.630703097 +0100
+@@ -5,6 +5,7 @@
+ \date 2010 */
+
+ #include <QMessageBox>
++#include <QInputDialog>
+
+ #include "SystrayIcon.h"
+
+@@ -33,7 +34,7 @@
+ //connect the action
+ connect(actionMenuQuit, SIGNAL(triggered()), this, SIGNAL(quit()));
+ connect(actionMenuAbout, SIGNAL(triggered()), this, SIGNAL(showHelp()));
+- connect(actionOptions, SIGNAL(triggered()), this, SIGNAL(showOptions()));
++ connect(actionOptions, SIGNAL(triggered()), this, SLOT(askPassIfNeeded()));
+ connect(sysTrayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(CatchAction(QSystemTrayIcon::ActivationReason)));
+ connect(plugins, SIGNAL(pluginListingIsfinish()), this, SLOT(reloadEngineList()));
+ //display the icon
+@@ -375,3 +376,17 @@
+ }
+ }
+ }
++
++void SystrayIcon::askPassIfNeeded()
++{
++ if(!options->getOptionValue("Ultracopier","checkBoxPass").toBool())
++ {
++ emit showOptions();
++ return;
++ }
++ QString pass=QInputDialog::getText(NULL,tr("Options password"),tr("Give the option for the password"),QLineEdit::Password);
++ if(pass==options->getOptionValue("Ultracopier","Password").toString())
++ emit showOptions();
++ else
++ QMessageBox::warning(NULL,tr("Error"),tr("Wrong password!"));
++}
+diff -U 3 -H -d -r -N -- sources/SystrayIcon.h sources-with-pass/SystrayIcon.h
+--- sources/SystrayIcon.h 2011-12-12 08:53:27.000000000 +0100
++++ sources-with-pass/SystrayIcon.h 2012-02-21 19:27:11.780697518 +0100
+@@ -78,6 +78,8 @@
+ /// \brief to retranslate the ui
+ void retranslateTheUI();
+ void reloadEngineList();
++ /// \brief ask the pass if needed
++ void askPassIfNeeded();
+ signals:
+ /// \brief Quit ultracopier
+ void quit();
diff --git a/plugins-alternative/CopyEngine/Rsync/AvancedQFile.cpp b/plugins-alternative/CopyEngine/Rsync/AvancedQFile.cpp
new file mode 100644
index 0000000..af5805b
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/AvancedQFile.cpp
@@ -0,0 +1,94 @@
+/** \file AvancedQFile.cpp
+\brief Define the QFile herited class to set file date/time
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include "AvancedQFile.h"
+
+#ifdef Q_CC_GNU
+//this next header is needed to change file time/date under gcc
+#include <utime.h>
+#include <errno.h>
+#endif
+
+//source
+//hSrc=CreateFile(pData->pfiSrcFile->GetFullFilePath(), GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffer ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL);
+//destination
+//hDst=CreateFile(pData->strDstFile, GENERIC_WRITE, FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN | (bNoBuffer ? FILE_FLAG_NO_BUFFERING | FILE_FLAG_WRITE_THROUGH : 0), NULL);
+
+bool AvancedQFile::setCreated(QDateTime time)
+{
+ time_t ctime=time.toTime_t();
+ #ifdef Q_CC_GNU
+ //creation time not exists into unix world
+ Q_UNUSED(ctime)
+ return true;
+ #else
+ setErrorString(tr("Not supported on this platform"));
+ return false;
+ #endif
+}
+
+bool AvancedQFile::setLastModified(QDateTime time)
+{
+ time_t actime=QFileInfo(*this).lastRead().toTime_t();
+ //protect to wrong actime
+ if(actime<0)
+ actime=0;
+ time_t modtime=time.toTime_t();
+ if(modtime<0)
+ {
+ setErrorString(tr("Last modified date is wrong"));
+ return false;
+ }
+ #ifdef Q_CC_GNU
+ //this function avalaible on unix and mingw
+ utimbuf butime;
+ butime.actime=actime;
+ butime.modtime=modtime;
+ int returnVal=utime(this->fileName().toLocal8Bit().data(),&butime);
+ if(returnVal==0)
+ return true;
+ else
+ {
+ setErrorString(strerror(errno));
+ return false;
+ }
+ #else
+ setErrorString(tr("Not supported on this platform"));
+ return false;
+ #endif
+}
+
+bool AvancedQFile::setLastRead(QDateTime time)
+{
+ time_t modtime=QFileInfo(*this).lastModified().toTime_t();
+ //protect to wrong actime
+ if(modtime<0)
+ modtime=0;
+ time_t actime=time.toTime_t();
+ if(actime<0)
+ {
+ setErrorString(tr("Last access date is wrong"));
+ return false;
+ }
+ #ifdef Q_CC_GNU
+ //this function avalaible on unix and mingw
+ utimbuf butime;
+ butime.actime=actime;
+ butime.modtime=modtime;
+ int returnVal=utime(this->fileName().toLocal8Bit().data(),&butime);
+ if(returnVal==0)
+ return true;
+ else
+ {
+ setErrorString(strerror(errno));
+ return false;
+ }
+ #else
+ setErrorString(tr("Not supported on this platform"));
+ return false;
+ #endif
+}
+
diff --git a/plugins-alternative/CopyEngine/Rsync/AvancedQFile.h b/plugins-alternative/CopyEngine/Rsync/AvancedQFile.h
new file mode 100644
index 0000000..284cf02
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/AvancedQFile.h
@@ -0,0 +1,32 @@
+/** \file AvancedQFile.h
+\brief Define the QFile herited class to set file date/time
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#ifndef AVANCEDQFILE_H
+#define AVANCEDQFILE_H
+
+#include <QFile>
+#include <QDateTime>
+#include <QFileInfo>
+
+/// \brief devired class from QFile to set time/date on file
+class AvancedQFile : public QFile
+{
+ Q_OBJECT
+public:
+ /// \brief set created date, not exists in unix world
+ bool setCreated(QDateTime time);
+ /// \brief set last modification date
+ bool setLastModified(QDateTime time);
+ /// \brief set last read date
+ bool setLastRead(QDateTime time);
+
+/* //fileName
+ void close();
+ bool open ( FILE * fh, OpenMode mode )
+ bool open ( int fd, OpenMode mode )*/
+};
+
+#endif // AVANCEDQFILE_H
diff --git a/plugins-alternative/CopyEngine/Rsync/CompilerInfo.h b/plugins-alternative/CopyEngine/Rsync/CompilerInfo.h
new file mode 100644
index 0000000..84625b9
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/CompilerInfo.h
@@ -0,0 +1 @@
+#include "../../../CompilerInfo.h"
diff --git a/plugins-alternative/CopyEngine/Rsync/DebugEngineMacro.h b/plugins-alternative/CopyEngine/Rsync/DebugEngineMacro.h
new file mode 100644
index 0000000..ad08d4f
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/DebugEngineMacro.h
@@ -0,0 +1,25 @@
+/** \file DebugEngineMacro.h
+\brief Define the macro for the debug
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#ifndef DEBUGENGINEMACRO_H
+#define DEBUGENGINEMACRO_H
+
+/// \brief Macro for the debug log
+#ifdef ULTRACOPIER_PLUGIN_DEBUG
+ #if defined (__FILE__) && defined (__LINE__)
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) emit debugInformation(a,__func__,b,__FILE__,__LINE__)
+ #else
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) emit debugInformation(a,__func__,b)
+ #endif
+#else // ULTRACOPIER_PLUGIN_DEBUG
+ #define ULTRACOPIER_DEBUGCONSOLE(a,b) void()
+#endif // ULTRACOPIER_PLUGIN_DEBUG
+
+#endif // DEBUGENGINEMACRO_H
+
+
+
+
diff --git a/plugins-alternative/CopyEngine/Rsync/Environment.h b/plugins-alternative/CopyEngine/Rsync/Environment.h
new file mode 100644
index 0000000..7ac6f16
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Environment.h
@@ -0,0 +1,12 @@
+/** \file Environment.h
+\brief Define the environment variable and global function
+\author alpha_one_x86
+\version 0.3
+\date 2010 */
+
+#include "Variable.h"
+/// \brief The global include
+#include "StructEnumDefinition.h"
+#include "StructEnumDefinition_CopyEngine.h"
+#include "DebugEngineMacro.h"
+#include "CompilerInfo.h"
diff --git a/plugins-alternative/CopyEngine/Rsync/FilterRules.cpp b/plugins-alternative/CopyEngine/Rsync/FilterRules.cpp
new file mode 100644
index 0000000..0e6ba25
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/FilterRules.cpp
@@ -0,0 +1,193 @@
+#include "FilterRules.h"
+#include "ui_FilterRules.h"
+
+#include <QMessageBox>
+
+FilterRules::FilterRules(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::FilterRules)
+{
+ ui->setupUi(this);
+ updateChecking();
+ haveBeenValided=false;
+}
+
+FilterRules::~FilterRules()
+{
+ delete ui;
+}
+
+bool FilterRules::getIsValid()
+{
+ return isValid && haveBeenValided;
+}
+
+QString FilterRules::get_search_text()
+{
+ return ui->search->text();
+}
+
+SearchType FilterRules::get_search_type()
+{
+ switch(ui->search_type->currentIndex())
+ {
+ case 0:
+ return SearchType_rawText;
+ case 1:
+ return SearchType_simpleRegex;
+ case 2:
+ return SearchType_perlRegex;
+ }
+ return SearchType_simpleRegex;
+}
+
+ApplyOn FilterRules::get_apply_on()
+{
+ switch(ui->apply_on->currentIndex())
+ {
+ case 0:
+ return ApplyOn_file;
+ case 1:
+ return ApplyOn_fileAndFolder;
+ case 2:
+ return ApplyOn_folder;
+ }
+ return ApplyOn_fileAndFolder;
+}
+
+bool FilterRules::get_need_match_all()
+{
+ return ui->need_match_all->isChecked();
+}
+
+void FilterRules::set_search_text(QString search_text)
+{
+ ui->search->setText(search_text);
+}
+
+void FilterRules::set_search_type(SearchType search_type)
+{
+ switch(search_type)
+ {
+ case SearchType_rawText:
+ ui->search_type->setCurrentIndex(0);
+ break;
+ case SearchType_simpleRegex:
+ ui->search_type->setCurrentIndex(1);
+ break;
+ case SearchType_perlRegex:
+ ui->search_type->setCurrentIndex(2);
+ break;
+ }
+}
+
+void FilterRules::set_apply_on(ApplyOn apply_on)
+{
+ switch(apply_on)
+ {
+ case ApplyOn_file:
+ ui->apply_on->setCurrentIndex(0);
+ break;
+ case ApplyOn_fileAndFolder:
+ ui->apply_on->setCurrentIndex(1);
+ break;
+ case ApplyOn_folder:
+ ui->apply_on->setCurrentIndex(2);
+ break;
+ }
+}
+
+void FilterRules::set_need_match_all(bool need_match_all)
+{
+ ui->need_match_all->setChecked(need_match_all);
+}
+
+void FilterRules::on_search_textChanged(const QString &arg1)
+{
+ Q_UNUSED(arg1);
+ updateChecking();
+}
+
+void FilterRules::updateChecking()
+{
+ QRegExp regex;
+ isValid=!ui->search->text().isEmpty();
+ if(isValid)
+ {
+ QString tempString;
+ if(ui->search_type->currentIndex()==0)
+ {
+ tempString=QRegExp::escape(ui->search->text());
+ if(tempString.contains('/') || tempString.contains('\\'))
+ isValid=false;
+ }
+ else if(ui->search_type->currentIndex()==1)
+ {
+ tempString=QRegExp::escape(ui->search->text());
+ tempString.replace("\\*","[^\\\\/]*");
+ }
+ else if(ui->search_type->currentIndex()==2)
+ {
+ tempString=ui->search->text();
+ if(tempString.startsWith('^') && tempString.endsWith('$'))
+ {
+ ui->need_match_all->setChecked(true);
+ tempString.remove(QRegExp("^\\^"));
+ tempString.remove(QRegExp("\\$$"));
+ ui->search->setText(tempString);
+ }
+ }
+ if(isValid)
+ {
+ if(ui->need_match_all->isChecked())
+ tempString="^"+tempString+"$";
+ regex=QRegExp(tempString);
+ isValid=regex.isValid() && !regex.isEmpty();
+ }
+ }
+
+ ui->isValid->setChecked(isValid);
+ ui->testString->setEnabled(isValid);
+ ui->label_test_string->setEnabled(isValid);
+ ui->matched->setEnabled(isValid);
+ ui->matched->setChecked(isValid && ui->testString->text().contains(regex));
+ ui->buttonBox->button(QDialogButtonBox::Ok)->setEnabled(isValid);
+}
+
+void FilterRules::on_isValid_clicked()
+{
+ updateChecking();
+}
+
+void FilterRules::on_testString_textChanged(const QString &arg1)
+{
+ Q_UNUSED(arg1);
+ updateChecking();
+}
+
+void FilterRules::on_matched_clicked()
+{
+ updateChecking();
+}
+
+void FilterRules::on_search_type_currentIndexChanged(int index)
+{
+ Q_UNUSED(index);
+ updateChecking();
+}
+
+void FilterRules::on_need_match_all_clicked()
+{
+ updateChecking();
+}
+
+void FilterRules::on_buttonBox_clicked(QAbstractButton *button)
+{
+ if(ui->buttonBox->buttonRole(button)==QDialogButtonBox::RejectRole)
+ reject();
+ else
+ {
+ haveBeenValided=true;
+ accept();
+ }
+}
diff --git a/plugins-alternative/CopyEngine/Rsync/FilterRules.h b/plugins-alternative/CopyEngine/Rsync/FilterRules.h
new file mode 100644
index 0000000..f06f0cb
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/FilterRules.h
@@ -0,0 +1,46 @@
+#ifndef FILTERRULES_H
+#define FILTERRULES_H
+
+#include <QDialog>
+#include <QAbstractButton>
+#include <QPushButton>
+
+#include "StructEnumDefinition_CopyEngine.h"
+
+namespace Ui {
+class FilterRules;
+}
+
+/** All the filter rules to include/exclude some file during the listing */
+class FilterRules : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit FilterRules(QWidget *parent = 0);
+ ~FilterRules();
+ bool getIsValid();
+ QString get_search_text();
+ SearchType get_search_type();
+ ApplyOn get_apply_on();
+ bool get_need_match_all();
+ void set_search_text(QString search_text);
+ void set_search_type(SearchType search_type);
+ void set_apply_on(ApplyOn apply_on);
+ void set_need_match_all(bool need_match_all);
+private slots:
+ void on_search_textChanged(const QString &arg1);
+ void on_isValid_clicked();
+ void on_testString_textChanged(const QString &arg1);
+ void on_matched_clicked();
+ void on_search_type_currentIndexChanged(int index);
+ void on_need_match_all_clicked();
+ void on_buttonBox_clicked(QAbstractButton *button);
+private:
+ Ui::FilterRules *ui;
+ void updateChecking();
+ bool isValid;
+ bool haveBeenValided;
+};
+
+#endif // FILTERRULES_H
diff --git a/plugins-alternative/CopyEngine/Rsync/FilterRules.ui b/plugins-alternative/CopyEngine/Rsync/FilterRules.ui
new file mode 100644
index 0000000..fad35cd
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/FilterRules.ui
@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>FilterRules</class>
+ <widget class="QDialog" name="FilterRules">
+ <property name="windowModality">
+ <enum>Qt::WindowModal</enum>
+ </property>
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>289</width>
+ <height>231</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Filters dialog</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/resources/filter.png</normaloff>:/resources/filter.png</iconset>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <property name="margin">
+ <number>1</number>
+ </property>
+ <property name="spacing">
+ <number>1</number>
+ </property>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Search:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QLineEdit" name="search"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>Search type:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QComboBox" name="search_type">
+ <item>
+ <property name="text">
+ <string>Raw text</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Simplified regex</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Perl's regex</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Apply on:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="1">
+ <widget class="QComboBox" name="apply_on">
+ <item>
+ <property name="text">
+ <string>File</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Folder</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>File and folder</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2">
+ <widget class="QCheckBox" name="need_match_all">
+ <property name="text">
+ <string>All string need match</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="2">
+ <widget class="QGroupBox" name="groupBoxChecking">
+ <property name="title">
+ <string>Checking</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0" colspan="2">
+ <widget class="QCheckBox" name="isValid">
+ <property name="text">
+ <string>The regex is valid</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_test_string">
+ <property name="text">
+ <string>Test string:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLineEdit" name="testString"/>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QCheckBox" name="matched">
+ <property name="text">
+ <string>The test string match with the regex</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="5" column="0" colspan="2">
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>68</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/plugins-alternative/CopyEngine/Rsync/Filters.cpp b/plugins-alternative/CopyEngine/Rsync/Filters.cpp
new file mode 100644
index 0000000..ce87b52
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Filters.cpp
@@ -0,0 +1,456 @@
+#include "Filters.h"
+#include "ui_Filters.h"
+
+#include <QMessageBox>
+
+Filters::Filters(QWidget *parent) :
+ QDialog(parent),
+ ui(new Ui::Filters)
+{
+ ui->setupUi(this);
+}
+
+Filters::~Filters()
+{
+ delete ui;
+}
+
+void Filters::setFilters(QStringList includeStrings,QStringList includeOptions,QStringList excludeStrings,QStringList excludeOptions)
+{
+ if(includeStrings.size()!=includeOptions.size() || excludeStrings.size()!=excludeOptions.size())
+ return;
+ Filters_rules new_item;
+
+ include.clear();
+ int index=0;
+ while(index<includeStrings.size())
+ {
+ new_item.search_text=includeStrings.at(index);
+ QStringList options=includeOptions.at(index).split(";");
+ new_item.need_match_all=false;
+ new_item.search_type=SearchType_rawText;
+ new_item.apply_on=ApplyOn_fileAndFolder;
+
+ if(options.contains("SearchType_simpleRegex"))
+ new_item.search_type=SearchType_simpleRegex;
+ if(options.contains("SearchType_perlRegex"))
+ new_item.search_type=SearchType_perlRegex;
+ if(options.contains("ApplyOn_file"))
+ new_item.apply_on=ApplyOn_file;
+ if(options.contains("ApplyOn_folder"))
+ new_item.apply_on=ApplyOn_folder;
+ if(options.contains("need_match_all"))
+ new_item.need_match_all=true;
+
+ if(convertToRegex(new_item))
+ include << new_item;
+
+ index++;
+ }
+
+ exclude.clear();
+ index=0;
+ while(index<excludeStrings.size())
+ {
+ new_item.search_text=excludeStrings.at(index);
+ QStringList options=excludeOptions.at(index).split(";");
+ new_item.need_match_all=false;
+ new_item.search_type=SearchType_rawText;
+ new_item.apply_on=ApplyOn_fileAndFolder;
+
+ if(options.contains("SearchType_simpleRegex"))
+ new_item.search_type=SearchType_simpleRegex;
+ if(options.contains("SearchType_perlRegex"))
+ new_item.search_type=SearchType_perlRegex;
+ if(options.contains("ApplyOn_file"))
+ new_item.apply_on=ApplyOn_file;
+ if(options.contains("ApplyOn_folder"))
+ new_item.apply_on=ApplyOn_folder;
+ if(options.contains("need_match_all"))
+ new_item.need_match_all=true;
+
+ if(convertToRegex(new_item))
+ exclude << new_item;
+
+ index++;
+ }
+
+ reShowAll();
+}
+
+void Filters::reShowAll()
+{
+ ui->inclusion->clear();
+ int index=0;
+ while(index<include.size())
+ {
+ QString entryShow=include.at(index).search_text+" (";
+ QStringList optionsToShow;
+ switch(include.at(index).search_type)
+ {
+ case SearchType_rawText:
+ optionsToShow << tr("Raw text");
+ break;
+ case SearchType_simpleRegex:
+ optionsToShow << tr("Simplified regex");
+ break;
+ case SearchType_perlRegex:
+ optionsToShow << tr("Perl's regex");
+ break;
+ default:
+ break;
+ }
+ switch(include.at(index).apply_on)
+ {
+ case ApplyOn_file:
+ optionsToShow << tr("Only on file");
+ break;
+ case ApplyOn_folder:
+ optionsToShow << tr("Only on folder");
+ break;
+ default:
+ break;
+ }
+ if(include.at(index).need_match_all)
+ optionsToShow << tr("Full match");
+ entryShow+=optionsToShow.join(",");
+ entryShow+=")";
+ ui->inclusion->addItem(new QListWidgetItem(entryShow));
+ index++;
+ }
+ ui->exclusion->clear();
+ index=0;
+ while(index<exclude.size())
+ {
+ QString entryShow=exclude.at(index).search_text+" (";
+ QStringList optionsToShow;
+ switch(exclude.at(index).search_type)
+ {
+ case SearchType_rawText:
+ optionsToShow << tr("Raw text");
+ break;
+ case SearchType_simpleRegex:
+ optionsToShow << tr("Simplified regex");
+ break;
+ case SearchType_perlRegex:
+ optionsToShow << tr("Perl's regex");
+ break;
+ default:
+ break;
+ }
+ switch(exclude.at(index).apply_on)
+ {
+ case ApplyOn_file:
+ optionsToShow << tr("Only on file");
+ break;
+ case ApplyOn_folder:
+ optionsToShow << tr("Only on folder");
+ break;
+ default:
+ break;
+ }
+ if(exclude.at(index).need_match_all)
+ optionsToShow << tr("Full match");
+ entryShow+=optionsToShow.join(",");
+ entryShow+=")";
+ ui->exclusion->addItem(new QListWidgetItem(entryShow));
+ index++;
+ }
+}
+
+QList<Filters_rules> Filters::getInclude()
+{
+ return include;
+}
+
+QList<Filters_rules> Filters::getExclude()
+{
+ return exclude;
+}
+
+void Filters::newLanguageLoaded()
+{
+ ui->retranslateUi(this);
+ reShowAll();
+}
+
+void Filters::haveNewFilters()
+{
+ QStringList includeStrings,includeOptions,excludeStrings,excludeOptions;
+ int index=0;
+ while(index<include.size())
+ {
+ includeStrings<<include.at(index).search_text;
+ QStringList optionsToShow;
+
+ switch(include.at(index).search_type)
+ {
+ case SearchType_rawText:
+ optionsToShow << "SearchType_rawText";
+ break;
+ case SearchType_simpleRegex:
+ optionsToShow << "SearchType_simpleRegex";
+ break;
+ case SearchType_perlRegex:
+ optionsToShow << "SearchType_perlRegex";
+ break;
+ default:
+ break;
+ }
+ switch(include.at(index).apply_on)
+ {
+ case ApplyOn_file:
+ optionsToShow << "ApplyOn_file";
+ break;
+ case ApplyOn_fileAndFolder:
+ optionsToShow << "ApplyOn_fileAndFolder";
+ break;
+ case ApplyOn_folder:
+ optionsToShow << "ApplyOn_folder";
+ break;
+ default:
+ break;
+ }
+ if(include.at(index).need_match_all)
+ optionsToShow << tr("Full match");
+ includeOptions<<optionsToShow.join(";");
+ index++;
+ }
+ index=0;
+ while(index<exclude.size())
+ {
+ excludeStrings<<exclude.at(index).search_text;
+ QStringList optionsToShow;
+
+ switch(exclude.at(index).search_type)
+ {
+ case SearchType_rawText:
+ optionsToShow << "SearchType_rawText";
+ break;
+ case SearchType_simpleRegex:
+ optionsToShow << "SearchType_simpleRegex";
+ break;
+ case SearchType_perlRegex:
+ optionsToShow << "SearchType_perlRegex";
+ break;
+ default:
+ break;
+ }
+ switch(exclude.at(index).apply_on)
+ {
+ case ApplyOn_file:
+ optionsToShow << "ApplyOn_file";
+ break;
+ case ApplyOn_fileAndFolder:
+ optionsToShow << "ApplyOn_fileAndFolder";
+ break;
+ case ApplyOn_folder:
+ optionsToShow << "ApplyOn_folder";
+ break;
+ default:
+ break;
+ }
+ if(exclude.at(index).need_match_all)
+ optionsToShow << tr("Full match");
+ excludeOptions<<optionsToShow.join(";");
+ index++;
+ }
+ emit sendNewFilters(includeStrings,includeOptions,excludeStrings,excludeOptions);
+}
+
+bool Filters::convertToRegex(Filters_rules &item)
+{
+ bool isValid=!item.search_text.isEmpty();
+ if(isValid)
+ {
+ QRegExp regex;
+ QString tempString;
+ if(item.search_type==SearchType_rawText)
+ {
+ tempString=QRegExp::escape(item.search_text);
+ if(tempString.contains('/') || tempString.contains('\\'))
+ isValid=false;
+ }
+ else if(item.search_type==SearchType_simpleRegex)
+ {
+ tempString=QRegExp::escape(item.search_text);
+ tempString.replace("\\*","[^\\\\/]*");
+ }
+ else if(item.search_type==SearchType_perlRegex)
+ {
+ tempString=item.search_text;
+ if(tempString.startsWith('^') && tempString.endsWith('$'))
+ {
+ item.need_match_all=true;
+ tempString.remove(QRegExp("^\\^"));
+ tempString.remove(QRegExp("\\$$"));
+ item.search_text=tempString;
+ }
+ }
+ if(isValid)
+ {
+ if(item.need_match_all==true)
+ tempString="^"+tempString+"$";
+ regex=QRegExp(tempString);
+ isValid=regex.isValid() && !regex.isEmpty();
+ item.regex=regex;
+ return true;
+ }
+ else
+ return false;
+ }
+ return false;
+}
+
+void Filters::on_remove_exclusion_clicked()
+{
+ bool removedEntry=false;
+ int index=0;
+ while(index<ui->exclusion->count())
+ {
+ if(ui->exclusion->item(index)->isSelected())
+ {
+ delete ui->exclusion->item(index);
+ exclude.removeAt(index);
+ removedEntry=true;
+ }
+ else
+ index++;
+ }
+ if(removedEntry)
+ {
+ reShowAll();
+ haveNewFilters();
+ }
+}
+
+void Filters::on_remove_inclusion_clicked()
+{
+ bool removedEntry=false;
+ int index=0;
+ while(index<ui->inclusion->count())
+ {
+ if(ui->inclusion->item(index)->isSelected())
+ {
+ delete ui->inclusion->item(index);
+ include.removeAt(index);
+ removedEntry=true;
+ }
+ else
+ index++;
+ }
+ if(removedEntry)
+ {
+ reShowAll();
+ haveNewFilters();
+ }
+}
+
+void Filters::on_add_exclusion_clicked()
+{
+ FilterRules dialog(this);
+ dialog.exec();
+ if(dialog.getIsValid())
+ {
+ Filters_rules new_item;
+ new_item.apply_on=dialog.get_apply_on();
+ new_item.need_match_all=dialog.get_need_match_all();
+ new_item.search_text=dialog.get_search_text();
+ new_item.search_type=dialog.get_search_type();
+ exclude << new_item;
+ reShowAll();
+ haveNewFilters();
+ }
+}
+
+void Filters::on_buttonBox_clicked(QAbstractButton *button)
+{
+ if(ui->buttonBox->buttonRole(button)==QDialogButtonBox::RejectRole)
+ reject();
+}
+
+void Filters::on_add_inclusion_clicked()
+{
+ FilterRules dialog(this);
+ dialog.exec();
+ if(dialog.getIsValid())
+ {
+ Filters_rules new_item;
+ new_item.apply_on=dialog.get_apply_on();
+ new_item.need_match_all=dialog.get_need_match_all();
+ new_item.search_text=dialog.get_search_text();
+ new_item.search_type=dialog.get_search_type();
+ if(convertToRegex(new_item))
+ include << new_item;
+ reShowAll();
+ haveNewFilters();
+ }
+}
+
+void Filters::on_edit_exclusion_clicked()
+{
+ bool editedEntry=false;
+ int index=0;
+ while(index<ui->exclusion->count())
+ {
+ if(ui->exclusion->item(index)->isSelected())
+ {
+ FilterRules dialog(this);
+ dialog.set_apply_on(exclude[index].apply_on);
+ dialog.set_need_match_all(exclude[index].need_match_all);
+ dialog.set_search_text(exclude[index].search_text);
+ dialog.set_search_type(exclude[index].search_type);
+ dialog.exec();
+ if(dialog.getIsValid())
+ {
+ exclude[index].apply_on=dialog.get_apply_on();
+ exclude[index].need_match_all=dialog.get_need_match_all();
+ exclude[index].search_text=dialog.get_search_text();
+ exclude[index].search_type=dialog.get_search_type();
+ if(!convertToRegex(exclude[index]))
+ exclude.removeAt(index);
+ editedEntry=true;
+ }
+ }
+ index++;
+ }
+ if(editedEntry)
+ {
+ reShowAll();
+ haveNewFilters();
+ }
+}
+
+void Filters::on_edit_inclusion_clicked()
+{
+ bool editedEntry=false;
+ int index=0;
+ while(index<ui->inclusion->count())
+ {
+ if(ui->inclusion->item(index)->isSelected())
+ {
+ FilterRules dialog(this);
+ dialog.set_apply_on(exclude[index].apply_on);
+ dialog.set_need_match_all(exclude[index].need_match_all);
+ dialog.set_search_text(exclude[index].search_text);
+ dialog.set_search_type(exclude[index].search_type);
+ dialog.exec();
+ if(dialog.getIsValid())
+ {
+ exclude[index].apply_on=dialog.get_apply_on();
+ exclude[index].need_match_all=dialog.get_need_match_all();
+ exclude[index].search_text=dialog.get_search_text();
+ exclude[index].search_type=dialog.get_search_type();
+ if(!convertToRegex(exclude[index]))
+ exclude.removeAt(index);
+ editedEntry=true;
+ }
+ }
+ index++;
+ }
+ if(editedEntry)
+ {
+ reShowAll();
+ haveNewFilters();
+ }
+}
diff --git a/plugins-alternative/CopyEngine/Rsync/Filters.h b/plugins-alternative/CopyEngine/Rsync/Filters.h
new file mode 100644
index 0000000..dcdcb36
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Filters.h
@@ -0,0 +1,44 @@
+#ifndef FILTERS_H
+#define FILTERS_H
+
+#include <QDialog>
+#include <QStringList>
+
+#include "FilterRules.h"
+#include "StructEnumDefinition_CopyEngine.h"
+
+namespace Ui {
+class Filters;
+}
+
+/** To add/edit one filter rules */
+class Filters : public QDialog
+{
+ Q_OBJECT
+public:
+ explicit Filters(QWidget *parent = 0);
+ ~Filters();
+ void setFilters(QStringList includeStrings,QStringList includeOptions,QStringList excludeStrings,QStringList excludeOptions);
+ void reShowAll();
+ QList<Filters_rules> getInclude();
+ QList<Filters_rules> getExclude();
+ void newLanguageLoaded();
+private:
+ Ui::Filters *ui;
+ QList<Filters_rules> include;
+ QList<Filters_rules> exclude;
+ void haveNewFilters();
+ bool convertToRegex(Filters_rules &item);
+signals:
+ void sendNewFilters(QStringList includeStrings,QStringList includeOptions,QStringList excludeStrings,QStringList excludeOptions);
+private slots:
+ void on_remove_exclusion_clicked();
+ void on_remove_inclusion_clicked();
+ void on_add_exclusion_clicked();
+ void on_buttonBox_clicked(QAbstractButton *button);
+ void on_add_inclusion_clicked();
+ void on_edit_exclusion_clicked();
+ void on_edit_inclusion_clicked();
+};
+
+#endif // FILTERS_H
diff --git a/plugins-alternative/CopyEngine/Rsync/Filters.ui b/plugins-alternative/CopyEngine/Rsync/Filters.ui
new file mode 100644
index 0000000..db8577c
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Filters.ui
@@ -0,0 +1,194 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>Filters</class>
+ <widget class="QDialog" name="Filters">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>507</width>
+ <height>502</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Filters</string>
+ </property>
+ <property name="windowIcon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/resources/filter.png</normaloff>:/resources/filter.png</iconset>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="spacing">
+ <number>1</number>
+ </property>
+ <property name="margin">
+ <number>1</number>
+ </property>
+ <item>
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Exclusion filter</string>
+ </property>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <property name="spacing">
+ <number>1</number>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QListWidget" name="exclusion">
+ <property name="selectionMode">
+ <enum>QAbstractItemView::MultiSelection</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_2">
+ <item>
+ <widget class="QToolButton" name="add_exclusion">
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/resources/add.png</normaloff>:/resources/add.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="edit_exclusion">
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/resources/edit.png</normaloff>:/resources/edit.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="remove_exclusion">
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/resources/remove.png</normaloff>:/resources/remove.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <widget class="QGroupBox" name="groupBox_2">
+ <property name="title">
+ <string>Inclusion filter</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout_4">
+ <property name="spacing">
+ <number>1</number>
+ </property>
+ <property name="margin">
+ <number>2</number>
+ </property>
+ <item>
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>None = Include all</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <item>
+ <widget class="QListWidget" name="inclusion">
+ <property name="selectionMode">
+ <enum>QAbstractItemView::MultiSelection</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QToolButton" name="add_inclusion">
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/resources/add.png</normaloff>:/resources/add.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="edit_inclusion">
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/resources/edit.png</normaloff>:/resources/edit.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="remove_inclusion">
+ <property name="icon">
+ <iconset resource="resources.qrc">
+ <normaloff>:/resources/remove.png</normaloff>:/resources/remove.png</iconset>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>40</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_3">
+ <item>
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ <resources>
+ <include location="resources.qrc"/>
+ </resources>
+ <connections/>
+</ui>
diff --git a/plugins-alternative/CopyEngine/Rsync/Languages/ar/translation.ts b/plugins-alternative/CopyEngine/Rsync/Languages/ar/translation.ts
new file mode 100644
index 0000000..338cb72
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Languages/ar/translation.ts
@@ -0,0 +1,806 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="28"/>
+ <location filename="../../AvancedQFile.cpp" line="59"/>
+ <location filename="../../AvancedQFile.cpp" line="90"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="42"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="73"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Factory</name>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</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="95"/>
+ <source>All string need match</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="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string match with the regex</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 filter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filter</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="92"/>
+ <location filename="../../Filters.cpp" line="130"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="95"/>
+ <location filename="../../Filters.cpp" line="133"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="98"/>
+ <location filename="../../Filters.cpp" line="136"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="106"/>
+ <location filename="../../Filters.cpp" line="144"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="109"/>
+ <location filename="../../Filters.cpp" line="147"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="115"/>
+ <location filename="../../Filters.cpp" line="153"/>
+ <location filename="../../Filters.cpp" line="215"/>
+ <location filename="../../Filters.cpp" line="254"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1192"/>
+ <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="1199"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1215"/>
+ <source>Problem at the reading, or file size is null</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1222"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1231"/>
+ <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="1240"/>
+ <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="1246"/>
+ <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="1293"/>
+ <source>Some error have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1299"/>
+ <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="62"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="154"/>
+ <location filename="../../ReadThread.cpp" line="316"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="193"/>
+ <location filename="../../ReadThread.cpp" line="373"/>
+ <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="26"/>
+ <source>First renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="32"/>
+ <source>%name% - copy</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="39"/>
+ <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;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment> should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="49"/>
+ <source>Second renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="55"/>
+ <source>%name% - copy (%number%)</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="62"/>
+ <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;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number&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.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>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="61"/>
+ <location filename="../../RmPath.cpp" line="75"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RmPath.cpp" line="85"/>
+ <source>Unable to remove the file</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="312"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="322"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="627"/>
+ <source>The checksums not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="443"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="481"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="260"/>
+ <location filename="../../copyEngine.cpp" line="278"/>
+ <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="289"/>
+ <location filename="../../copyEngine.cpp" line="307"/>
+ <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="521"/>
+ <source>The mode have been forced previously, it&apos;s internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error on 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="56"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="73"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="90"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="136"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="156"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="163"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="170"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="177"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="29"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="32"/>
+ <source>Folder name</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="153"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="243"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="254"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="274"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="281"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="291"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="298"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="307"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="312"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="102"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="112"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="20"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="47"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="64"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="81"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="137"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="148"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="168"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="175"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="182"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="87"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="97"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <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="62"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="89"/>
+ <location filename="../../folderExistsDialog.ui" line="140"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="106"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="200"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="211"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="218"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="225"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="232"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="239"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="29"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="85"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="95"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui" line="23"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="33"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="214"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="43"/>
+ <location filename="../../options.ui" line="198"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="56"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="66"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="74"/>
+ <location filename="../../options.ui" line="95"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="79"/>
+ <location filename="../../options.ui" line="105"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="100"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="110"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="118"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="255"/>
+ <source>Rsync (only in copy mode)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="87"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="128"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="144"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="154"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="171"/>
+ <source>Do checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="181"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="234"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="241"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="191"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="219"/>
+ <location filename="../../scanFileOrFolder.cpp" line="283"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="229"/>
+ <location filename="../../scanFileOrFolder.cpp" line="293"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="327"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="329"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/CopyEngine/Rsync/Languages/de/translation.ts b/plugins-alternative/CopyEngine/Rsync/Languages/de/translation.ts
new file mode 100644
index 0000000..1370c9a
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Languages/de/translation.ts
@@ -0,0 +1,806 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="de" sourcelanguage="en">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="28"/>
+ <location filename="../../AvancedQFile.cpp" line="59"/>
+ <location filename="../../AvancedQFile.cpp" line="90"/>
+ <source>Not supported on this platform</source>
+ <translation>Auf dieser Plattform nicht unterstützt</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="42"/>
+ <source>Last modified date is wrong</source>
+ <translation>Datum der letzten Änderung ist falsch</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="73"/>
+ <source>Last access date is wrong</source>
+ <translation>Datum des letzten Zugriffs ist falsch</translation>
+ </message>
+</context>
+<context>
+ <name>Factory</name>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options error</source>
+ <translation>Optionen Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation>Optionen Motor nicht geladen wird, kann nicht auf die Filter zu übersetzen</translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation>Suche:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation>Suche Typ:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation>Roh text</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation>Vereinfachte 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>Anwenden auf:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation>Datei</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation>Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation>Datei-und Ordnernamen</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>All string need match</source>
+ <translation>Alle Saite muss passen</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation>Überprüfung</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation>Test-String:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation>Filters dialog</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation>Die Regex ist gültig</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string match with the regex</source>
+ <translation>Der Test-String Match mit dem regex</translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation>Filter</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filter</source>
+ <translation>Ausschluss-Filter</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filter</source>
+ <translation>Einbeziehungsfilter</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation>None = Schließt alle</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="92"/>
+ <location filename="../../Filters.cpp" line="130"/>
+ <source>Raw text</source>
+ <translation>Roh text</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="95"/>
+ <location filename="../../Filters.cpp" line="133"/>
+ <source>Simplified regex</source>
+ <translation>Vereinfachte regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="98"/>
+ <location filename="../../Filters.cpp" line="136"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Perl&apos;s regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="106"/>
+ <location filename="../../Filters.cpp" line="144"/>
+ <source>Only on file</source>
+ <translation>Nur auf Datei</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="109"/>
+ <location filename="../../Filters.cpp" line="147"/>
+ <source>Only on folder</source>
+ <translation>Nur auf Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="115"/>
+ <location filename="../../Filters.cpp" line="153"/>
+ <location filename="../../Filters.cpp" line="215"/>
+ <location filename="../../Filters.cpp" line="254"/>
+ <source>Full match</source>
+ <translation>Spielaufzeichnung</translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1192"/>
+ <source>Unable do to move or copy item into wrong forced mode: %1</source>
+ <translation>Kann nicht tun, verschieben oder kopieren Artikel in den falschen gezwungen Modus: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1199"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation>Unfähig, die Transferliste sparen: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1215"/>
+ <source>Problem at the reading, or file size is null</source>
+ <translation>Problem an der Lektüre, der Oder Dateigröße IST Null</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1222"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation>Falsche Header: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1231"/>
+ <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 in diesem Modus nicht</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1240"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation>Die Transferliste ist im Copy-Mode, aber dieser Fall ist in diesem Modus nicht</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1246"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation>Die Transferliste ist in Verschiebe-Modus, aber diese Instanz ist in diesem Modus nicht</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1293"/>
+ <source>Some error have been found during the line parsing</source>
+ <translation>Einige Fehler wurden während des Parsing gefunden</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1299"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation>Unfähig, die Transferliste geöffnet: %1</translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="62"/>
+ <source>Unable to create the folder</source>
+ <translation>Der Ordner kann nicht erstellt</translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="154"/>
+ <location filename="../../ReadThread.cpp" line="316"/>
+ <source>Unable to read the source file: </source>
+ <translation>Unfähig, die Quelldatei zu lesen: </translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="193"/>
+ <location filename="../../ReadThread.cpp" line="373"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation>Datei während der Lese, möglich Datenänderung abgeschnitten</translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="26"/>
+ <source>First renaming</source>
+ <translation>erste Umbenennung</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="32"/>
+ <source>%name% - copy</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation>%name% - kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="39"/>
+ <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;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment> should not be translated</extracomment>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variablen: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; für den ursprünglichen Dateinamen&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="49"/>
+ <source>Second renaming</source>
+ <translation>zweite Umbenennung</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="55"/>
+ <source>%name% - copy (%number%)</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation>%name% - kopieren (%number%)</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="62"/>
+ <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;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;Variablen: &lt;span style=&quot; font-weight:600;&quot;&gt;%name%&lt;/span&gt; für den ursprünglichen Dateinamen&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; für die zusätzliche Zahl&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="39"/>
+ <location filename="../../RenamingRules.cpp" line="62"/>
+ <source>%1 - copy</source>
+ <translation>%1 - kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="43"/>
+ <location filename="../../RenamingRules.cpp" line="73"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - kopieren (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>Umbenennen von Regeln</translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="61"/>
+ <location filename="../../RmPath.cpp" line="75"/>
+ <source>Unable to remove the folder</source>
+ <translation>Der Ordner kann nicht entfernen</translation>
+ </message>
+ <message>
+ <location filename="../../RmPath.cpp" line="85"/>
+ <source>Unable to remove the file</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="312"/>
+ <source>%1 - copy</source>
+ <translation>%1 - kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="322"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - kopieren (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="627"/>
+ <source>The checksums not match</source>
+ <translation>Die Prüfsummen nicht überein</translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="443"/>
+ <source>Unable to read the source file: </source>
+ <translation>Unfähig, die Quelldatei zu lesen: </translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="481"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation>Datei während der Lese, möglich Datenänderung abgeschnitten</translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="260"/>
+ <location filename="../../copyEngine.cpp" line="278"/>
+ <source>The engine is forced to move, you can&apos;t copy with it</source>
+ <translation>Der Motor wird gezwungen sich zu bewegen, können Sie mit ihr nicht zu kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="289"/>
+ <location filename="../../copyEngine.cpp" line="307"/>
+ <source>The engine is forced to copy, you can&apos;t move with it</source>
+ <translation>Der Motor ist gezwungen, zu kopieren, können Sie nicht mit ihm bewegen</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="521"/>
+ <source>The mode have been forced previously, it&apos;s internal error, please report it</source>
+ <translation>Der Modus wurden vorher gezwungen, es interner Fehler ist, melden Sie dies bitte</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options error</source>
+ <translation>Optionen Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation>Optionen Motor nicht geladen wird, kann nicht auf die Filter zu übersetzen</translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error on file</source>
+ <translation>Fehler bei der Datei</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation>Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="56"/>
+ <source>Size</source>
+ <translation>Größe</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="73"/>
+ <source>Modified</source>
+ <translation>Geändert</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="90"/>
+ <source>File name</source>
+ <translation>Dateiname</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="136"/>
+ <source>&amp;Always do this action</source>
+ <translation>Immer diese Aktion</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="156"/>
+ <source>Put to bottom</source>
+ <translation>Legen Sie nach unten</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="163"/>
+ <source>Retry</source>
+ <translation>Wiederholen</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="170"/>
+ <source>&amp;Skip</source>
+ <translation>überspringen</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="177"/>
+ <source>&amp;Cancel</source>
+ <translation>Stornieren</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="29"/>
+ <source>Error on folder</source>
+ <translation>Fehler auf Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="32"/>
+ <source>Folder name</source>
+ <translation>Ordnername</translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation>Die Datei existiert</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>Quelle</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>Ziel</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="153"/>
+ <source>Size</source>
+ <translation>Größe</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Modified</source>
+ <translation>Geändert</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>File name</source>
+ <translation>Dateiname</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="243"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Schlagen neuen Namen</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="254"/>
+ <source>&amp;Always do this action</source>
+ <translation>Immer diese Aktion</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="274"/>
+ <source>&amp;Rename</source>
+ <translation>Umbenennen</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="281"/>
+ <source>&amp;Overwrite</source>
+ <translation>überschreiben</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="291"/>
+ <source>&amp;Skip</source>
+ <translation>überspringen</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="298"/>
+ <source>&amp;Cancel</source>
+ <translation>Stornieren</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="307"/>
+ <source>Overwrite if newer</source>
+ <translation>Überschreiben, wenn neuere</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="312"/>
+ <source>Overwrite if not same modification date</source>
+ <translation>Überschreiben, wenn nicht gleiche Änderungsdatum</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="102"/>
+ <source>%1 - copy</source>
+ <translation>%1 - kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="112"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - kopieren (%2)</translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>This files are the same file</source>
+ <translation>Diese Dateien sind die gleiche Datei</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="20"/>
+ <source>The source and destination is same</source>
+ <translation>Die Quelle und das Ziel ist dasselbe</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="47"/>
+ <source>Size</source>
+ <translation>Größe</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="64"/>
+ <source>Modified</source>
+ <translation>Geändert</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="81"/>
+ <source>File name</source>
+ <translation>Dateiname</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="137"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Schlagen neuen Namen</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="148"/>
+ <source>&amp;Always do this action</source>
+ <translation>Immer diese Aktion</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="168"/>
+ <source>&amp;Rename</source>
+ <translation>Umbenennen</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="175"/>
+ <source>&amp;Skip</source>
+ <translation>überspringen</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="182"/>
+ <source>&amp;Cancel</source>
+ <translation>Stornieren</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="87"/>
+ <source>%1 - copy</source>
+ <translation>%1 - kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="97"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - kopieren (%2)</translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>This folders are the same folder</source>
+ <translation>Diese Ordner sind die gleichen Ordner</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>Quelle</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>Ziel</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="62"/>
+ <source>The source and destination is same</source>
+ <translation>Die Quelle und das Ziel ist dasselbe</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="89"/>
+ <location filename="../../folderExistsDialog.ui" line="140"/>
+ <source>Modified</source>
+ <translation>Geändert</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="106"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Folder name</source>
+ <translation>Ordnername</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="200"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Schlagen neuen Namen</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="211"/>
+ <source>&amp;Always do this action</source>
+ <translation>Immer diese Aktion</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="218"/>
+ <source>&amp;Rename</source>
+ <translation>Umbenennen</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="225"/>
+ <source>Merge</source>
+ <translation>Fusionieren</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="232"/>
+ <source>Skip</source>
+ <translation>überspringen</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="239"/>
+ <source>&amp;Cancel</source>
+ <translation>Stornieren</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="29"/>
+ <source>Folder already exists</source>
+ <translation>Ordner bereits vorhanden ist</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="85"/>
+ <source>%1 - copy</source>
+ <translation>%1 - kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="95"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - kopieren (%2)</translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui" line="23"/>
+ <source>Transfer the file rights</source>
+ <translation>Übertragen Sie die Datei Rechte</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="33"/>
+ <source>Keep the file date</source>
+ <translation>Halten Sie das Datei-Datum</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="214"/>
+ <source>Block size</source>
+ <translation>Blockgröße</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="43"/>
+ <location filename="../../options.ui" line="198"/>
+ <source>KB</source>
+ <translation>KB</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="56"/>
+ <source>Auto start the transfer</source>
+ <translation>Auto starten Sie die Übertragung</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="66"/>
+ <source>When folder error</source>
+ <translation>Wenn Ordner Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="74"/>
+ <location filename="../../options.ui" line="95"/>
+ <source>Ask</source>
+ <translation>Fragen</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="79"/>
+ <location filename="../../options.ui" line="105"/>
+ <source>Skip</source>
+ <translation>überspringen</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="100"/>
+ <source>Merge</source>
+ <translation>Fusionieren</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="110"/>
+ <source>Rename</source>
+ <translation>Umbenennen</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="118"/>
+ <source>Check if destination folder exists</source>
+ <translation>Prüfen Sie, ob Zielordner vorhanden ist</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="255"/>
+ <source>Rsync (only in copy mode)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="87"/>
+ <source>When folder collision</source>
+ <translation>Wenn Ordner Kollision</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="128"/>
+ <source>Checksum</source>
+ <translation>Checksum</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="144"/>
+ <source>Only after error</source>
+ <translation>Erst nach dem Fehler</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="154"/>
+ <source>Ignore if impossible</source>
+ <translation>Ignorieren, wenn nicht</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="171"/>
+ <source>Do checksum</source>
+ <translation>Haben checksum</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="181"/>
+ <source>Enable OS buffer</source>
+ <translation>Aktivieren Sie OS-Puffer</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="234"/>
+ <source>Filters</source>
+ <translation>Filter</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="241"/>
+ <source>Renaming rules</source>
+ <translation>Umbenennen von Regeln</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="191"/>
+ <source>OS buffer only if smaller than</source>
+ <translation>OS-Puffer, wenn kleiner als</translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="219"/>
+ <location filename="../../scanFileOrFolder.cpp" line="283"/>
+ <source>%1 - copy</source>
+ <translation>%1 - kopieren</translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="229"/>
+ <location filename="../../scanFileOrFolder.cpp" line="293"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - kopieren (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="327"/>
+ <source>The folder not exists</source>
+ <translation>Der Ordner existiert nicht</translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="329"/>
+ <source>The folder is not readable</source>
+ <translation>Der Ordner ist nicht lesbar</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/CopyEngine/Rsync/Languages/el/translation.ts b/plugins-alternative/CopyEngine/Rsync/Languages/el/translation.ts
new file mode 100644
index 0000000..338cb72
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Languages/el/translation.ts
@@ -0,0 +1,806 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="28"/>
+ <location filename="../../AvancedQFile.cpp" line="59"/>
+ <location filename="../../AvancedQFile.cpp" line="90"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="42"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="73"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Factory</name>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</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="95"/>
+ <source>All string need match</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="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string match with the regex</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 filter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filter</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="92"/>
+ <location filename="../../Filters.cpp" line="130"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="95"/>
+ <location filename="../../Filters.cpp" line="133"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="98"/>
+ <location filename="../../Filters.cpp" line="136"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="106"/>
+ <location filename="../../Filters.cpp" line="144"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="109"/>
+ <location filename="../../Filters.cpp" line="147"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="115"/>
+ <location filename="../../Filters.cpp" line="153"/>
+ <location filename="../../Filters.cpp" line="215"/>
+ <location filename="../../Filters.cpp" line="254"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1192"/>
+ <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="1199"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1215"/>
+ <source>Problem at the reading, or file size is null</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1222"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1231"/>
+ <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="1240"/>
+ <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="1246"/>
+ <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="1293"/>
+ <source>Some error have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1299"/>
+ <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="62"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="154"/>
+ <location filename="../../ReadThread.cpp" line="316"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="193"/>
+ <location filename="../../ReadThread.cpp" line="373"/>
+ <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="26"/>
+ <source>First renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="32"/>
+ <source>%name% - copy</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="39"/>
+ <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;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment> should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="49"/>
+ <source>Second renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="55"/>
+ <source>%name% - copy (%number%)</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="62"/>
+ <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;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number&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.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>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="61"/>
+ <location filename="../../RmPath.cpp" line="75"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RmPath.cpp" line="85"/>
+ <source>Unable to remove the file</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="312"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="322"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="627"/>
+ <source>The checksums not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="443"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="481"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="260"/>
+ <location filename="../../copyEngine.cpp" line="278"/>
+ <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="289"/>
+ <location filename="../../copyEngine.cpp" line="307"/>
+ <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="521"/>
+ <source>The mode have been forced previously, it&apos;s internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error on 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="56"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="73"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="90"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="136"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="156"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="163"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="170"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="177"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="29"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="32"/>
+ <source>Folder name</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="153"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="243"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="254"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="274"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="281"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="291"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="298"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="307"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="312"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="102"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="112"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="20"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="47"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="64"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="81"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="137"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="148"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="168"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="175"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="182"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="87"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="97"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <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="62"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="89"/>
+ <location filename="../../folderExistsDialog.ui" line="140"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="106"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="200"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="211"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="218"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="225"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="232"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="239"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="29"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="85"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="95"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui" line="23"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="33"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="214"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="43"/>
+ <location filename="../../options.ui" line="198"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="56"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="66"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="74"/>
+ <location filename="../../options.ui" line="95"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="79"/>
+ <location filename="../../options.ui" line="105"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="100"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="110"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="118"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="255"/>
+ <source>Rsync (only in copy mode)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="87"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="128"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="144"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="154"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="171"/>
+ <source>Do checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="181"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="234"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="241"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="191"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="219"/>
+ <location filename="../../scanFileOrFolder.cpp" line="283"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="229"/>
+ <location filename="../../scanFileOrFolder.cpp" line="293"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="327"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="329"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/CopyEngine/Rsync/Languages/es/translation.ts b/plugins-alternative/CopyEngine/Rsync/Languages/es/translation.ts
new file mode 100644
index 0000000..8e00156
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Languages/es/translation.ts
@@ -0,0 +1,806 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="es" sourcelanguage="en">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="28"/>
+ <location filename="../../AvancedQFile.cpp" line="59"/>
+ <location filename="../../AvancedQFile.cpp" line="90"/>
+ <source>Not supported on this platform</source>
+ <translation>No es compatible con esta plataforma</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="42"/>
+ <source>Last modified date is wrong</source>
+ <translation>Fecha de última modificación es incorrecto</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="73"/>
+ <source>Last access date is wrong</source>
+ <translation>Fecha de último acceso es incorrecto</translation>
+ </message>
+</context>
+<context>
+ <name>Factory</name>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options error</source>
+ <translation>Error de opciones</translation>
+ </message>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <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>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation>Buscar:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation>Tipo de búsqueda:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation>texto Fuente</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation>Regex simplificado</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>Aplicar sobre:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation>Archivos</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation>Carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation>Archivos y carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>All string need match</source>
+ <translation>Todas las líneas tiene por qué coincidir</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation>Verification</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation>Prueba de la cuerda:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation>Filtros de diálogo</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation>La expresión regular es válido</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string match with the regex</source>
+ <translation>La coincidencia con la cadena de prueba con la expresión regular</translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation>Filtros</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filter</source>
+ <translation>Exclusión filtro</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filter</source>
+ <translation>La inclusión del filtro</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation>Ninguno = Incluya todos los</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="92"/>
+ <location filename="../../Filters.cpp" line="130"/>
+ <source>Raw text</source>
+ <translation>texto Fuente</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="95"/>
+ <location filename="../../Filters.cpp" line="133"/>
+ <source>Simplified regex</source>
+ <translation>Simplificado regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="98"/>
+ <location filename="../../Filters.cpp" line="136"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Perl&apos;s regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="106"/>
+ <location filename="../../Filters.cpp" line="144"/>
+ <source>Only on file</source>
+ <translation>Sólo en el archivo</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="109"/>
+ <location filename="../../Filters.cpp" line="147"/>
+ <source>Only on folder</source>
+ <translation>Sólo en la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="115"/>
+ <location filename="../../Filters.cpp" line="153"/>
+ <location filename="../../Filters.cpp" line="215"/>
+ <location filename="../../Filters.cpp" line="254"/>
+ <source>Full match</source>
+ <translation>Partido completo</translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1192"/>
+ <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="1199"/>
+ <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="1215"/>
+ <source>Problem at the reading, or file size is null</source>
+ <translation>Problema en la lectura, o el tamaño del archivo es nulo</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1222"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation>Encabezado incorrecto: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1231"/>
+ <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="1240"/>
+ <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="1246"/>
+ <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="1293"/>
+ <source>Some error 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="1299"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation>No se puede abrir la lista de transferencias: %1</translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="62"/>
+ <source>Unable to create the folder</source>
+ <translation>No se puede crear la carpeta</translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="154"/>
+ <location filename="../../ReadThread.cpp" line="316"/>
+ <source>Unable to read the source file: </source>
+ <translation>No se puede leer el archivo de origen: </translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="193"/>
+ <location filename="../../ReadThread.cpp" line="373"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation>Archivo truncada durante el cambio de lectura, los datos posibles</translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="26"/>
+ <source>First renaming</source>
+ <translation>En primer lugar el cambio de nombre</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="32"/>
+ <source>%name% - copy</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation>%name% - copia</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="39"/>
+ <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;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment> should not be translated</extracomment>
+ <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;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="49"/>
+ <source>Second renaming</source>
+ <translation>En segundo lugar el cambio de nombre</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="55"/>
+ <source>%name% - copy (%number%)</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation>%name% - copia (%number%)</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="62"/>
+ <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;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <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;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; para el número adicional&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="39"/>
+ <location filename="../../RenamingRules.cpp" line="62"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</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>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>Reglas de Cambio de nombre</translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="61"/>
+ <location filename="../../RmPath.cpp" line="75"/>
+ <source>Unable to remove the folder</source>
+ <translation>No se puede eliminar la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../RmPath.cpp" line="85"/>
+ <source>Unable to remove the file</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="312"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="322"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="627"/>
+ <source>The checksums not match</source>
+ <translation>Las sumas de comprobación no coincide</translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="443"/>
+ <source>Unable to read the source file: </source>
+ <translation>No se puede leer el archivo de origen: </translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="481"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation>Archivo truncada durante el cambio de lectura, los datos posibles</translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="260"/>
+ <location filename="../../copyEngine.cpp" line="278"/>
+ <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="289"/>
+ <location filename="../../copyEngine.cpp" line="307"/>
+ <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="521"/>
+ <source>The mode have been forced previously, it&apos;s internal error, please report it</source>
+ <translation>El modo se han visto obligados con anterioridad, es un error interno, por favor repórtelo</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options error</source>
+ <translation>Opciones de error</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <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>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error on file</source>
+ <translation>Error en el archivo</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation>Error</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="56"/>
+ <source>Size</source>
+ <translation>Tamaño</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="73"/>
+ <source>Modified</source>
+ <translation>Modificado</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="90"/>
+ <source>File name</source>
+ <translation>Nombre de archivo</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="136"/>
+ <source>&amp;Always do this action</source>
+ <translation>Siempre hacer esta acción</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="156"/>
+ <source>Put to bottom</source>
+ <translation>Ponga a abajo</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="163"/>
+ <source>Retry</source>
+ <translation>Reintentar</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="170"/>
+ <source>&amp;Skip</source>
+ <translation>Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="177"/>
+ <source>&amp;Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="29"/>
+ <source>Error on folder</source>
+ <translation>Error en la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="32"/>
+ <source>Folder name</source>
+ <translation>Nombre de la carpeta</translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation>El archivo ya existe</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>Fuente</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>Destino</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="153"/>
+ <source>Size</source>
+ <translation>Tamaño</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Modified</source>
+ <translation>Modificado</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>File name</source>
+ <translation>Nombre de archivo</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="243"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Sugerir nuevo nombre</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="254"/>
+ <source>&amp;Always do this action</source>
+ <translation>Siempre hacer esta acción</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="274"/>
+ <source>&amp;Rename</source>
+ <translation>Cambiar el nombre</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="281"/>
+ <source>&amp;Overwrite</source>
+ <translation>Sobrescribir</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="291"/>
+ <source>&amp;Skip</source>
+ <translation>Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="298"/>
+ <source>&amp;Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="307"/>
+ <source>Overwrite if newer</source>
+ <translation>Sobrescribir si nuevo</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="312"/>
+ <source>Overwrite if not same modification date</source>
+ <translation>Sobrescribir si no es misma fecha de modificación</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="102"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="112"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>This files are the same file</source>
+ <translation>Estos archivos son el mismo archivo</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="20"/>
+ <source>The source and destination is same</source>
+ <translation>La fuente y el destino es el mismo</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="47"/>
+ <source>Size</source>
+ <translation>Tamaño</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="64"/>
+ <source>Modified</source>
+ <translation>Modificado</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="81"/>
+ <source>File name</source>
+ <translation>Nombre de archivo</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="137"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Sugerir nuevo nombre</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="148"/>
+ <source>&amp;Always do this action</source>
+ <translation>Siempre hacer esta acción</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="168"/>
+ <source>&amp;Rename</source>
+ <translation>Cambiar el nombre</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="175"/>
+ <source>&amp;Skip</source>
+ <translation>Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="182"/>
+ <source>&amp;Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="87"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="97"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>This folders are the same folder</source>
+ <translation>Esta carpeta es la misma carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>Fuente</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>Destino</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="62"/>
+ <source>The source and destination is same</source>
+ <translation>La fuente y el destino es el mismo</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="89"/>
+ <location filename="../../folderExistsDialog.ui" line="140"/>
+ <source>Modified</source>
+ <translation>Modificado</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="106"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Folder name</source>
+ <translation>Nombre de la carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="200"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Sugerir nuevo nombre</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="211"/>
+ <source>&amp;Always do this action</source>
+ <translation>Siempre hacer esta acción</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="218"/>
+ <source>&amp;Rename</source>
+ <translation>Cambiar el nombre</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="225"/>
+ <source>Merge</source>
+ <translation>Unir</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="232"/>
+ <source>Skip</source>
+ <translation>Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="239"/>
+ <source>&amp;Cancel</source>
+ <translation>Cancelar</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="29"/>
+ <source>Folder already exists</source>
+ <translation>Carpeta ya existe</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="85"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="95"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui" line="23"/>
+ <source>Transfer the file rights</source>
+ <translation>Transferencia de los derechos de archivo</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="33"/>
+ <source>Keep the file date</source>
+ <translation>Mantener la fecha de archivo</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="214"/>
+ <source>Block size</source>
+ <translation>Tamaño del bloque</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="43"/>
+ <location filename="../../options.ui" line="198"/>
+ <source>KB</source>
+ <translation>KB</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="56"/>
+ <source>Auto start the transfer</source>
+ <translation>Auto iniciar la transferencia</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="66"/>
+ <source>When folder error</source>
+ <translation>Cuando el error carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="74"/>
+ <location filename="../../options.ui" line="95"/>
+ <source>Ask</source>
+ <translation>Pedir</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="79"/>
+ <location filename="../../options.ui" line="105"/>
+ <source>Skip</source>
+ <translation>Omitir</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="100"/>
+ <source>Merge</source>
+ <translation>Unir</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="110"/>
+ <source>Rename</source>
+ <translation>Cambiar el nombre</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="118"/>
+ <source>Check if destination folder exists</source>
+ <translation>Compruebe si existe la carpeta de destino</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="255"/>
+ <source>Rsync (only in copy mode)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="87"/>
+ <source>When folder collision</source>
+ <translation>Cuando la colisión carpeta</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="128"/>
+ <source>Checksum</source>
+ <translation>Suma de comprobación</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="144"/>
+ <source>Only after error</source>
+ <translation>Sólo después de un error</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="154"/>
+ <source>Ignore if impossible</source>
+ <translation>No haga caso si no es posible</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="171"/>
+ <source>Do checksum</source>
+ <translation>Hacer suma de comprobación</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="181"/>
+ <source>Enable OS buffer</source>
+ <translation>Habilitar el OS de amortiguación</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="234"/>
+ <source>Filters</source>
+ <translation>Filtros</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="241"/>
+ <source>Renaming rules</source>
+ <translation>Reglas de Cambio de nombre</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="191"/>
+ <source>OS buffer only if smaller than</source>
+ <translation>OS de amortiguación sólo si menor que</translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="219"/>
+ <location filename="../../scanFileOrFolder.cpp" line="283"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copia</translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="229"/>
+ <location filename="../../scanFileOrFolder.cpp" line="293"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copia (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="327"/>
+ <source>The folder not exists</source>
+ <translation>La carpeta no existe</translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="329"/>
+ <source>The folder is not readable</source>
+ <translation>La carpeta no se puede leer</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/CopyEngine/Rsync/Languages/fr/translation.ts b/plugins-alternative/CopyEngine/Rsync/Languages/fr/translation.ts
new file mode 100644
index 0000000..92d565c
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Languages/fr/translation.ts
@@ -0,0 +1,810 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="fr" sourcelanguage="en">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="28"/>
+ <location filename="../../AvancedQFile.cpp" line="59"/>
+ <location filename="../../AvancedQFile.cpp" line="90"/>
+ <source>Not supported on this platform</source>
+ <translation>Non supporté sur cette plateforme</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="42"/>
+ <source>Last modified date is wrong</source>
+ <translation>Date de dernière modification du fichier fausse</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="73"/>
+ <source>Last access date is wrong</source>
+ <translation>Date du dernier accès au fichier fausse</translation>
+ </message>
+</context>
+<context>
+ <name>Factory</name>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options error</source>
+ <translation>Erreur d&apos;options</translation>
+ </message>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <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édrer aux filtres</translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation>Recherche:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation>Type de recherche:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation>Texte brute</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation>Regex simplifié</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="61"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Regex perl</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="69"/>
+ <source>Apply on:</source>
+ <translation>Appliquer sur:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation>Fichier</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation>Dossier</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation>Fichier et dossier</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>All string need match</source>
+ <translation>Toute la chaine doit correspondre</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation>Vérification</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation>Chaine de teste:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation>Dialogue des filtres</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation>La regex est valid</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string match with the regex</source>
+ <translation>La chaine de teste corresponds avec la regex</translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation>Filtres</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filter</source>
+ <translation>Filtre d&apos;exclusion</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filter</source>
+ <translation>Filtre d&apos;inclusion</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation>Aucun = tout inclure</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="92"/>
+ <location filename="../../Filters.cpp" line="130"/>
+ <source>Raw text</source>
+ <translation>Texte brute</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="95"/>
+ <location filename="../../Filters.cpp" line="133"/>
+ <source>Simplified regex</source>
+ <translation>Regex simplifié</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="98"/>
+ <location filename="../../Filters.cpp" line="136"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Regex perl</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="106"/>
+ <location filename="../../Filters.cpp" line="144"/>
+ <source>Only on file</source>
+ <translation>Appliquer sur fichier</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="109"/>
+ <location filename="../../Filters.cpp" line="147"/>
+ <source>Only on folder</source>
+ <translation>Appliquer sur dossier</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="115"/>
+ <location filename="../../Filters.cpp" line="153"/>
+ <location filename="../../Filters.cpp" line="215"/>
+ <location filename="../../Filters.cpp" line="254"/>
+ <source>Full match</source>
+ <translation>Correspondance totale</translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1192"/>
+ <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="1199"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation>Impossible de sauvegarde la liste de transfer: %1</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1215"/>
+ <source>Problem at the reading, or file size is null</source>
+ <translation>Probléme à la lecture, ou fichier de taille nulle</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1222"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation>Mauvaise en-tête: &quot;%1&quot;</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1231"/>
+ <source>The transfer list is in mixed mode, but this instance is not in this mode</source>
+ <translation>La list de transfer est en mode mixte, mais l&apos;instance n&apos;est pas dans ce mode</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1240"/>
+ <source>The transfer list is in copy mode, but this instance is not in this mode</source>
+ <translation>La list de transfer est en mode copie, mais l&apos;instance n&apos;est pas dans ce mode</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1246"/>
+ <source>The transfer list is in move mode, but this instance is not in this mode</source>
+ <translation>La list de transfer est en mode déplacement, mais l&apos;instance n&apos;est pas dans ce mode</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1293"/>
+ <source>Some error have been found during the line parsing</source>
+ <translation>Quelque erreur ont été trouvé durrant l&apos;analise des lignes</translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1299"/>
+ <source>Unable to open the transfer list: %1</source>
+ <translation>Impossible d&apos;ouvrir la list de transfer: %1</translation>
+ </message>
+</context>
+<context>
+ <name>MkPath</name>
+ <message>
+ <location filename="../../MkPath.cpp" line="62"/>
+ <source>Unable to create the folder</source>
+ <translation>Impossible de créer le répertoire</translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="154"/>
+ <location filename="../../ReadThread.cpp" line="316"/>
+ <source>Unable to read the source file: </source>
+ <translation>Impossible de lire le fichier source: </translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="193"/>
+ <location filename="../../ReadThread.cpp" line="373"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation>Fichier diminué durrant la lecture, possible changement de données</translation>
+ </message>
+</context>
+<context>
+ <name>RenamingRules</name>
+ <message>
+ <location filename="../../RenamingRules.ui" line="26"/>
+ <source>First renaming</source>
+ <translation>Premier renommage</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="32"/>
+ <source>%name% - copy</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translatorcomment>variables need never be translated</translatorcomment>
+ <translation>%name% - copie</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="39"/>
+ <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;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment> should not be translated</extracomment>
+ <translatorcomment>variables need never be translated</translatorcomment>
+ <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 originel&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="49"/>
+ <source>Second renaming</source>
+ <translation>Seconds renommage</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="55"/>
+ <source>%name% - copy (%number%)</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translatorcomment>variables need never be translated</translatorcomment>
+ <translation>%name% - copie (%number%)</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="62"/>
+ <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;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translatorcomment>variables need never be translated</translatorcomment>
+ <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 originel&lt;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; pour le nombre extra&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.cpp" line="39"/>
+ <location filename="../../RenamingRules.cpp" line="62"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copie</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>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="14"/>
+ <source>Renaming rules</source>
+ <translation>Régles de renommage</translation>
+ </message>
+</context>
+<context>
+ <name>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="61"/>
+ <location filename="../../RmPath.cpp" line="75"/>
+ <source>Unable to remove the folder</source>
+ <translation>Impossible de supprimer le répertoire</translation>
+ </message>
+ <message>
+ <location filename="../../RmPath.cpp" line="85"/>
+ <source>Unable to remove the file</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="312"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copie</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="322"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="627"/>
+ <source>The checksums not match</source>
+ <translation>Les checksums ne correspondent pas</translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="443"/>
+ <source>Unable to read the source file: </source>
+ <translation>Impossible de lire le fichier source: </translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="481"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation>Fichier diminué durrant la lecture, possible changement de données</translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="260"/>
+ <location filename="../../copyEngine.cpp" line="278"/>
+ <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="289"/>
+ <location filename="../../copyEngine.cpp" line="307"/>
+ <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="521"/>
+ <source>The mode have been forced previously, it&apos;s internal error, please report it</source>
+ <translation>Le mode as été forcé précédement, c&apos;est une erreur interne, merci de le repporter</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options error</source>
+ <translation>Erreur d&apos;options</translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <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édrer aux filtres</translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error on file</source>
+ <translation>Erreur sur le fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="20"/>
+ <source>Error</source>
+ <translation>Erreur</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="56"/>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="73"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="90"/>
+ <source>File name</source>
+ <translation>Nom de fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="136"/>
+ <source>&amp;Always do this action</source>
+ <translation>&amp;Toujours effectuer cette action</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="156"/>
+ <source>Put to bottom</source>
+ <translation>Mettre à la fin</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="163"/>
+ <source>Retry</source>
+ <translation>Réessayer</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="170"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Passer</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="177"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="29"/>
+ <source>Error on folder</source>
+ <translation>Erreur sur un dossier</translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="32"/>
+ <source>Folder name</source>
+ <translation>Nom de répertoire</translation>
+ </message>
+</context>
+<context>
+ <name>fileExistsDialog</name>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="14"/>
+ <source>The file exists</source>
+ <translation>Le fichier existe</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>Source</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>Destination</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="82"/>
+ <location filename="../../fileExistsDialog.ui" line="153"/>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>File name</source>
+ <translation>Nom de fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="243"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggérer un &amp;nouveau nom</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="254"/>
+ <source>&amp;Always do this action</source>
+ <translation>&amp;Toujours effectuer cette action</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="274"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="281"/>
+ <source>&amp;Overwrite</source>
+ <translation>&amp;Ecraser</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="291"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Passer</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="298"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="307"/>
+ <source>Overwrite if newer</source>
+ <translation>Ecraser si plus récent</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="312"/>
+ <source>Overwrite if not same modification date</source>
+ <translation>Ecraser si la date de modification est différente</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="102"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copie</translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="112"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copie (%2)</translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>This files are the same file</source>
+ <translation>Ces fichiers sont identiques</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="20"/>
+ <source>The source and destination is same</source>
+ <translation>La source et la destination sont identiques</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="47"/>
+ <source>Size</source>
+ <translation>Taille</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="64"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="81"/>
+ <source>File name</source>
+ <translation>Nom de fichier</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="137"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggérer un &amp;nouveau nom</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="148"/>
+ <source>&amp;Always do this action</source>
+ <translation>&amp;Toujours effectuer cette action</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="168"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="175"/>
+ <source>&amp;Skip</source>
+ <translation>&amp;Passer</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="182"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="87"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copie</translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="97"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copie (%2)</translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>This folders are the same folder</source>
+ <translation>Les répertoires sont identiques</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="34"/>
+ <source>Source</source>
+ <translation>Source</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="50"/>
+ <source>Destination</source>
+ <translation>Destination</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="62"/>
+ <source>The source and destination is same</source>
+ <translation>La source et la destination sont identiques</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="89"/>
+ <location filename="../../folderExistsDialog.ui" line="140"/>
+ <source>Modified</source>
+ <translation>Modifié</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="106"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Folder name</source>
+ <translation>Nom de répertoire</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="200"/>
+ <source>Suggest new &amp;name</source>
+ <translation>Suggérer un &amp;nouveau nom</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="211"/>
+ <source>&amp;Always do this action</source>
+ <translation>&amp;Toujours effectuer cette action</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="218"/>
+ <source>&amp;Rename</source>
+ <translation>&amp;Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="225"/>
+ <source>Merge</source>
+ <translation>Fusionner</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="232"/>
+ <source>Skip</source>
+ <translation>Passer</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="239"/>
+ <source>&amp;Cancel</source>
+ <translation>&amp;Annuler</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="29"/>
+ <source>Folder already exists</source>
+ <translation>Dossier déjà existant</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="85"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copie</translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="95"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copie (%2)</translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui" line="23"/>
+ <source>Transfer the file rights</source>
+ <translation>Transférer les droits des fichiers</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="33"/>
+ <source>Keep the file date</source>
+ <translation>Garder la date du fichier</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="66"/>
+ <source>When folder error</source>
+ <translation>En cas d&apos;erreur de répertoire</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="74"/>
+ <location filename="../../options.ui" line="95"/>
+ <source>Ask</source>
+ <translation>Demander</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="79"/>
+ <location filename="../../options.ui" line="105"/>
+ <source>Skip</source>
+ <translation>Passer</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="100"/>
+ <source>Merge</source>
+ <translation>Fusionner</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="110"/>
+ <source>Rename</source>
+ <translation>Renommer</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="118"/>
+ <source>Check if destination folder exists</source>
+ <translation>Vérifier si le répertoire de destination existe</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="214"/>
+ <source>Block size</source>
+ <translation>Taille de block</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="43"/>
+ <location filename="../../options.ui" line="198"/>
+ <source>KB</source>
+ <translation>Ko</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="56"/>
+ <source>Auto start the transfer</source>
+ <translation>Démmarer automatiquement le transfert</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="87"/>
+ <source>When folder collision</source>
+ <translation>Lors d&apos;une collision de dossier</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="128"/>
+ <source>Checksum</source>
+ <translation>Checksum</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="144"/>
+ <source>Only after error</source>
+ <translation>Seulement après erreur</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="154"/>
+ <source>Ignore if impossible</source>
+ <translation>Ignorer si impossible</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="171"/>
+ <source>Do checksum</source>
+ <translation>Faire un checksum</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="181"/>
+ <source>Enable OS buffer</source>
+ <translation>Activer le buffer de l&apos;OS</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="234"/>
+ <source>Filters</source>
+ <translation>Filtres</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="241"/>
+ <source>Renaming rules</source>
+ <translation>Régles de renommage</translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="255"/>
+ <source>Rsync (only in copy mode)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="191"/>
+ <source>OS buffer only if smaller than</source>
+ <translation>Buffer de l&apos;OS seulement si plus petit que</translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="219"/>
+ <location filename="../../scanFileOrFolder.cpp" line="283"/>
+ <source>%1 - copy</source>
+ <translation>%1 - copie</translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="229"/>
+ <location filename="../../scanFileOrFolder.cpp" line="293"/>
+ <source>%1 - copy (%2)</source>
+ <translation>%1 - copie (%2)</translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="327"/>
+ <source>The folder not exists</source>
+ <translation>Le répertoire n&apos;existe pas</translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="329"/>
+ <source>The folder is not readable</source>
+ <translation>Le répertoire n&apos;est pas lisible</translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/CopyEngine/Rsync/Languages/hi/translation.ts b/plugins-alternative/CopyEngine/Rsync/Languages/hi/translation.ts
new file mode 100644
index 0000000..338cb72
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Languages/hi/translation.ts
@@ -0,0 +1,806 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="28"/>
+ <location filename="../../AvancedQFile.cpp" line="59"/>
+ <location filename="../../AvancedQFile.cpp" line="90"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="42"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="73"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Factory</name>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</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="95"/>
+ <source>All string need match</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="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string match with the regex</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 filter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filter</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="92"/>
+ <location filename="../../Filters.cpp" line="130"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="95"/>
+ <location filename="../../Filters.cpp" line="133"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="98"/>
+ <location filename="../../Filters.cpp" line="136"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="106"/>
+ <location filename="../../Filters.cpp" line="144"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="109"/>
+ <location filename="../../Filters.cpp" line="147"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="115"/>
+ <location filename="../../Filters.cpp" line="153"/>
+ <location filename="../../Filters.cpp" line="215"/>
+ <location filename="../../Filters.cpp" line="254"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1192"/>
+ <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="1199"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1215"/>
+ <source>Problem at the reading, or file size is null</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1222"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1231"/>
+ <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="1240"/>
+ <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="1246"/>
+ <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="1293"/>
+ <source>Some error have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1299"/>
+ <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="62"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="154"/>
+ <location filename="../../ReadThread.cpp" line="316"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="193"/>
+ <location filename="../../ReadThread.cpp" line="373"/>
+ <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="26"/>
+ <source>First renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="32"/>
+ <source>%name% - copy</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="39"/>
+ <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;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment> should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="49"/>
+ <source>Second renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="55"/>
+ <source>%name% - copy (%number%)</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="62"/>
+ <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;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number&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.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>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="61"/>
+ <location filename="../../RmPath.cpp" line="75"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RmPath.cpp" line="85"/>
+ <source>Unable to remove the file</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="312"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="322"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="627"/>
+ <source>The checksums not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="443"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="481"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="260"/>
+ <location filename="../../copyEngine.cpp" line="278"/>
+ <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="289"/>
+ <location filename="../../copyEngine.cpp" line="307"/>
+ <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="521"/>
+ <source>The mode have been forced previously, it&apos;s internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error on 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="56"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="73"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="90"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="136"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="156"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="163"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="170"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="177"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="29"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="32"/>
+ <source>Folder name</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="153"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="243"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="254"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="274"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="281"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="291"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="298"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="307"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="312"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="102"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="112"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="20"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="47"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="64"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="81"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="137"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="148"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="168"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="175"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="182"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="87"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="97"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <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="62"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="89"/>
+ <location filename="../../folderExistsDialog.ui" line="140"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="106"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="200"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="211"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="218"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="225"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="232"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="239"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="29"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="85"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="95"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui" line="23"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="33"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="214"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="43"/>
+ <location filename="../../options.ui" line="198"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="56"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="66"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="74"/>
+ <location filename="../../options.ui" line="95"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="79"/>
+ <location filename="../../options.ui" line="105"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="100"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="110"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="118"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="255"/>
+ <source>Rsync (only in copy mode)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="87"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="128"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="144"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="154"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="171"/>
+ <source>Do checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="181"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="234"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="241"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="191"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="219"/>
+ <location filename="../../scanFileOrFolder.cpp" line="283"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="229"/>
+ <location filename="../../scanFileOrFolder.cpp" line="293"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="327"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="329"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/CopyEngine/Rsync/Languages/id/translation.ts b/plugins-alternative/CopyEngine/Rsync/Languages/id/translation.ts
new file mode 100644
index 0000000..338cb72
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Languages/id/translation.ts
@@ -0,0 +1,806 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="28"/>
+ <location filename="../../AvancedQFile.cpp" line="59"/>
+ <location filename="../../AvancedQFile.cpp" line="90"/>
+ <source>Not supported on this platform</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="42"/>
+ <source>Last modified date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="73"/>
+ <source>Last access date is wrong</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>Factory</name>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</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="95"/>
+ <source>All string need match</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="108"/>
+ <source>The regex is valid</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string match with the regex</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 filter</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filter</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="92"/>
+ <location filename="../../Filters.cpp" line="130"/>
+ <source>Raw text</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="95"/>
+ <location filename="../../Filters.cpp" line="133"/>
+ <source>Simplified regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="98"/>
+ <location filename="../../Filters.cpp" line="136"/>
+ <source>Perl&apos;s regex</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="106"/>
+ <location filename="../../Filters.cpp" line="144"/>
+ <source>Only on file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="109"/>
+ <location filename="../../Filters.cpp" line="147"/>
+ <source>Only on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="115"/>
+ <location filename="../../Filters.cpp" line="153"/>
+ <location filename="../../Filters.cpp" line="215"/>
+ <location filename="../../Filters.cpp" line="254"/>
+ <source>Full match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ListThread</name>
+ <message>
+ <location filename="../../ListThread.cpp" line="1192"/>
+ <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="1199"/>
+ <source>Unable to save the transfer list: %1</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1215"/>
+ <source>Problem at the reading, or file size is null</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1222"/>
+ <source>Wrong header: &quot;%1&quot;</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1231"/>
+ <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="1240"/>
+ <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="1246"/>
+ <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="1293"/>
+ <source>Some error have been found during the line parsing</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ListThread.cpp" line="1299"/>
+ <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="62"/>
+ <source>Unable to create the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>ReadThread</name>
+ <message>
+ <location filename="../../ReadThread.cpp" line="154"/>
+ <location filename="../../ReadThread.cpp" line="316"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../ReadThread.cpp" line="193"/>
+ <location filename="../../ReadThread.cpp" line="373"/>
+ <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="26"/>
+ <source>First renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="32"/>
+ <source>%name% - copy</source>
+ <extracomment>%name% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="39"/>
+ <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;/p&gt;&lt;/body&gt;&lt;/html&gt;</source>
+ <extracomment> should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="49"/>
+ <source>Second renaming</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="55"/>
+ <source>%name% - copy (%number%)</source>
+ <extracomment>%name%, %number% should not be translated</extracomment>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RenamingRules.ui" line="62"/>
+ <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;/p&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;%number%&lt;/span&gt; for the extra number&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.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>RmPath</name>
+ <message>
+ <location filename="../../RmPath.cpp" line="61"/>
+ <location filename="../../RmPath.cpp" line="75"/>
+ <source>Unable to remove the folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../RmPath.cpp" line="85"/>
+ <source>Unable to remove the file</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>TransferThread</name>
+ <message>
+ <location filename="../../TransferThread.cpp" line="312"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="322"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../TransferThread.cpp" line="627"/>
+ <source>The checksums not match</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>WriteThread</name>
+ <message>
+ <location filename="../../WriteThread.cpp" line="443"/>
+ <source>Unable to read the source file: </source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../WriteThread.cpp" line="481"/>
+ <source>File truncated during the read, possible data change</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>copyEngine</name>
+ <message>
+ <location filename="../../copyEngine.cpp" line="260"/>
+ <location filename="../../copyEngine.cpp" line="278"/>
+ <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="289"/>
+ <location filename="../../copyEngine.cpp" line="307"/>
+ <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="521"/>
+ <source>The mode have been forced previously, it&apos;s internal error, please report it</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../copyEngine.cpp" line="795"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileErrorDialog</name>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="14"/>
+ <source>Error on 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="56"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="73"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="90"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="136"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="156"/>
+ <source>Put to bottom</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="163"/>
+ <source>Retry</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="170"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.ui" line="177"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="29"/>
+ <source>Error on folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileErrorDialog.cpp" line="32"/>
+ <source>Folder name</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="153"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="99"/>
+ <location filename="../../fileExistsDialog.ui" line="170"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="116"/>
+ <location filename="../../fileExistsDialog.ui" line="187"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="243"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="254"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="274"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="281"/>
+ <source>&amp;Overwrite</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="291"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="298"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="307"/>
+ <source>Overwrite if newer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.ui" line="312"/>
+ <source>Overwrite if not same modification date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="102"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileExistsDialog.cpp" line="112"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>fileIsSameDialog</name>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="14"/>
+ <source>This files are the same file</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="20"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="47"/>
+ <source>Size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="64"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="81"/>
+ <source>File name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="137"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="148"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="168"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="175"/>
+ <source>&amp;Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.ui" line="182"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="87"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../fileIsSameDialog.cpp" line="97"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>folderExistsDialog</name>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="14"/>
+ <source>This folders are the same folder</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <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="62"/>
+ <source>The source and destination is same</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="89"/>
+ <location filename="../../folderExistsDialog.ui" line="140"/>
+ <source>Modified</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="106"/>
+ <location filename="../../folderExistsDialog.ui" line="150"/>
+ <source>Folder name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="200"/>
+ <source>Suggest new &amp;name</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="211"/>
+ <source>&amp;Always do this action</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="218"/>
+ <source>&amp;Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="225"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="232"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.ui" line="239"/>
+ <source>&amp;Cancel</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="29"/>
+ <source>Folder already exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="85"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../folderExistsDialog.cpp" line="95"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>options</name>
+ <message>
+ <location filename="../../options.ui" line="23"/>
+ <source>Transfer the file rights</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="33"/>
+ <source>Keep the file date</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="214"/>
+ <source>Block size</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="43"/>
+ <location filename="../../options.ui" line="198"/>
+ <source>KB</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="56"/>
+ <source>Auto start the transfer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="66"/>
+ <source>When folder error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="74"/>
+ <location filename="../../options.ui" line="95"/>
+ <source>Ask</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="79"/>
+ <location filename="../../options.ui" line="105"/>
+ <source>Skip</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="100"/>
+ <source>Merge</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="110"/>
+ <source>Rename</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="118"/>
+ <source>Check if destination folder exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="255"/>
+ <source>Rsync (only in copy mode)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="87"/>
+ <source>When folder collision</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="128"/>
+ <source>Checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="144"/>
+ <source>Only after error</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="154"/>
+ <source>Ignore if impossible</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="171"/>
+ <source>Do checksum</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="181"/>
+ <source>Enable OS buffer</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="234"/>
+ <source>Filters</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="241"/>
+ <source>Renaming rules</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../options.ui" line="191"/>
+ <source>OS buffer only if smaller than</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+<context>
+ <name>scanFileOrFolder</name>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="219"/>
+ <location filename="../../scanFileOrFolder.cpp" line="283"/>
+ <source>%1 - copy</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="229"/>
+ <location filename="../../scanFileOrFolder.cpp" line="293"/>
+ <source>%1 - copy (%2)</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="327"/>
+ <source>The folder not exists</source>
+ <translation type="unfinished"></translation>
+ </message>
+ <message>
+ <location filename="../../scanFileOrFolder.cpp" line="329"/>
+ <source>The folder is not readable</source>
+ <translation type="unfinished"></translation>
+ </message>
+</context>
+</TS>
diff --git a/plugins-alternative/CopyEngine/Rsync/Languages/it/translation.ts b/plugins-alternative/CopyEngine/Rsync/Languages/it/translation.ts
new file mode 100644
index 0000000..16adaed
--- /dev/null
+++ b/plugins-alternative/CopyEngine/Rsync/Languages/it/translation.ts
@@ -0,0 +1,806 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!DOCTYPE TS>
+<TS version="2.0" language="it" sourcelanguage="en">
+<context>
+ <name>AvancedQFile</name>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="28"/>
+ <location filename="../../AvancedQFile.cpp" line="59"/>
+ <location filename="../../AvancedQFile.cpp" line="90"/>
+ <source>Not supported on this platform</source>
+ <translation>Non supportato su questa piattaforma</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="42"/>
+ <source>Last modified date is wrong</source>
+ <translation>Ultima modifica è sbagliato</translation>
+ </message>
+ <message>
+ <location filename="../../AvancedQFile.cpp" line="73"/>
+ <source>Last access date is wrong</source>
+ <translation>Ultima data di accesso è sbagliato</translation>
+ </message>
+</context>
+<context>
+ <name>Factory</name>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options error</source>
+ <translation>opzioni di errore</translation>
+ </message>
+ <message>
+ <location filename="../../factory.cpp" line="369"/>
+ <location filename="../../factory.cpp" line="406"/>
+ <source>Options engine is not loaded, can&apos;t access to the filters</source>
+ <translation>Opzioni del motore non viene caricato, non possono accedere ai filtri</translation>
+ </message>
+</context>
+<context>
+ <name>FilterRules</name>
+ <message>
+ <location filename="../../FilterRules.ui" line="33"/>
+ <source>Search:</source>
+ <translation>Cerca:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="43"/>
+ <source>Search type:</source>
+ <translation>Tipo di ricerca:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="51"/>
+ <source>Raw text</source>
+ <translation>testo Raw</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="56"/>
+ <source>Simplified regex</source>
+ <translation>semplificato 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>Applicare su:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="77"/>
+ <source>File</source>
+ <translation>File</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="82"/>
+ <source>Folder</source>
+ <translation>Cartella</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="87"/>
+ <source>File and folder</source>
+ <translation>File e cartelle</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="95"/>
+ <source>All string need match</source>
+ <translation>Tutti stringa bisogno di corrispondere</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="102"/>
+ <source>Checking</source>
+ <translation>Verifica</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="115"/>
+ <source>Test string:</source>
+ <translation>Test stringa:</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="17"/>
+ <source>Filters dialog</source>
+ <translation>Filtri di dialogo</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="108"/>
+ <source>The regex is valid</source>
+ <translation>La regex è valido</translation>
+ </message>
+ <message>
+ <location filename="../../FilterRules.ui" line="125"/>
+ <source>The test string match with the regex</source>
+ <translation>La stringa di test match con la regex</translation>
+ </message>
+</context>
+<context>
+ <name>Filters</name>
+ <message>
+ <location filename="../../Filters.ui" line="14"/>
+ <source>Filters</source>
+ <translation>Filtri</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="30"/>
+ <source>Exclusion filter</source>
+ <translation>Esclusione filtro</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="93"/>
+ <source>Inclusion filter</source>
+ <translation>inclusione filtro</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.ui" line="105"/>
+ <source>None = Include all</source>
+ <translation>Nessuno = Includi tutte le</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="92"/>
+ <location filename="../../Filters.cpp" line="130"/>
+ <source>Raw text</source>
+ <translation>testo Raw</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="95"/>
+ <location filename="../../Filters.cpp" line="133"/>
+ <source>Simplified regex</source>
+ <translation>semplificato regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="98"/>
+ <location filename="../../Filters.cpp" line="136"/>
+ <source>Perl&apos;s regex</source>
+ <translation>Perl&apos;s regex</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="106"/>
+ <location filename="../../Filters.cpp" line="144"/>
+ <source>Only on file</source>
+ <translation>Solo su file</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="109"/>
+ <location filename="../../Filters.cpp" line="147"/>
+ <source>Only on folder</source>
+ <translation>Solo sulla cartella</translation>
+ </message>
+ <message>
+ <location filename="../../Filters.cpp" line="115"/>
+ <location filename="../../Filters.cpp" line="153"/>
+ <location filename="../../Filters.cpp" line="215"/>
+ <location filename="../../Filters.cpp" line="254"/>
+ <source>Full match</source>
+ <translation>partita completa</translation>
+ </message>
+</context>
+<context&